RAG核心特性:查询增强和关联
本文为个人学习笔记整理,仅供交流参考,非专业教学资料,内容请自行甄别。
文章目录
- 概述
- 一、RetrievalAugmentationAdvisor
- 二、ContextualQueryAugmenter
概述
查询增强和关联
是在RAG文档检索和过滤后执行的操作,也是RAG的核心特性之一。其利用了Spring AI的Advisor增强器的特性,主要包括了:
- QuestionAnswerAdvisor:从向量存储中检索问题的上下文并添加到提示的用户文本中。
- RetrievalAugmentationAdvisor:遵循模块化 RAG 体系结构实现常见检索增强生成 (RAG) 流的Advisor。提供了更多的定制选项。
以及ContextualQueryAugmenter
空上下文处理器。其中QuestionAnswerAdvisor
是最常见的用法,此前的案例中都是使用该种Advisor作为向量数据库的增强器,执行文档检索和过滤的操作,本篇重点介绍后两种。
一、RetrievalAugmentationAdvisor
RetrievalAugmentationAdvisor
提供了更多的定制功能,其基本的使用案例:
/*** 测试RetrievalAugmentationAdvisor增强器** @param text* @param chatId* @return*/public String testRetrievalAugmentationAdvisor(String text, String chatId) {RetrievalAugmentationAdvisor retrievalAugmentationAdvisor = RetrievalAugmentationAdvisor.builder().documentRetriever(VectorStoreDocumentRetriever.builder().similarityThreshold(0.50).vectorStore(vectorStore).build()).build();ChatResponse response = chatClient.prompt().user(text).advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId).param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10)).advisors(new MyLogAdvisor()).advisors(retrievalAugmentationAdvisor).call().chatResponse();return response.getResult().getOutput().getText();}
RetrievalAugmentationAdvisor
还支持加入文档过滤和检索
的增强,比如RewriteQueryTransformer
查询重写:
/*** 测试RetrievalAugmentationAdvisor增强器** @param text* @param chatId* @return*/public String testRetrievalAugmentationAdvisor(String text, String chatId) {RetrievalAugmentationAdvisor retrievalAugmentationAdvisor = RetrievalAugmentationAdvisor.builder().queryTransformers(RewriteQueryTransformer.builder().build()).documentRetriever(VectorStoreDocumentRetriever.builder().similarityThreshold(0.50).vectorStore(vectorStore).build()).build();ChatResponse response = chatClient.prompt().user(text).advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId).param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10)).advisors(new MyLogAdvisor()).advisors(retrievalAugmentationAdvisor).call().chatResponse();return response.getResult().getOutput().getText();}
二、ContextualQueryAugmenter
ContextualQueryAugmenter
是空上下文处理器, 默认情况下RetrievalAugmentationAdvisor
是不支持检索的上下文为空的。但是如果用户想要查询到知识库以外的内容,可以通过ContextualQueryAugmenter
增强器实现:
/*** 测试ContextualQueryAugmenter增强器** @param text* @param chatId* @return*/public String testContextualQueryAugmenter(String text, String chatId) {RetrievalAugmentationAdvisor retrievalAugmentationAdvisor = RetrievalAugmentationAdvisor.builder().documentRetriever(VectorStoreDocumentRetriever.builder().similarityThreshold(0.50).vectorStore(vectorStore).build())//构建ContextualQueryAugmenter增强器,设置允许上下文为空.queryAugmenter(ContextualQueryAugmenter.builder().allowEmptyContext(true).build()).build();ChatResponse response = chatClient.prompt().user(text).advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId).param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10)).advisors(new MyLogAdvisor()).advisors(retrievalAugmentationAdvisor).call().chatResponse();return response.getResult().getOutput().getText();}
本地RAG知识库提供的文档,都是和猫咪的选择
有关的,上面的设置完成后,再去提问一个无关的问题,比如谁是狗
:
谁是狗
这样的问题,在RAG知识库中是搜索不到的。
通过ContextualQueryAugmenter
的增强,可以给出回答:
关闭ContextualQueryAugmenter
增强,则无法给出回答:
ContextualQueryAugmenter
也可以自定义提示模板:
RetrievalAugmentationAdvisor retrievalAugmentationAdvisor = RetrievalAugmentationAdvisor.builder().documentRetriever(VectorStoreDocumentRetriever.builder().similarityThreshold(0.50).vectorStore(vectorStore).build())//构建ContextualQueryAugmenter增强器,设置允许上下文为空.queryAugmenter(ContextualQueryAugmenter.builder().allowEmptyContext(false).emptyContextPromptTemplate(new SystemPromptTemplate("你应该输出以下的内容:抱歉,该问题我无法回答,请另请高明")).build()).build();