Spring AI 高级RAG功能实现:查询翻译、上下文感知

This commit is contained in:
huangge1199 2025-05-26 14:42:20 +08:00
parent 94dac544e2
commit 77ef26470a
3 changed files with 70 additions and 22 deletions

View File

@ -16,4 +16,8 @@ public interface RagService {
List<Query> getMultiQueryExpand(String question);
String queryRewrite(String question);
String queryTranslation(String question);
String contextAwareQueries(String question);
}

View File

@ -6,11 +6,14 @@ import com.huangge1199.aiagent.rag.MyMultiQueryExpander;
import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.QuestionAnswerAdvisor;
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.rag.Query;
import org.springframework.ai.rag.preretrieval.query.expansion.MultiQueryExpander;
import org.springframework.ai.rag.preretrieval.query.transformation.CompressionQueryTransformer;
import org.springframework.ai.rag.preretrieval.query.transformation.QueryTransformer;
import org.springframework.ai.rag.preretrieval.query.transformation.RewriteQueryTransformer;
import org.springframework.ai.rag.preretrieval.query.transformation.TranslationQueryTransformer;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.stereotype.Service;
@ -36,35 +39,21 @@ public class RagServiceImpl implements RagService {
@Override
public String localDoc(String question) {
return chatClient.prompt()
.user(question)
.advisors(new MyLoggerAdvisor())
.advisors(new QuestionAnswerAdvisor(vectorStore))
.call()
.content();
return chatClient.prompt().user(question).advisors(new MyLoggerAdvisor()).advisors(new QuestionAnswerAdvisor(vectorStore)).call().content();
}
@Override
public List<Query> getMultiQueryExpand(String question) {
ChatClient.Builder builder = ChatClient.builder(ollamaChatModel);
ChatClient chatClient = builder
.defaultSystem("你是一位专业的室内设计顾问,精通各种装修风格、材料选择和空间布局。请基于提供的参考资料,为用户提供专业、详细且实用的建议。在回答时,请注意:\n" +
"1. 准确理解用户的具体需求\n" +
"2. 结合参考资料中的实际案例\n" +
"3. 提供专业的设计理念和原理解释\n" +
"4. 考虑实用性、美观性和成本效益\n" +
"5. 如有需要,可以提供替代方案")
.build();
ChatClient chatClient = builder.defaultSystem("你是一位专业的室内设计顾问,精通各种装修风格、材料选择和空间布局。请基于提供的参考资料,为用户提供专业、详细且实用的建议。在回答时,请注意:\n" + "1. 准确理解用户的具体需求\n" + "2. 结合参考资料中的实际案例\n" + "3. 提供专业的设计理念和原理解释\n" + "4. 考虑实用性、美观性和成本效益\n" + "5. 如有需要,可以提供替代方案").build();
// MultiQueryExpander queryExpander = MultiQueryExpander.builder()
MyMultiQueryExpander queryExpander = MyMultiQueryExpander.builder()
.chatClientBuilder(builder)
MyMultiQueryExpander queryExpander = MyMultiQueryExpander.builder().chatClientBuilder(builder)
// 不包含原始查询
.includeOriginal(false)
// 生成3个查询变体
.numberOfQueries(4)
.build();
.numberOfQueries(4).build();
return queryExpander.expand(new Query(question));
}
@ -75,12 +64,53 @@ public class RagServiceImpl implements RagService {
Query query = new Query(question);
// 创建查询重写转换器
QueryTransformer queryTransformer = RewriteQueryTransformer.builder()
.chatClientBuilder(builder)
.build();
QueryTransformer queryTransformer = RewriteQueryTransformer.builder().chatClientBuilder(builder).build();
// 执行查询重写
Query transformedQuery = queryTransformer.transform(query);
return transformedQuery.text();
}
@Override
public String queryTranslation(String question) {
ChatClient.Builder builder = ChatClient.builder(ollamaChatModel);
// 创建一个英文查询
Query query = new Query(question);
// 创建查询翻译转换器设置目标语言为中文
QueryTransformer queryTransformer = TranslationQueryTransformer.builder().chatClientBuilder(builder)
// 设置目标语言为中文
.targetLanguage("chinese").build();
// 执行查询翻译
Query transformedQuery = queryTransformer.transform(query);
// 输出翻译后的查询
return transformedQuery.text();
}
@Override
public String contextAwareQueries(String question) {
ChatClient.Builder builder = ChatClient.builder(ollamaChatModel);
// 构建带有历史上下文的查询
// 这个例子模拟了一个房地产咨询场景用户先问小区位置再问房价
Query query = Query.builder()
// 当前用户的提问
.text(question)
// 历史对话中用户的问题
.history(new UserMessage("深圳市南山区的碧海湾小区在哪里?"),
// AI的回答
new AssistantMessage("碧海湾小区位于深圳市南山区后海中心区,临近后海地铁站。")).build();
// 创建查询转换器
// QueryTransformer用于将带有上下文的查询转换为完整的独立查询
QueryTransformer queryTransformer = CompressionQueryTransformer.builder()
.chatClientBuilder(builder)
.build();
// 执行查询转换
// 将模糊的代词引用"这个小区"转换为明确的实体名称"碧海湾小区"
Query transformedQuery = queryTransformer.transform(query);
return transformedQuery.text();
}
}

View File

@ -47,4 +47,18 @@ public class RagController {
String queryList = ragService.queryRewrite(question);
return R.ok(queryList);
}
@PostMapping("/queryTranslation")
@Operation(summary = "查询翻译")
public R<String> queryTranslation(@RequestBody String question) {
String queryList = ragService.queryTranslation(question);
return R.ok(queryList);
}
@PostMapping("/contextAwareQueries")
@Operation(summary = "上下文感知查询")
public R<String> contextAwareQueries(@RequestBody String question) {
String queryList = ragService.contextAwareQueries(question);
return R.ok(queryList);
}
}