Spring AI与大模型Ollama如何集成整合?

news/2024/4/24 16:38:39/文章来源:https://blog.csdn.net/cfy_banq/article/details/136442194

Python 是进入人工智能领域(认为是机器学习或生成人工智能AIGC)的主要武器,Java 和 Spring 仍引领着大多数开发社区, Java 开发人员如何与 LLM大模型 一起工作?这就是 Spring AI 弥补差距的地方。

Spring AI在 Spring 应用程序和可以在本地运行的 LLM 之间创建集成,这为所有 Java 开发人员提供了开发人工智能应用程序的能力。

在本文中,我们将了解如何使用 Ollama 在本地运行大模型,我们将考虑四个方面。

  1. 本地安装并运行 Ollama 和 LLM
  2. 创建SpringAI项目并详细查看项目配置。
  3. 访问本地嵌入。
  4. 访问本地聊天模型。

安装并运行 Ollama
导航至https://ollama.com/download下载适用于特定操作系统的 ollama。

下载 ollama 后,打开终端并输入以下命令以提取 LLM 并在本地运行它们。
ollama run llama2 # pulls llama2 LLM model
ollama run mistral # pulls and runs mistral LLM

创建 Spring AI 项目
如果你使用任何集成开发环境(我使用的是 IntelliJ)或基于 Web 的 Spring Intializr,那么你可以看到现在可以直接从 Spring Intializr 添加 AI 依赖项。在本例中,我们将添加 Ollama。在执行此步骤之前,请按照步骤 1 确保已安装 Ollama 并在本地运行。

让我们深入研究一下 application.yaml,看看与 ollama 有关的不同项目配置。

spring:
ai:
ollama:
embedding:
model: "llama2" options:
temperature: 0.5
top-p: 0.2
top-k: 2
num-g-p-u: 1 enable metal gpu on MAC
base-url: "http://localhost:11434"

有关嵌入和聊天模型的更多配置可分别在这里 here 和这里here 找到。请注意一点,Spring 默认配置可与 Mistral LLM 配合使用,但我们已明确用 llama2 替代。

实体记录
首先,我们将创建两个记录:Payload 和 Response,名称更加直观。

package org.vaslabs.springai2.records;

public record Payload(String strings) {
}
package org.vaslabs.springai2.records;

import java.util.List;

public record Response(List data) {
}

服务类
现在让我们创建一个服务类,它将帮助我们为给定的输入字符串生成嵌入结果。

import org.springframework.ai.embedding.EmbeddingClient;
import org.springframework.ai.embedding.EmbeddingRequest;
import org.springframework.ai.embedding.EmbeddingResponse;
import org.springframework.ai.ollama.api.OllamaOptions;
import org.springframework.stereotype.Service;
import org.vaslabs.springai2.records.Payload;

import java.util.List;
import java.util.Map;

@Service
public class OllamaEmbeddingsGenerator {
private final EmbeddingClient embeddingClient;

    public OllamaEmbeddingsGenerator(EmbeddingClient embeddingClient) {
this.embeddingClient = embeddingClient;
}

    public EmbeddingResponse getEmbeddingsWithModelOverride(Payload payload) {
return this.embeddingClient.call(new EmbeddingRequest(
List.of(payload.strings()),
OllamaOptions.create().withModel("mistral")));
}

    public Map<String, EmbeddingResponse> getEmbeddingsWithDefaultModel(Payload payload) {
EmbeddingResponse embeddingResponse = this.embeddingClient.embedForResponse(
List.of(payload.strings()));
return Map.of("embedding", embeddingResponse);
}
}

上述 OllamaEmbeddingsGenerator 类定义在 Spring 应用程序的 org.vaslabs.springai2.service 包中,是生成文本嵌入的服务组件。它利用 Spring AI 框架的嵌入式客户端(EmbeddingClient)将文本数据转换为嵌入式,即在自然语言处理任务中非常有用的向量表示。

该服务配备了两个主要方法:getEmbeddingsWithModelOverride 和 getEmbeddingsWithDefaultModel。

  • 前一种方法允许指定用于嵌入生成的模型(例如 "mistral"),从而可以根据请求自定义行为。

  • 后一种方法则使用客户端的默认模型设置生成嵌入。这两种方法的操作方式都是获取一个 Payload 对象(该对象封装了要嵌入的字符串),并以不同的格式返回嵌入结果--在 getEmbeddingsWithModelOverride 的情况下直接返回 EmbeddingResponse,而在 getEmbeddingsWithDefaultModel 的情况下返回一个包含 EmbeddingResponse 的映射。

