第一:引入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告诉模型,提供了什么工具,@ToolParam告诉大模型该工具需要什么参数
    @Tool(description = "姓名查询")
    public String test(@ToolParam(description = "名称") String name){
        return name+":"+new Date();
    }
}
2、注入该工具Bean,并在调用回话时将该bean加入到chatClient对象当中
Tool的幻觉:防止大模型为了强行适配工具参数,而造一些假的信息。对于参数的描述进行限制;程序进行限制;从提示词方面限制
Tool中的参数:参数名称要有意义,不能随便起名字
Tool的鉴权:使用springsecurity进行鉴权;将Tool和资源一起存储,动态设置Tool

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转换器,

本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:[email protected]