连锁酒店免安装绿色中文版
746M · 2025-11-05
<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>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-ollama</artifactId>
<version>1.0.0</version>
</dependency>
对话模型类: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;
提示词类型: user(用户)、Assistant(AI回复)、system(系统)、Tool(工具)等
提示词模板:通过system()或者defaultSystem()方法设置系统提示词;若提示词模板中有动态的变化的参数,使用占位符{参数名}来表示,通过chatClient的system()方法来传递参数值;
用户提示词中有动态变化的参数,使用占位符{参数名}来表示,通过chatClient的user()方法来传递参数值;
提示词内容较多时,可使用提示词模板文件:xxx.st文件,加载提示词文件:
@Value("classpath:提示词文件路径")
private org.springframework.core.io.Resource txtResource;
已有内置的Advisor:SimpleLogAdvisor,SafeGuardVisor等;自定义Advisor,使用BaseAdvisor
一、多轮对话实现,每次将上次的问题和回复都记录下来,在下次时传递。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()方法,指定结果类型
1、声明工具
@Component
public class AiTool {
//@Tool告诉模型,提供了什么工具,@ToolParam告诉大模型该工具需要什么参数
@Tool(description = "姓名查询")
public String test(@ToolParam(description = "名称") String name){
return name+":"+new Date();
}
}
2、注入该工具Bean,并在调用回话时将该bean加入到chatClient对象当中
Tool的幻觉:防止大模型为了强行适配工具参数,而造一些假的信息。对于参数的描述进行限制;程序进行限制;从提示词方面限制
Tool中的参数:参数名称要有意义,不能随便起名字
Tool的鉴权:使用springsecurity进行鉴权;将Tool和资源一起存储,动态设置Tool
将公共的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"
}
}
}
}
向量:通常用来做相似性搜索;向量化:使用向量模型;
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转换器,