这种设计封装了与嵌入式生成技术交互的复杂性,并为应用程序中的各种嵌入式生成需求提供了灵活的应用程序接口。

让我们再了解一项有助于创建聊天一代的服务。

import org.springframework.ai.ollama.OllamaChatClient;
import org.springframework.stereotype.Service;

import java.util.Map;

@Service
public class OllamaChatGenerator {

    private final OllamaChatClient ollamaChatClient;

    public OllamaChatGenerator(OllamaChatClient ollamaChatClient) {
this.ollamaChatClient = ollamaChatClient;
}

    public Map generate(String message) {
return Map.of("generation", this.ollamaChatClient.call(message));
}
}

  • 上述 Java 类 OllamaChatGenerator 定义在 org.vaslabs.springai2.service 包中,设计为 Spring 服务,通过利用 Spring AI 框架中的 OllamaChatClient 来促进聊天交互。

  • 该服务使用 @Service 注解进行 Spring 组件扫描,封装了一种简单而有效的方法来生成聊天响应。

  • 通过构造函数实例化后,它会接收一个 OllamaChatClient 对象,从而建立起与底层聊天模型或服务通信的依赖关系。

  • 该服务的主要功能通过 generate 方法公开,该方法接受字符串消息作为输入,并返回一个包含以 "generation "为关键字的聊天生成结果的映射。

这种设置抽象化了与人工智能驱动的聊天功能进行交互的复杂性,为 Spring 应用程序的其他组件提供了一种直接的方法,可根据用户输入生成动态的对话式响应。

控制器
现在是为上述两个服务编写控制器的时候了,它们可以分别处理终端用户的请求。这些控制器将帮助我们选择用户所需的功能。

import org.springframework.ai.embedding.Embedding;
import org.springframework.ai.embedding.EmbeddingResponse;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.vaslabs.springai2.records.Payload;
import org.vaslabs.springai2.records.Response;
import org.vaslabs.springai2.service.OllamaEmbeddingsGenerator;

import java.util.Map;

@RestController
@RequestMapping("/api/v1")
public class OllamaEmbeddingController {

    private final OllamaEmbeddingsGenerator ollamaEmbeddingsGenerator;

