实现外挂知识库基本就是给AI喂系统消息。或者以固定格式限制住AI的乱来。
spring:
application:
name: boot3-ai
ai:
ollama:
base-url: http://localhost:11434
chat: # 聊天模型,用于对话聊天
options:
model: deepseek-r1:32b
temperature: 0.3 #0-2 越大越随机乱来
embedding: #嵌入模型(用于向量数据库数据解析)
options:
model: mxbai-embed-large # 默认嵌入模型
init:
embedding:
additional-models:
- mxbai-embed-large # 添加嵌入模型初始化检测
chat:
additional-models:
- deepseek-r1:32b
pull-model-strategy: when_missing
vectorstore:
qdrant:
host: localhost
port: 6334
use-tls: false
api-key: your-super-secret-api-key-2025
collection-name: qdrant-collection-name
initialize-schema: true # 自动创建collection,建议开启
核心代码部分
@Resource
VectorStore vectorStore;
@Resource
ChatModel chatModel;
public Flux<ChatResponse> chatStream(String query) {
log.info("query: {}", query);
//手动从向量库查询结果
SearchRequest searchRequest = SearchRequest.builder()
.query(query)
.topK(5)
.similarityThreshold(0.6)
.build();
List<Document> documents = vectorStore.similaritySearch(searchRequest);
log.info("从资料库找到{}个相关文档",documents.size());
String context = documents.isEmpty()
? "未检索到相关信息。" //注意这里如果直接返回空字符串则会导致限制失效,AI回去查自己的内置知识库回答问题。所以必须设置没有搜索到的提示词
: documents.stream()
.map(doc -> "来源: " + doc.getMetadata().get("source") + "\n内容: " + doc.getText())
.collect(Collectors.joining("\n\n"));
log.info("资料库文档信息: {}", context);
String systemMessageContent = """
# 角色设定
你是一名专业的企业智能客服,负责为客户提供准确、可靠、礼貌的咨询服务,你目前服务于XQLEE科技俱乐部
# 回答规则
1. 你的所有回答必须严格基于提供的知识库内容,不得脱离知识库信息自行发挥。
2. 当知识库中包含足够信息时,请根据内容给出简洁、清晰、专业的回答。
3. 如果用户问题属于以下两类,请按规则处理:
a) **通用交互**(如:你好、在吗、你是谁、你能做什么等):
- 直接友好回应,无需依赖知识库。
- 示例:
- 用户问“你是谁”,回答“我是本企业的智能客服,可以为您解答相关问题。”
- 用户问“你好”,回答“您好!很高兴为您服务。”
b) **业务问题**(如:订单、产品、售后等):
- 必须严格基于知识库内容回答。
- 若知识库中无相关信息,请**仅回复**:
我目前无法回答这个问题
4. 当知识库和角色设定中无相关信息,或信息不足以完整、准确回答问题时,请直接回复:“我目前无法回答这个问题”。
5. 禁止猜测、编造、推断答案,确保回答的严谨性和可信度。
# 行为要求
- 使用礼貌、正式、专业的语言。
- 回答应聚焦问题,避免冗余信息。
- 始终遵守知识边界,不越界回答。
# 执行指令
请严格按照以上规则响应用户提问。
# 知识库返回内容
%s
""".formatted(context);
Prompt prompt = new Prompt(List.of(
// 1. 核心 SystemMessage:定义角色 + 注入检索到的知识
new SystemMessage(systemMessageContent), // ✅ 注入知识
// 2. UserMessage:用户的实际问题
new UserMessage(query)
// 注意:这里没有 AssistantMessage,因为这是新问题
));
return chatModel.stream(prompt);
}
除开前面的通用依赖,使用spring ai 1.0.1集成方案还需要添加以下依赖
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-advisors-vector-store</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-rag</artifactId>
</dependency>
顾问模式 该方案为spring 官方文档
参考连接 https://docs.spring.io/spring-ai/reference/api/retrieval-augmented-generation.html
特别说明1:
模板里面的变量 {
context
} {query
} 是固定的,源码里面写死的,一般是根据Advisor实现的before方法去找。
特别说明:
allowEmptyContext
这个项目不要配置true ,让他默认false,关键代码参考下图
emptyContextPromptTemplate
这个查询为空的模板必须自己配置,默认是个英文会导致部分大模型使用英文回复。
自己模板建议就是前面普通模板自己把参数设置进去就行。
https://blog.xqlee.com/article/2509051418176514.html