微信扫码
与创始人交个朋友
我要投稿
RAG(检索增强生成)的质量在很大程度上取决于流程中第一步的质量:检索。生成步骤的好坏取决于工作环境,而生成环境是检索步骤的结果。
然而,检索也依赖于它收到的query。检索有多种类型:基于关键字、基于语义搜索(嵌入)、混合搜索,甚至在某些情况下会基于对 API 的查询结果(例如,网络搜索结果等)。但归根结底,在大多数情况下,都是人类在键盘后面输入query,而人类并不能保证为他们想要的结果生成高质量的query。
在本文中,我们将向您介绍一种非常简单但有效的技术,该技术可以确保我们检索到更多与给定query更相关的上下文;它就是:查询扩展。
TL;DR:查询扩展增加了结果的数量,因此它提高了召回率(相对于精确度)。一般来说,BM25 有利于精确度,而嵌入检索有利于召回率。因此,在您想要依赖关键字搜索的情况下,使用 BM25+查询扩展来提高召回率是有意义的。
查询扩展
让我们从构建一个简单的QueryExpander开始。此组件使用 OpenAI 模型(gpt-3.5-turbo在本例中)来生成number个附加查询:
@component
class QueryExpander:
def __init__(self, prompt: Optional[str] = None, model: str = "gpt-3.5-turbo"):
self.query_expansion_prompt = prompt
self.model = model
if prompt == None:
self.query_expansion_prompt = """
You are part of an information system that processes users queries.
You expand a given query into {{ number }} queries that are similar in meaning.
Structure:
Follow the structure shown below in examples to generate expanded queries.
Examples:
1. Example Query 1: "climate change effects"
Example Expanded Queries: ["impact of climate change", "consequences of global warming", "effects of environmental changes"]
2. Example Query 2: ""machine learning algorithms""
Example Expanded Queries: ["neural networks", "clustering", "supervised learning", "deep learning"]
Your Task:
Query: "{{query}}"
Example Expanded Queries:
"""
builder = PromptBuilder(self.query_expansion_prompt)
llm = OpenAIGenerator(model = self.model)
self.pipeline = Pipeline()
self.pipeline.add_component(name="builder", instance=builder)
self.pipeline.add_component(name="llm", instance=llm)
self.pipeline.connect("builder", "llm")
@component.output_types(queries=List[str])
def run(self, query: str, number: int = 5):
result = self.pipeline.run({'builder': {'query': query, 'number': number}})
expanded_query = json.loads(result['llm']['replies'][0]) + [query]
return {"queries": list(expanded_query)}
要复制如上所示的示例用户查询和扩展查询,您可以按如下方式运行组件:
expander = QueryExpander()expander.run(query="开源 NLP 框架", number=4)
这将导致返回queries包含原始查询 + 4 个扩展查询的组件:
{'queries': ['自然语言处理工具','免费 NLP 库','开源语言处理平台','带有开源代码的 NLP 软件','开源 NLP 框架']}
使用查询扩展进行检索
documents = [Document(content="气候的影响有很多,包括生物多样性的丧失。"),Document(content="气候变化的影响在极地冰盖的融化中是显而易见的。"), Document(content="全球气候变化的后果变暖的包括的上升海平面。"),Document(content="环境变化的影响之一是天气模式的变化。"),Document(content="全球都在呼吁减少人们的航空旅行次数。"),Document(content="航空旅行是造成气候变化的主要因素之一。"),Document(content="预计土耳其夏季气候会变暖。"),]
'航空旅行是造成气候变化的主要因素之一。''气候变化的影响在极地冰盖的融化中是显而易见的。''气候的影响有很多,包括生物多样性的丧失。'
queries
而不是单个query。这是我们创建的检索管道:query_expander = QueryExpander()
retriever = MultiQueryInMemoryBM25Retriever(InMemoryBM25Retriever(document_store=doc_store))
expanded_retrieval_pipeline = Pipeline()
expanded_retrieval_pipeline.add_component("expander", query_expander)
expanded_retrieval_pipeline.add_component("keyword_retriever", retriever)
expanded_retrieval_pipeline.connect("expander.queries", "keyword_retriever.queries")
expanded_retrieval_pipeline.run({"expander": {"query": "climate change"}},include_outputs_from=["expander"])
queries
:'expander': {'queries': ['全球变暖的后果', '气候变化对环境的影响', '气候变率的影响', '气候危机的影响', '温室气体排放的后果', '气候变化']}}
请注意,您可能会得到不同的结果,因为您QueryExpander可能会生成不同的queries
'全球气候变化的后果变暖的包括的上升海平面。''气候变化的影响在极地冰盖的融化中是显而易见的。''全球都在呼吁减少人们的航空旅行次数。''气候的影响有很多,包括生物多样性的丧失。''环境变化的影响之一是天气模式的变化。''航空旅行是造成气候变化的主要因素之一。'
请注意我们如何能够添加有关“全球变暖”和“环境变化的影响”的背景信息。
对 RAG 使用查询扩展
我们将以下 Wikipedia 页面编入索引InMemoryDocumentStore
:
"Electric_vehicle", "Dam", "Electric_battery", "Tree", "Solar_panel", "Nuclear_power","Wind_power", "Hydroelectricity", "Coal", "Natural_gas", "Greenhouse_gas", "Renewable_energy", "Fossil_fuel"
template = """
You are part of an information system that summarises related documents.
You answer a query using the textual content from the documents retrieved for the
following query.
You build the summary answer based only on quoting information from the documents.
You should reference the documents you used to support your answer.
###
Original Query: "{{query}}"
Retrieved Documents: {{documents}}
Summary Answer:
"""
query_expander = QueryExpander()
retriever = MultiQueryInMemoryBM25Retriever(InMemoryBM25Retriever(document_store=doc_store))
prompt_builder = PromptBuilder(template = template)
llm = OpenAIGenerator()
query_expanded_rag_pipeline = Pipeline()
query_expanded_rag_pipeline.add_component("expander", query_expander)
query_expanded_rag_pipeline.add_component("keyword_retriever", retriever)
query_expanded_rag_pipeline.add_component("prompt", prompt_builder)
query_expanded_rag_pipeline.add_component("llm", llm)
query_expanded_rag_pipeline.connect("expander.queries", "keyword_retriever.queries")
query_expanded_rag_pipeline.connect("keyword_retriever.documents", "prompt.documents")
query_expanded_rag_pipeline.connect("prompt", "llm")
总结
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-11-16
通过Reranking来优化RAG:提升信息检索的精准度
2024-11-16
从RAG到TAG:探索表增强生成(TAG)的力量
2024-11-15
复旦发布:最佳RAG方案
2024-11-15
破解PDF解析难题:RAG中高效解析复杂PDF的最佳选择
2024-11-15
RAG技术全解析:从基础到前沿,掌握智能问答新动向
2024-11-15
RAG在未来会消失吗?附RAG的5种切分策略
2024-11-15
HtmlRAG:利用 HTML 结构化信息增强 RAG 系统的知识检索能力和准确性
2024-11-15
打造自己的RAG解析大模型:表格数据标注的三条黄金规则
2024-07-18
2024-07-09
2024-05-05
2024-07-09
2024-05-19
2024-06-20
2024-07-07
2024-07-07
2024-07-08
2024-07-09
2024-11-06
2024-11-06
2024-11-05
2024-11-04
2024-10-27
2024-10-25
2024-10-21
2024-10-21