全文逐字翻译为中文(只输出翻译后结果): # RouterQuery Engine

在本笔记本中,我们将研究 RouterQueryEngine,以将用户查询路由到一个可用的查询引擎工具。这些工具可以是不同的索引/查询引擎,处理相同或不同的文档。

安装

!pip install llama-index
!pip install llama-index-llms-anthropic
!pip install llama-index-embeddings-huggingface

设置日志记录

# 注意:这仅在 jupyter notebook 中是必需的。
# 详情:Jupyter 在后台运行一个事件循环。
#          这会导致我们在启动事件循环以进行异步查询时出现嵌套事件循环。
#          这通常是不允许的,我们使用 nest_asyncio 来方便地允许它。
import nest_asyncio

nest_asyncio.apply()

import logging
import sys

# 设置根记录器
logger = logging.getLogger()
logger.setLevel(logging.INFO)  # 将记录器级别设置为 INFO

# 清除所有现有的处理程序
logger.handlers = []

# 设置 StreamHandler 以输出到 sys.stdout (Colab 的输出)
handler = logging.StreamHandler(sys.stdout)
handler.setLevel(logging.INFO)  # 将处理程序级别设置为 INFO

# 将处理程序添加到记录器
logger.addHandler(handler)

from IPython.display import display, HTML

设置 Anthropic API 密钥

import os
os.environ['ANTHROPIC_API_KEY'] = 'YOUR ANTHROPIC API KEY'

设置 LLM 和嵌入模型

我们将使用 Anthropic 最新发布的 Claude-3 Opus LLM。

from llama_index.llms.anthropic import Anthropic
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
llm = Anthropic(temperature=0.0, model='claude-3-opus-20240229')
embed_model = HuggingFaceEmbedding(model_name="BAAI/bge-base-en-v1.5")
from llama_index.core import Settings
Settings.llm = llm
Settings.embed_model = embed_model
Settings.chunk_size = 512

下载文档

!mkdir -p 'data/paul_graham/'
!wget 'https://raw.githubusercontent.com/jerryjliu/llama_index/main/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham/paul_graham_essay.txt'
--2024-03-08 07:04:27--  https://raw.githubusercontent.com/jerryjliu/llama_index/main/docs/examples/data/paul_graham/paul_graham_essay.txt
正在解析 raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.109.133, 185.199.110.133, 185.199.108.133, ...
正在连接 raw.githubusercontent.com (raw.githubusercontent.com)|185.199.109.133|:443... 已连接。
已发送 HTTP 请求,等待响应... 200 OK
长度:75042 (73K) [text/plain]
正在保存到 ‘data/paul_graham/paul_graham_essay.txt’

data/paul_graham/pa 100%[===================>]  73.28K  --.-KB/s    in 0.002s

2024-03-08 07:04:27 (28.6 MB/s) - ‘data/paul_graham/paul_graham_essay.txt’ 已保存 [75042/75042]

加载文档

# 加载文档
from llama_index.core import SimpleDirectoryReader
documents = SimpleDirectoryReader("data/paul_graham").load_data()

创建索引和查询引擎。

from llama_index.core import SummaryIndex, VectorStoreIndex
# 用于摘要问题的摘要索引
summary_index = SummaryIndex.from_documents(documents)

# 用于回答特定上下文问题的向量索引
vector_index = VectorStoreIndex.from_documents(documents)
# 摘要索引查询引擎
summary_query_engine = summary_index.as_query_engine(
    response_mode="tree_summarize",
    use_async=True,
)

# 向量索引查询引擎
vector_query_engine = vector_index.as_query_engine()

为摘要和向量查询引擎创建工具。

from llama_index.core.tools.query_engine import QueryEngineTool

# 摘要索引工具
summary_tool = QueryEngineTool.from_defaults(
    query_engine=summary_query_engine,
    description="对于与 Paul Graham 关于“我工作过的”的文章相关的摘要问题很有用。",
)

