LLM之RAG实战(十八)| 使用Query转换来改进RAG效果

​       在本文中,我们将分析查询转换,以及如何使用路由器根据输入提示选择适当的转换。

       查询转换背后的想法是,检索器有可能从数据库中检索到与用户初始提示不相关的块。在这些情况下,我们可以在检索并将其提供给语言模型之前,修改查询以增加其与源的相关性。

       我们将从一个简单的RAG应用程序开始,首先加载关于尼古拉斯·凯奇、《最好的时代》(尼古拉斯·凯吉首次登台表演的电视试播)和莱昂纳多·迪卡普里奥的三个维基百科页面数据。

       然后,我们将把文档分割成256个字符的块,没有重叠。这些块将嵌入并索引在Vector Store中,默认情况下,Vector Store将所有内容存储在内存中。

WikipediaReader = download_loader("WikipediaReader")loader = WikipediaReader()pages = ['Nicolas_Cage', 'The_Best_of_Times_(1981_film)', 'Leonardo DiCaprio']documents = loader.load_data(pages=pages, auto_suggest=False, redirect = False)llm = OpenAI(temperature=0, model="gpt-3.5-turbo")gpt3 = OpenAI(temperature=0, model="text-davinci-003")embed_model = OpenAIEmbedding(model= OpenAIEmbeddingModelType.TEXT_EMBED_ADA_002)service_context_gpt3 = ServiceContext.from_defaults(llm=gpt3, chunk_size = 256, chunk_overlap=0, embed_model=embed_model)index = VectorStoreIndex.from_documents(documents, service_context=service_context_gpt3)retriever = index.as_retriever(similarity_top_k=3)

       现在,我们必须确保模型只根据上下文进行回答,而不依赖于其训练数据,即使它以前可能已经学会了答案。

# The response from original promptfrom llama_index.prompts import PromptTemplatetemplate = ("We have provided context information below. \n"    "---------------------\n"    "{context_str}"    "\n---------------------\n"    "Given this information, please answer the question: {query_str}\n"    "Don't give an answer unless it is supported by the context above.\n")qa_template = PromptTemplate(template)

       我们将使用两个更复杂的查询来测试刚刚创建的RAG应用程序。让我们来看看第一个。

问题1——“Who directed the pilot that marked the acting debut of Nicolas Cage?”

       该查询的问题需要参考多条信息:尼古拉斯·凯奇的表演处女作和这部电影的导演。提示中只提到了尼古拉斯·凯奇,而导演的名字却没有被涉及。由于该模型不知道凯奇首次亮相的电视试播节目《最好的时代》的名字,因此无法从我们索引的文件中检索到相关细节。

question = "Who directed the pilot that marked the acting debut of Nicolas Cage?"
### LLMRAG结合的技术实现 #### 技术架构概述 LLMRAG的结合可以通过一种混合式的架构来完成,其中检索模块负责从外部知识源获取相关信息,而生成模块则利用这些信息生成高质量的回答。这种方法不仅提高了模型的知识覆盖范围,还显著降低了错误率和“幻觉”现象的发生概率[^4]。 #### 数据流过程 在具体的实施过程中,当接收到一个问题时,系统会先通过检索器访问外部数据库或文档集合,提取出与问题最相关的若干片段作为上下文输入。随后,这些片段连同原始问题一起传递至预训练好的大型语言模型中进行处理并最终输出答案[^1]。 #### 实现优势 此方法的优势在于其能够动态地调用最新、最准确的数据资源支持实时查询需求,而不依赖于固定时间点之前已有的静态参数化记忆内容。因此,在面对快速变化领域内的新情况或者需要高度精确表述的任务场景下尤为适用[^3]。 ```python def rag_based_llm(query, database): # Step 1: Retrieve relevant documents from the external knowledge base. retrieved_docs = retrieve_relevant_documents(query, database) # Step 2: Pass both query and retrieved information into an LLM for generation. response = large_language_model.generate(query=query, context=retrieved_docs) return response # Example function definitions (not actual implementations). def retrieve_relevant_documents(query, db): ... large_language_model = LargeLanguageModel()... ``` 上述伪代码展示了基本的工作流程:对于每一个用户提问 `query` ,我们都会去对应的资料库 `database` 中寻找关联条目;之后把找到的结果送入到我们的大语言模型里头加工成最后答复形式。 #### 应用实例分析 实际操作层面来看,这样的组合已经被广泛采纳用于创建智能客服对话代理程序还有其他涉及自然语言理解的应用场合之中。比如某些公司正在开发的产品线里面就包含了此类技术的支持方案设计思路讨论等内容[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wshzd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值