SpringAI的使用

第一:引入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 转换器,

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
周华的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容