第一:引入SpringAI依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope> #技术分享
</dependency>
</dependencies>
</dependencyManagement>
二、通过使用ollama来调用模型
1、使用ollama引入以下依赖:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-ollama</artifactId>
<version>1.0.0</version>
</dependency>
2、客户端api
对话模型类:OllamaChatModel; Ollama 属性配置类:OllamaOptions
关闭思考模式:在 SpringAI1.0之前通过在提示词后面添加 no_think 方式关闭:OllamaChatModel.call(“你是谁?/no_think”)
流式输出:OllamaChatModel.stream(“你是谁?/no_think”)
通用客户端 api:ChatClient,获取 ChatClient 的方式:
方式一:通过默认的构造器获取:ChatClient.Builder().build;
方式二:通过制定 chatModel 来获取,ChatClient.builder(chatModel).build;
3、提示词
提示词类型: user(用户)、Assistant(AI 回复)、system(系统)、Tool(工具)等
提示词模板:通过 system()或者 defaultSystem()方法设置系统提示词;若提示词模板中有动态的变化的参数,使用占位符{参数名}来表明,通过 chatClient 的 system()方法来传递参数值;
用户提示词中有动态变化的参数,使用占位符{参数名}来表明,通过 chatClient 的 user()方法来传递参数值;
提示词内容较多时,可使用提示词模板文件:xxx.st 文件,加载提示词文件:
@Value("classpath:提示词文件路径")
private org.springframework.core.io.Resource txtResource;
4、拦截器(Advisor):
已有内置的 Advisor:SimpleLogAdvisor,SafeGuardVisor 等;自定义 Advisor,使用 BaseAdvisor
5、大模型记忆
一、多轮对话实现,每次将上次的问题和回复都记录下来,在下次时传递。SpringAI 中使用 ChatMemory 接口实现,默认存储在内存当中,chatMemory 对象默认需要手动创建,通过 MessageWindowChatMemory 创建;若要通过 Spring 自动维护引入以下依赖,以及使用 MessageChatMemoryAdvisor 或者 PromptChatMemoryAdvisor 拦截器:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-autoconfigure-model-chat-memory</artifactId>
<version>1.0.0</version>
</dependency>
记录聊天记录的最大数量,不提议太长,默认20条,淘汰策略;先进先出 多用户隔离:设置唯一标识,通过
ChatMemory.CONVERSATION_ID 属性 其他存储方式:数据库存储,redis 存储(alibaba-ai 有现成的),要使用第三方存储方式,需要引入对应依赖,例如:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-model-chat-memory-repository-jdbc</artifactId>
<version>1.0.0</version>
</dependency>
多层记忆架构(模仿人类):近期记忆(保留窗口最近的几轮对话,通过 ChatMeomry),中期记忆(通过 RAG 检索对话历史),长期记忆(关键信息的固化总结,通过定时任务,使用大模型提取关键信息;关键点实时提取)
格式化输出:在 Call()方法链后,使用 ChatClient 的 entity()方法,指定结果类型
6、Tools
1、声明工具
@Component
public class AiTool {
@Tool(description = "姓名查询") public String test(@ToolParam(description = "名称") String name){ return name+":"+new Date(); } } 2、注入该工具 Bean,并在调用回话时将该 bean 加入到 chatClient 对象当中 Tool 的幻觉:防止大模型为了强行适配工具参数,而造一些假的信息。对于参数的描述进行限制;程序进行限制;从提示词方面限制 Tool 中的参数:参数名称要有意义,不能随意起名字 Tool 的鉴权:使用 springsecurity 进行鉴权;将 Tool 和资源一起存储,动态设置 Tool
C 7、MCP
将公共的 tools 抽取出来,进行分布式部署的外部工具服务
MCP 的传输方式:SSE;Streamable(长连接):面向服务,支持高并发;stdio(标准输入输出):面向个人用户的应用,在本地运行 springAI 中使用 MCP
<!-- 添加Spring AI MCP starter依赖 以下既支持sse又支持stdio-->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-client-webflux</artifactId>
<version>1.0.0</version>
</dependency>
配置 mcp 信息 spring.ai.mcp.client.request-timeout=60000 #mcp 配置文件信息 spring.ai.mcp.client.stdio.servers-configuration=classpath:/mcp-server-config.json
# 开启mcp日志
logging.level.io.modelcontextprotocol.client=debug
logging.level.io.modelcontextprotocol.spec=debug
json文件内容:
{
"mcpServers": {
"baidu-map": {
"command": "cmd",
"args": [
"/c",
"npx",
"-y",
"@baidumap/mcp-server-baidu-map"
],
"env": {
"BAIDU_MAP_API_KEY": "API_KEY"
}
}
}
}
8、RAG(检索增强)
向量:一般用来做类似性搜索;向量化:使用向量模型;
SpringAi 中的 API:
1、VectorStore:查询和向量化文本
2、ChatClient 使用 VectorStore;通过 Advisor 添加:QuestionAnswerAdvisor
3、文档读取器:springAI 和 springAIalibaba 提供了许多文本器:TextReader、JsonReader 等。对于 pdf,markdown 等文本需要额外引入依赖
4、文档分割器:TokenTextSpliter、TextSplitter、SentenceSpliter
5、分块经验实践:短文本–句子级分块,论文–段落级分块,法律合同–条款,小说–章节等
6、KeywordMetadataEnricher:标签提取器,SummaryMetadataEnricher:提取上一篇,当前,下一篇文档的摘要,作用:通过这些元数据过滤数据
7、检索增强器
:RetrievalAugmentationAdvisor;查询重写转换器:RewriteQueryTransformer;翻译转换器
:TranslationQueryTransformer
8、rerank(重排序):粗排+精排,粗排,按照正常的顺序去检索,topk 给一个较大的值(提议200),精排时调用重排序模型进行排序,其 topK 可以使用默认的值(5)。使用 SpringAialibaba 提供的 RetrievalRerankAdvisor 转换器,















暂无评论内容