# 向量索引工具
vector_tool = QueryEngineTool.from_defaults(
    query_engine=vector_query_engine,
    description="对于从 Paul Graham 关于“我工作过的”的文章中检索特定上下文很有用。",
)

创建 Router Query Engine

from llama_index.core.query_engine.router_query_engine import RouterQueryEngine
from llama_index.core.selectors.llm_selectors import LLMSingleSelector, LLMMultiSelector
# 创建 Router Query Engine
query_engine = RouterQueryEngine(
    selector=LLMSingleSelector.from_defaults(),
    query_engine_tools=[
        summary_tool,
        vector_tool,
    ],
)

测试查询

response = query_engine.query("What is the summary of the document?")
HTTP 请求:POST https://api.anthropic.com/v1/messages "HTTP/1.1 200 OK"
选择查询引擎 0:问题是要求文档的摘要。选择 1 特别提到它对于与 Paul Graham 关于“我工作过的”的文章相关的摘要问题很有用,使其成为回答给定问题的最相关选择。。
HTTP 请求:POST https://api.anthropic.com/v1/messages "HTTP/1.1 200 OK"
display(HTML(f'<p style="font-size:20px">{response.response}</p>'))

该文档是 Paul Graham 的一篇自传体文章,描述了他从童年到 50 多岁生活中主要的项目和事件。要点包括: - 童年时,他对编程和写作很感兴趣。他上大学时打算学习哲学,但转而学习人工智能。 - 研究生毕业后,他决定从事艺术,并就读于罗德岛设计学院和佛罗伦萨美术学院。他通过做自由 Lisp 编程来维持生计。 - 1995 年,他和 Robert Morris 创立了 Viaweb,这是最早的 Web 应用程序公司之一,于 1998 年被雅虎收购。这让 Graham 变得富有。 - 离开雅虎后,他一度回归绘画,然后开始在线发布文章,并着手开发一种名为 Arc 的新 Lisp 方言。 - 2005 年,他与 Jessica Livingston、Robert Morris 和 Trevor Blackwell 共同创立了 Y Combinator,这是一种新型的初创公司投资公司。多年来,他一直积极参与 YC,因为它开创了新的创业公司资助模式。 - 2013 年,他将 YC 的管理权交给了 Sam Altman。在一段时间专注于绘画后,他于 2015 年开始开发一种名为 Bel 的新 Lisp 方言,并为此投入了四年的密集工作。 - 这篇文章回顾了他职业生涯的曲折道路,像 YC 模式这样的意外发现,以及他对艺术、写作和编程语言的兴趣在几十年来的交织。它强调了他认为追求那些不那么受人尊敬的想法的价值。

response = query_engine.query("What did Paul Graham do growing up?")
HTTP 请求:POST https://api.anthropic.com/v1/messages "HTTP/1.1 200 OK"
选择查询引擎 1:问题询问的是 Paul Graham 生活中的具体细节,这些细节很可能在原始文章中找到。文章的摘要可能不包含他成长过程中所做事情的所有相关细节。。
HTTP 请求:POST https://api.anthropic.com/v1/messages "HTTP/1.1 200 OK"
display(HTML(f'<p style="font-size:20px">{response.response}</p>'))

根据提供的上下文,Paul Graham 在上大学之前,除了上学之外,主要从事写作和编程两件事。他写短篇故事,他承认这些故事很糟糕,几乎没有情节,只有一些情感强烈的角色。 九年级时,他大约 13 或 14 岁,开始尝试使用他所在的学区使用的 IBM 1401 计算机编写程序。语言是一种早期版本的 Fortran,程序必须通过穿孔卡片输入。然而,他对 1401 感到困惑,无法弄清楚如何真正使用它,因为唯一的输入是穿孔卡片上的数据,而他没有这些数据。他最清晰的记忆是了解到程序可能会无法终止,因为他写的一个程序就是如此,这在共享机器上是一种社交失礼。但自从微型计算机出现后,一切都改变了。