使用 llama-index-networks 查询知识网络,展示如何仅用几行代码就让您的 QueryEngine 准备好作为 RAG 网络的一部分做出贡献

简介

RAG 背后的主要前提是将背景(或知识)注入 LLM,以便从中得到更准确的响应。因此,RAG 系统的一个关键组件是它从中获取知识的数据源。因此,直觉上可以推断,RAG 系统可以利用的知识越多,它最终会变得越好(就回答深度和广度的查询而言)。这个概念的精神与基本上所有其他数据驱动学科中的精神并没有太大不同——获得更多(好的)数据,随后有效地使用,通常会带来更好的结果。

正是在这样的背景下,我们很高兴地宣布发布我们最新的llama-index库扩展,名为llama-index-networks。此库扩展使构建基于外部数据源并由外部参与者提供的 RAG 网络成为可能。这种新的网络范式为数据供应商提供了一种新的方式,可以将其数据提供给需要它的人,以构建更具知识性的系统!

在这篇博文中,我们将介绍新扩展库的主要类,并向您展示如何仅用几行代码就让您的 QueryEngine 准备好作为 RAG 网络的一部分做出贡献。我们还将分享这对数据供应商在 LLM 新时代如何向消费者提供数据意味着什么的想法。

术语说明:在本文中,我们使用llama-index-networks来指代实际的扩展,而指代扩展附带llama-index[networks]的安装。llama-indexllama-index-networks

推荐文章

使用 `llama-index` 时,实现递归查询通常涉及构建一个能够自动分解复杂问题并多次调用语言模型的机制。虽然 `llama-index` 本身不直接提供“递归查询”的功能,但可以通过组合其提供的工具和模块来实现这一目标。 ### 实现递归查询的方法 1. **利用 `QueryEngine` 和 `SubQuestionQueryEngine`** `llama-index` 提供了一个名为 `SubQuestionQueryEngine` 的类,专门用于将复杂查询拆解为多个子问题,并依次调用模型进行解答。该引擎会将原始问题分解为多个子问题,然后通过指定的 `QueryEngine` 对每个子问题进行处理,最后将结果整合成最终答案。 ```python from llama_index import VectorStoreIndex, SimpleDirectoryReader from llama_index.query_engine import SubQuestionQueryEngine from llama_index.tools import QueryEngineTool, ToolMetadata # 加载文档数据并构建索引 documents = SimpleDirectoryReader("path/to/documents").load_data() index = VectorStoreIndex.from_documents(documents) query_engine = index.as_query_engine() # 创建 QueryEngineTool query_tool = QueryEngineTool( query_engine=query_engine, metadata=ToolMetadata( name="document_query", description="Use this tool to answer questions about the provided documents." ) ) # 构建 SubQuestionQueryEngine sub_question_engine = SubQuestionQueryEngine.from_defaults(query_engine_tools=[query_tool]) # 执行递归查询 response = sub_question_engine.query("What is the population of Tokyo and how does it compare to New York?") print(response) ``` 这种方式允许系统自动将复合问题(如比较两个城市的特征)拆分为多个子问题,并分别求解[^4]。 2. **自定义递归逻辑** 如果需要更精细的控制,可以手动编写递归函数,根据查询内容动态决定是否需要进一步细分问题。例如,可以设计一个函数,在遇到特定关键词或结构时,触发对子问题的再次查询。 ```python def recursive_query(query, depth=0, max_depth=3): if depth >= max_depth: return "Maximum recursion depth reached." # 使用基础查询引擎 response = query_engine.query(query) # 判断是否需要进一步细化 if "more details" in str(response).lower(): new_query = "Explain more about " + query.split("about")[-1] return recursive_query(new_query, depth + 1, max_depth) return response result = recursive_query("Tell me about climate change") print(result) ``` 上述代码展示了如何基于响应内容判断是否继续深入查询,从而实现递归逻辑。 3. **结合外部提示工程与思维链(Chain-of-Thought)技术** 可以通过提示模板引导模型主动识别复杂问题中的子问题,并输出多个步骤的指令,随后解析这些指令并逐个执行。这种方法依赖于模型自身的推理能力,适用于支持多步推理的大型语言模型。 ```python prompt_template = """ Given the question: {question} Please break it down into sub-questions that need to be answered. Return each sub-question on a new line. """ # 使用 LLM 生成子问题 sub_questions = llm.complete(prompt_template.format(question=user_query)) sub_questions_list = sub_questions.text.split("\n") # 对每个子问题进行查询 results = [] for q in sub_questions_list: if q.strip(): results.append(query_engine.query(q)) # 整合结果 final_answer = "\n".join([str(r) for r in results]) print(final_answer) ``` 此方法充分利用了模型的上下文理解能力,适合处理复杂的、非结构化的自然语言查询--- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

知识大胖

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

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

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

打赏作者

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

抵扣说明:

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

余额充值