Spring AI 高级RAG功能实现:查询翻译、上下文感知
This commit is contained in:
parent
94dac544e2
commit
77ef26470a
@ -16,4 +16,8 @@ public interface RagService {
|
|||||||
List<Query> getMultiQueryExpand(String question);
|
List<Query> getMultiQueryExpand(String question);
|
||||||
|
|
||||||
String queryRewrite(String question);
|
String queryRewrite(String question);
|
||||||
|
|
||||||
|
String queryTranslation(String question);
|
||||||
|
|
||||||
|
String contextAwareQueries(String question);
|
||||||
}
|
}
|
||||||
|
@ -6,11 +6,14 @@ import com.huangge1199.aiagent.rag.MyMultiQueryExpander;
|
|||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import org.springframework.ai.chat.client.ChatClient;
|
import org.springframework.ai.chat.client.ChatClient;
|
||||||
import org.springframework.ai.chat.client.advisor.QuestionAnswerAdvisor;
|
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.chat.model.ChatModel;
|
||||||
import org.springframework.ai.rag.Query;
|
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.QueryTransformer;
|
||||||
import org.springframework.ai.rag.preretrieval.query.transformation.RewriteQueryTransformer;
|
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.ai.vectorstore.VectorStore;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
@ -36,35 +39,21 @@ public class RagServiceImpl implements RagService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String localDoc(String question) {
|
public String localDoc(String question) {
|
||||||
return chatClient.prompt()
|
return chatClient.prompt().user(question).advisors(new MyLoggerAdvisor()).advisors(new QuestionAnswerAdvisor(vectorStore)).call().content();
|
||||||
.user(question)
|
|
||||||
.advisors(new MyLoggerAdvisor())
|
|
||||||
.advisors(new QuestionAnswerAdvisor(vectorStore))
|
|
||||||
.call()
|
|
||||||
.content();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Query> getMultiQueryExpand(String question) {
|
public List<Query> getMultiQueryExpand(String question) {
|
||||||
ChatClient.Builder builder = ChatClient.builder(ollamaChatModel);
|
ChatClient.Builder builder = ChatClient.builder(ollamaChatModel);
|
||||||
|
|
||||||
ChatClient chatClient = builder
|
ChatClient chatClient = builder.defaultSystem("你是一位专业的室内设计顾问,精通各种装修风格、材料选择和空间布局。请基于提供的参考资料,为用户提供专业、详细且实用的建议。在回答时,请注意:\n" + "1. 准确理解用户的具体需求\n" + "2. 结合参考资料中的实际案例\n" + "3. 提供专业的设计理念和原理解释\n" + "4. 考虑实用性、美观性和成本效益\n" + "5. 如有需要,可以提供替代方案").build();
|
||||||
.defaultSystem("你是一位专业的室内设计顾问,精通各种装修风格、材料选择和空间布局。请基于提供的参考资料,为用户提供专业、详细且实用的建议。在回答时,请注意:\n" +
|
|
||||||
"1. 准确理解用户的具体需求\n" +
|
|
||||||
"2. 结合参考资料中的实际案例\n" +
|
|
||||||
"3. 提供专业的设计理念和原理解释\n" +
|
|
||||||
"4. 考虑实用性、美观性和成本效益\n" +
|
|
||||||
"5. 如有需要,可以提供替代方案")
|
|
||||||
.build();
|
|
||||||
|
|
||||||
// MultiQueryExpander queryExpander = MultiQueryExpander.builder()
|
// MultiQueryExpander queryExpander = MultiQueryExpander.builder()
|
||||||
MyMultiQueryExpander queryExpander = MyMultiQueryExpander.builder()
|
MyMultiQueryExpander queryExpander = MyMultiQueryExpander.builder().chatClientBuilder(builder)
|
||||||
.chatClientBuilder(builder)
|
|
||||||
// 不包含原始查询
|
// 不包含原始查询
|
||||||
.includeOriginal(false)
|
.includeOriginal(false)
|
||||||
// 生成3个查询变体
|
// 生成3个查询变体
|
||||||
.numberOfQueries(4)
|
.numberOfQueries(4).build();
|
||||||
.build();
|
|
||||||
return queryExpander.expand(new Query(question));
|
return queryExpander.expand(new Query(question));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,12 +64,53 @@ public class RagServiceImpl implements RagService {
|
|||||||
Query query = new Query(question);
|
Query query = new Query(question);
|
||||||
|
|
||||||
// 创建查询重写转换器
|
// 创建查询重写转换器
|
||||||
QueryTransformer queryTransformer = RewriteQueryTransformer.builder()
|
QueryTransformer queryTransformer = RewriteQueryTransformer.builder().chatClientBuilder(builder).build();
|
||||||
.chatClientBuilder(builder)
|
|
||||||
.build();
|
|
||||||
|
|
||||||
// 执行查询重写
|
// 执行查询重写
|
||||||
Query transformedQuery = queryTransformer.transform(query);
|
Query transformedQuery = queryTransformer.transform(query);
|
||||||
return transformedQuery.text();
|
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();
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -47,4 +47,18 @@ public class RagController {
|
|||||||
String queryList = ragService.queryRewrite(question);
|
String queryList = ragService.queryRewrite(question);
|
||||||
return R.ok(queryList);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user