    public OllamaEmbeddingController(OllamaEmbeddingsGenerator ollamaEmbeddingsGenerator) {
this.ollamaEmbeddingsGenerator = ollamaEmbeddingsGenerator;
}
@PostMapping(value = "/embedding1", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity fetchEmbeddings1(@RequestBody Payload payload){
Embedding embedding = this.ollamaEmbeddingsGenerator.getEmbeddingsWithModelOverride(payload).getResult();
return ResponseEntity.ok( new Response(embedding.getOutput()));
}

    @PostMapping(value = "/embedding2", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Map<String, EmbeddingResponse>> fetchEmbeddings2(@RequestBody Payload payload){
Map<String, EmbeddingResponse> embedding = this.ollamaEmbeddingsGenerator.getEmbeddingsWithDefaultModel(payload);
return ResponseEntity.ok(embedding);
}
}

import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.vaslabs.springai2.records.Payload;
import org.vaslabs.springai2.service.OllamaChatGenerator;

import java.util.Map;

@RestController
@RequestMapping("/api/v1")
public class OllamaChatController {

    private final OllamaChatGenerator ollamaChatGenerator;

    public OllamaChatController(OllamaChatGenerator ollamaChatGenerator) {
this.ollamaChatGenerator = ollamaChatGenerator;
}

    @PostMapping(value = "/chat", produces = MediaType.APPLICATION_JSON_VALUE)
public Map chat(@RequestBody Payload payload){
return this.ollamaChatGenerator.generate(payload.strings());
}
}

如果上述代码和配置都没有问题,那么我们就可以运行该项目了(需要注意的是,请确保在本地运行 ollama)。

查看 OllamaEmbeddingController 的路由 /embedding1 和 /embedding2 非常有趣,第一个路由通过在服务中以编程方式覆盖模型的配置来使用 Mistral 模型,而后一个路由则使用 application.yaml 中的默认配置。

结论
总之,将 Ollama 与 Spring AI 结合使用,是将先进的大型语言模型 (LLM) 直接集成到应用程序中的令人信服的解决方案,可提供嵌入和文本生成功能。借助 Ollama 在本地运行 LLM 的能力,开发人员可以对人工智能驱动的功能获得前所未有的控制力和灵活性,确保数据隐私并减少延迟。

Spring AI 通过 OllamaEmbeddingClient 和 OllamaChatClient 对 Ollama 的支持简化了集成过程,在 Spring 生态系统中实现了无缝嵌入生成和对话式人工智能功能。这种组合不仅使最先进的人工智能技术的使用更加平民化,而且还增强了应用程序的可扩展性和响应能力,使其成为希望集成智能、上下文感知交互和数据处理功能的开发人员的理想选择。

https://www.jdon.com/72804.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_996787.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue.js+SpringBoot开发天然气工程运维系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统角色分类2.2 核心功能2.2.1 流程 12.2.2 流程 22.3 各角色功能2.3.1 系统管理员功能2.3.2 用户服务部功能2.3.3 分公司&#xff08;施工单位&#xff09;功能2.3.3.1 技术员角色功能2.3.3.2 材料员角色功能 2.3.4 安…

[c++] 模板

c 中的模板通过将类型参数化&#xff0c;可以提高代码的复用性。模板并不能减少代码量&#xff0c;只是从开发者的角度来看&#xff0c;代码量减少了&#xff0c;复用性提高了&#xff1b;从二进制文件的角度看&#xff0c;代码量没有减小。 1 函数模板 当求两个数的和时&…

PowerBI怎么修改数据库密码

第一步&#xff1a;点击转换数据 第二步&#xff1a;点击数据源设置 第三步&#xff1a;点击编辑权限 第四步&#xff1a;点击编辑 第五步&#xff1a;输入正要修改的密码就可以了

分享几种简约大方的ListView外观设计(qml)

一、前言 最近才学到这里&#xff0c;感觉基础的 ListView 很丑&#xff0c;就现学现用弄个几个自认为还行的设计给大家献丑了。如果你觉得还不错&#xff0c;代码就在下面拿去直接用&#xff0c;顺便给我点个赞哈 ~ 感谢感谢 ~ 二、正文 设计1 第一种就是正常的左侧边栏&am…

LabVIEW管道缺陷智能检测系统

LabVIEW管道缺陷智能检测系统 管道作为一种重要的输送手段&#xff0c;其安全运行状态对生产生活至关重要。然而&#xff0c;随着时间的推移和环境的影响&#xff0c;管道可能会出现老化、锈蚀、裂缝等多种缺陷&#xff0c;这些缺陷若不及时发现和处理&#xff0c;将严重威胁到…

QGIS3.34官方版本已经不能支持Win7,如果需要在WIN7上使用,请用微云上我打包的

在网上看到有些网友在WIN7上安装官方发布的QGIS安装&#xff0c;会遇到上述问题&#xff0c;而不能正常运行&#xff01; 我打包的QGIS可以在WIN7上正常运行&#xff0c;这个我专门测试过。 详见&#xff1a; 打包了一个QGIS3.34分享给大家 下载地址&#xff1a;文件分享 软…

算法学习:双指针学习--左右指针

一&#xff1a;课前讲解 在处理数组和链表相关问题时&#xff0c;双指针技巧是经常用到的&#xff0c;双指针技巧主要分为两类&#xff1a;左右指针和快慢指针。 对于单链表来说&#xff0c;大部分技巧都属于快慢指针&#xff0c;在数组中并没有真正意义上的指针&#xff0c;但…

LeetCode # 547. 省份数量

547. 省份数量 题目 有 n 个城市&#xff0c;其中一些彼此相连&#xff0c;另一些没有相连。如果城市 a 与城市 b 直接相连&#xff0c;且城市 b 与城市 c 直接相连&#xff0c;那么城市 a 与城市 c 间接相连。 省份 是一组直接或间接相连的城市&#xff0c;组内不含其他没有…

wsl 安装 ubuntu

文章目录 打开Windows PowerShell查看可安装的ubuntu安装相对应的ubuntu将用户添加到sudoers文件中&#xff0c;并赋予了该用户sudo权限。 打开Windows PowerShell 以管理员的身份运行 查看可安装的ubuntu wsl.exe --list --online安装相对应的ubuntu wsl --install 版本…

Qt for WebAssembly : Application exit (SharedArrayBuffer is not defined)

用Qt开发 WebAssembly&#xff0c;放到nginx里面&#xff0c;用127.0.0.1访问没问题&#xff0c;用局域网IP访问就提示如下&#xff1a; 总结了以下两种解决办法&#xff1a; ①&#xff1a;配置 nginx http 头 [ 支持&#xff1a;WebAssembly Qt (single-threaded) ] ②&#…

汉诺塔问题(C语言)

一&#xff1a;问题 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从…

Ubuntu环境配置-LinuxQQ篇

本教程下载Linux QQ的版本是linuxqq_3.0.0-571_amd64.deb 一、下载LinuxQQ 直接使用wget命令下载链接&#xff0c;下载文件 wget https://dldir1.qq.com/qqfile/qq/QQNT/c005c911/linuxqq_3.0.0-571_amd64.deb 二、安装LinuxQQ 当下载完成后&#xff0c;运行命令&#xff1a;…

【计算机网络笔记】1.概论

【计算机网络笔记】1.概论 前言: 计算机网络概论学习过程中,我感觉它就是在问一个问题: 计算机之间如何实现高效通信? 计算机网络的名词解释 重要基本特点 1.连通性 2.资源共享计算机网络的组成 由若干节点node和连接这些节点的链路link组成。节点可以是计算机、集线器、交换…

供应链管理(SCM):界面设计全面扫盲,得供应链者得天下

大家伙&#xff0c;我是大千UI工场&#xff0c;专注UI分享和项目接单&#xff0c;本期带来供应链系统的设计分享&#xff0c;欢迎大家关注、互动交流。 一、什么是SCM SCM系统是供应链管理&#xff08;Supply Chain Management&#xff09;系统的缩写。供应链管理是指协调和管…

openEuler全球生态合作研讨会:共话全球技术创新,共建国际产业生态

2024年2月27日&#xff0c;OpenAtom openEuler&#xff08;简称“openEuler”&#xff09;全球生态合作研讨会在西班牙巴塞罗那成功举办。开放原子开源基金会副秘书长辛晓华先生&#xff0c;开放原子开源基金会开源安全委员会副主席任旭东先生&#xff0c;Eclipse基金会首席会员…

linux安装openGauss数据库

这里写自定义目录标题 linux安装openGauss数据库openGauss 安装与配置传统安装docker安装 linux安装openGauss数据库 openGauss是一款华为开源的关系型数据库管理系统&#xff0c;它具有多核高性能、全链路安全性、智能运维等企业级特性。 openGauss内核早期源自开源数据库Po…

VMware虚拟机安装Linux教程(超详细)

目录 一、安装VMware VMware下载&#xff08;16 pro&#xff09;&#xff1a; 镜像文件&#xff08;不一定选择CentOS&#xff0c;只是为了有图形界面更好的操作)​ 安装VMware 安装虚拟机 第一步&#xff1a;点击创建新的虚拟机。​ 第二步&#xff1a;选择自定义 &…

2024电子商务与互联网技术国际会议(ICECIT 2024)

2024电子商务与互联网技术国际会议&#xff08;ICECIT 2024) 一、【会议简介】 2024电子商务与互联网技术国际会议&#xff08;ICECIT 2024&#xff09;将于2024年在杭州举行。这是一个重要的学术会议&#xff0c;旨在汇集全球的专家、学者和业界领袖&#xff0c;共同探讨电子…

VS2022打包C#安装包(最新、最全)

开发c#的一个小工具到打包环境碰壁了&#xff0c;在网上找了很多资料耶踩了很多坑&#xff0c;耗时1hour才打包完毕&#xff0c;避免以后碰到类似的问题再次记录&#xff0c;自认为步骤比较全面&#xff0c;如果有帮助麻烦点个赞呗&#xff01;&#xff01;&#xff01; 一、Mi…

实现vue elmentUI图片本地上传

实现思路 后端代码 //上传头像PostMapping("/uplaod")public String upload(MultipartFile file) { // System.out.println(file"图片上次");//图片校验if (file.isEmpty()) {return "图片上传失败";}//可以自己加一点校验 例如上传的是不…