SpringAI
约 953 字大约 3 分钟
SpringAI
功能 | Spring AI | LangChain4j |
---|---|---|
Chat | 支持 | 支持 |
Function | 支持 | 支持 |
RAG | 支持 | 支持 |
对话模型 | 15+ | 15+ |
向量模型 | 10+ | 15+ |
向量数据库 | 15+ | 20+ |
多模态模型 | 5+ | 1 |
JDK | 17 | 8 |
1.2 Spring Al的主要功能
·第一、对主流 A1大模型供应商提供了支持,比如:0penAl、Deepfeek、Microsoft、Ollama、Amazon、Google HuggingFace等。
第二、支持AI大模型类型包括:聊天、文本到图像、文本到声音等。
第三、支持主流的Embedding Models(嵌入模型)和向量数据库,比如:Azure Vector Search.
Chroma、Milvus、Neo4j、Redis、Pinecone、PostgreSQL/PGVector 等。
第四、 把 A 大模型输出映射到简单的Java 对象(POJOS)上。
第五、支持了函数调用(Function caling)功能。@
第六、为数据工程提供 ETL(数据抽取、转换和加载)框架
第七、支持 Spring Boot 自动配置和快速启动,便于运行 A1 模型和管理向量库。
对话机器人-快速入门
引入依赖
配置模型
配置客户端
from openai import OpenAI
# 1.初始化0penAI客户端
clien = OpenAI(
api_key="<DeepSeek API Key>",
base_url="https://api.deepseek.com")
#2.发送http请求到大模型
response =client.chat.completions.create(
model="deepseek-r1",
temperature=0.7,
messages=[
{"role":"system","content":"你是一个热心的AI助手,你的名字叫小团团"},{"role":"user","content":"你好,你是谁?"},
],
stream=False
)
#3.打印返回结果
print(response.choices[0].message.content)
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>${sprlg-ai.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
</dependency>
spring:
ai:
ollama:
base-url:http://localhost:11434chat :
model: deepseek-rl:7b
spring:
ai :
openai:
base-url:https://dashscope.aliyuncs.com/compatible-mode
api-key: ${OPENAI_API_KEY}
chat:
options:
model:qwen-max # 模型名称
temperature:0.8 # 模型温度,值越大,输出结果越随机:
@Bean
public ChatClient chatclient(0llamachatModel model){
return ChatClient.builder(model).defaultsystem("你是可爱的助手,名字叫小团团").build();
}
String content =chatClient.prompt().user("你是谁?").call().content();
Flux<String>content = chatClient.prompt().user("你是谁?").stream().content();
@RequestMapping(value = "/chat",produges = "text/event-stream")
public Flux<string> chat(string prompt){
return chatClient.prompt().user(prompt).stream().content();
}
对话机器入-会话白志
SpringAI利用AOP原理提供了AI会话时的拦截、增强等功能,也就是Advisor。
@Bean
public chatClient chatclient(0llamachatModel model){
return ChatClient.builder(model)// 创建chatclient工厂实例
.defaultSystem("你是可爱的小助手,名字叫小团团。")
.defaultAdvisors(new SimpleLoggerAdvisor())//配置日志
.Advisorbuild();//构建ChatClient实例
}
logging:
level:
org.springframework.ai.chat.client.advisor: debug
com.itheima.ai: debug
对话机器人-会话记忆
大模型是不具备记忆能力的,要想让大模型记住之前聊天的内容,唯一的办法就是把之前聊天的内容与新的提示词一起发给大模型。
from openai import OpenAI
#1.初始化0penAI客户端
client = 0penAI(
api_key="<DeepSeek API Key>"
base url="https://api.deepseek.com")
# 2.发送http请求到大模型
response =client.chat.completions.create(
model="deepseek-r1",
temperature=0.7,
messages=[{"role":"system","content":"你是一个热心的AI助手,你的名字叫小团团"},
{"role": "user",,"content":"你好,你是谁?",}]
,stream=False
)
print(response)
角色 | 描述 | 示例 |
---|---|---|
system | 优先于 user 指令之前的指令,也就是给大模型设定角色和任务背景的系统指令 | 你是一个乐于助人的编程助手,你的名字叫小团团,请以小团团的风格来回答用户的问题。 |
user | 终端用户输入的指令(类似于你在 ChatGPT 聊天框输入的内容) | 你好,你是谁? |
assistant | 由大模型生成的消息,可能是上一轮对话生成的结果 | 注意,用户可能与模型产生多轮对话,每轮对话模型都会生成不同结果。 |
定义会话存储方式
public interface ChatMemory{
void add(String conversationId,List<Message> messages);
List<Message>get(String conversationId, int lastN);
void clear(String conversationId);
}
@Bean
public ChatMemory chatMemory(){
return new InMemoryChatMemory()
}
配置会话记忆Advisor
@Bean
public chatclient chatclient(0llamaChatModel model){
return ChatClient.builder(model)
.defaultSystem("你是可爱的助手,名字叫小团团")
.defaultAdvisors(
new SimpleLoggerAdvisor(),
new MessageChatMemoryAdvisor(chatMemory)# 设置
).
build()
}
添加会话id
Flux<String>content = chatClient.prompt()
.user("你好,我叫小明").abisors(a ->a.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId)).stream().content();