diff --git a/src/main/java/com/huangge1199/aiagent/Service/RagService.java b/src/main/java/com/huangge1199/aiagent/Service/RagService.java index 725a9fc..ee639c9 100644 --- a/src/main/java/com/huangge1199/aiagent/Service/RagService.java +++ b/src/main/java/com/huangge1199/aiagent/Service/RagService.java @@ -16,4 +16,8 @@ public interface RagService { List getMultiQueryExpand(String question); String queryRewrite(String question); + + String queryTranslation(String question); + + String contextAwareQueries(String question); } diff --git a/src/main/java/com/huangge1199/aiagent/Service/impl/RagServiceImpl.java b/src/main/java/com/huangge1199/aiagent/Service/impl/RagServiceImpl.java index 4da0812..a8f398d 100644 --- a/src/main/java/com/huangge1199/aiagent/Service/impl/RagServiceImpl.java +++ b/src/main/java/com/huangge1199/aiagent/Service/impl/RagServiceImpl.java @@ -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 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(); + + } } diff --git a/src/main/java/com/huangge1199/aiagent/controller/RagController.java b/src/main/java/com/huangge1199/aiagent/controller/RagController.java index 5f2008a..89b77b3 100644 --- a/src/main/java/com/huangge1199/aiagent/controller/RagController.java +++ b/src/main/java/com/huangge1199/aiagent/controller/RagController.java @@ -47,4 +47,18 @@ public class RagController { String queryList = ragService.queryRewrite(question); return R.ok(queryList); } + + @PostMapping("/queryTranslation") + @Operation(summary = "查询翻译") + public R queryTranslation(@RequestBody String question) { + String queryList = ragService.queryTranslation(question); + return R.ok(queryList); + } + + @PostMapping("/contextAwareQueries") + @Operation(summary = "上下文感知查询") + public R contextAwareQueries(@RequestBody String question) { + String queryList = ragService.contextAwareQueries(question); + return R.ok(queryList); + } }