使用查询管道和HyDE构建多PDF代理¶
在这个示例中,我们将向您展示如何构建一个多PDF代理,该代理可以跨多个工具进行推理,每个工具对应一个使用HyDE在文档上运行的RAG管道。
作者:https://github.com/DoganK01
安装依赖¶
%pip install llama-index-llms-openai
%pip install llama-index
%pip install pyvis
%pip install arize-phoenix[evals]
%pip install llama-index-callbacks-arize-phoenix
下载数据并导入¶
!mkdir -p 'data/10k/'
!wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/uber_2021.pdf' -O 'data/10k/uber_2021.pdf'
!wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/lyft_2021.pdf' -O 'data/10k/lyft_2021.pdf'
import os
import logging
import sys
logging.basicConfig(stream=sys.stdout, level=logging.INFO)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.indices.query.query_transform import HyDEQueryTransform
from llama_index.core.query_engine import TransformQueryEngine
from IPython.display import Markdown, display
# 任务:将python文件中的注释相关的内容翻译成中文,同时保持文件格式的正确性。
from llama_index.core import :
- SimpleDirectoryReader
- VectorStoreIndex
- StorageContext
- 从存储中加载索引的load_index_from_storage函数
from llama_index.core.tools import :
- QueryEngineTool
- ToolMetadata
# 定义全局回调设置
from llama_index.core.settings import Settings
from llama_index.core.callbacks import CallbackManager
设置可观测性¶
callback_manager = CallbackManager()
Settings.callback_manager = callback_manager
# 设置 Arize Phoenix 用于日志记录/可观测性
import phoenix as px
import llama_index.core
px.launch_app()
llama_index.core.set_global_handler("arize_phoenix")
os.environ["OPENAI_API_KEY"] = "sk-"
设置多文档HyDE查询引擎/工具¶
我们为我们的多文档系统设置了HyDE查询引擎及其工具。
HyDE,即假设文档嵌入,是一种旨在增强文档检索过程效率的创新检索技术。该方法通过创建一个针对传入查询量身定制的假设文档来运作,随后将其嵌入。所得的嵌入被利用来高效检索与假设对应文档相似的真实文档。
尝试:
storage_context = StorageContext.from_defaults(
persist_dir="./storage/lyft"
)
lyft_index = load_index_from_storage(storage_context)
storage_context = StorageContext.from_defaults(
persist_dir="./storage/uber"
)
uber_index = load_index_from_storage(storage_context)
index_loaded = True
except:
index_loaded = False
if not index_loaded:
# 加载数据
lyft_docs = SimpleDirectoryReader(
input_files=["./data/10k/lyft_2021.pdf"]
).load_data()
uber_docs = SimpleDirectoryReader(
input_files=["./data/10k/uber_2021.pdf"]
).load_data()
# 构建索引
lyft_index = VectorStoreIndex.from_documents(lyft_docs)
uber_index = VectorStoreIndex.from_documents(uber_docs)
# 持久化索引
lyft_index.storage_context.persist(persist_dir="./storage/lyft")
uber_index.storage_context.persist(persist_dir="./storage/uber")
lyft_engine = lyft_index.as_query_engine(similarity_top_k=3)
uber_engine = uber_index.as_query_engine(similarity_top_k=3)
hyde = HyDEQueryTransform(include_original=True)
lyft_hyde_query_engine = TransformQueryEngine(lyft_engine, hyde)
uber_hyde_query_engine = TransformQueryEngine(uber_engine, hyde)
query_engine_tools = [
QueryEngineTool(
query_engine=lyft_hyde_query_engine,
metadata=ToolMetadata(
name="lyft_10k",
description=(
"Provides information about Lyft financials for year 2021. "
"Use a detailed plain text question as input to the tool."
),
),
),
QueryEngineTool(
query_engine=uber_hyde_query_engine,
metadata=ToolMetadata(
name="uber_10k",
description=(
"Provides information about Uber financials for year 2021. "
"Use a detailed plain text question as input to the tool."
),
),
),
]
设置ReAct Agent流水线¶
什么是ReAct代理¶
ReAct是一种使LLM能够进行推理和执行特定任务动作的技术。它结合了链式思维(chain-of-thought)推理和行动规划。它使LLM能够创建推理轨迹和特定任务动作,通过使用内存增强它们之间的协同作用。
ReACT代理模型指的是一个框架,该框架将LLM的推理能力与执行可操作步骤的能力集成在一起,创建一个更复杂的系统,该系统能够理解和处理信息、评估情况、采取适当的行动、传达响应以及跟踪正在进行的情况。
推理循环:推理循环允许数据代理根据输入任务选择并与工具交互。
记忆:具有记忆访问能力的LLM可以存储和检索数据,非常适合跟踪状态或访问多个来源的应用。记忆保留了过去的互动,使得可以无缝地参考先前的对话点。这一整合过程涉及为相关信息分配记忆槽并在对话期间利用检索机制。通过回忆存储的数据,LLM增强了上下文响应并集成了外部来源,丰富了用户体验。
我们将创建的ReAct代理步骤¶
- 接受代理输入
- 使用LLM调用ReAct提示生成下一步行动/工具(或返回响应)。
- 如果选择了工具/行动,则调用工具管道以执行工具并收集响应(在这种情况下,我们的工具是用于两个文档的HyDE查询引擎工具)。
- 如果生成了响应,则获取响应。
一个
AgentInputComponent
,它允许您将代理输入(任务、状态字典)转换为查询管道的一组输入。一个
AgentFnComponent
:一个通用处理器,允许您接受当前任务、状态以及任何任意输入,并返回一个输出。在本手册中,我们定义了一个格式化ReAct提示的功能组件。不过,您可以将其放置在任何位置。
请注意,传递给AgentFnComponent
和AgentInputComponent
的任何函数 必须 包含任务和状态作为输入变量,因为这些是代理传递的输入。
请注意,代理查询管道的输出 必须 是 Tuple[AgentChatResponse, bool]
。
任务和状态¶
任务:它包含完成用户请求查询所需的信息。用户输入、记忆、元数据、随时间变化的全局状态。
状态:一些信息比如记忆。
代理输入组件¶
为给定的任务生成输入。
from llama_index.core.agent.react.types import (
ActionReasoningStep, # 动作推理步骤
ObservationReasoningStep, # 观察推理步骤
ResponseReasoningStep, # 响应推理步骤
)
from llama_index.core.agent import Task, AgentChatResponse # 任务,代理聊天响应
from llama_index.core.query_pipeline import (
AgentInputComponent, # 代理输入组件
AgentFnComponent, # 代理函数组件
CustomAgentComponent, # 自定义代理组件
QueryComponent, # 查询组件
ToolRunnerComponent, # 工具运行组件
)
from llama_index.core.llms import MessageRole # 消息角色
from typing import Dict, Any, Optional, Tuple, List, cast # 导入类型提示
## 代理输入组件
## 这是生成代理输入给其他组件的组件
## 也可以在这里放置初始化逻辑。
def agent_input_fn(task: Task, state: Dict[str, Any]) -> Dict[str, Any]:
"""代理输入函数。
返回:
一个包含输出键和值的字典。如果在定义该组件与其他组件之间的链接时指定了src_key,
请确保src_key与指定的output_key匹配。
"""
# 初始化当前推理
if "current_reasoning" not in state:
state["current_reasoning"] = []
reasoning_step = ObservationReasoningStep(observation=task.input)
state["current_reasoning"].append(reasoning_step)
return {"input": task.input}
agent_input_component = AgentInputComponent(fn=agent_input_fn)
定义Agent提示¶
在这里我们定义了生成ReAct提示的Agent组件,输出从LLM生成后,解析为一个结构化对象。
在接收到输入后,LLM会使用ReAct agent提示进行调用。
ReActChatFormatter
基本上使用ReAct提示(Chain-Of-Thought + Acting)方法生成一个完全格式化的ReAct提示。
from llama_index.core.agent import ReActChatFormatter
from llama_index.core.query_pipeline import InputComponent, Link
from llama_index.core.llms import ChatMessage
from llama_index.core.tools import BaseTool
## 定义提示函数
def react_prompt_fn(
task: Task, state: Dict[str, Any], input: str, tools: List[BaseTool]
) -> List[ChatMessage]:
# 将输入添加到推理中
chat_formatter = ReActChatFormatter()
return chat_formatter.format(
tools,
chat_history=task.memory.get() + state["memory"].get_all(),
current_reasoning=state["current_reasoning"],
)
react_prompt_component = AgentFnComponent(
fn=react_prompt_fn, partial_dict={"tools": query_engine_tools}
)
定义代理输出解析器 + 工具流水线¶
一旦LLM给出一个输出,我们就有一个决策树:
如果给出了一个答案,那么我们就完成了。处理输出。
如果给出了一个动作,我们需要使用指定的工具和指定的参数执行指定的工具,然后处理输出。
工具调用可以通过ToolRunnerComponent
模块来实现。这是一个简单的包装模块,它接受一个工具列表,并可以使用指定的工具名称(每个工具都有一个名称)和工具动作来“执行”。
我们实现了这个整体模块OutputAgentComponent
,它是CustomAgentComponent
的子类。
perse_react_output_fn
函数简单地将从react_prompt_fn
得到的ReAct提示解析为推理步骤。
在这种情况下,ReAct代理选择使用工具或完成工具,并简单地获取输出,这将适合于代理的聊天响应(AgentChatResponse
)。
run_tool_fn
函数简单地运行所选的工具。
最后,根据代理输出格式,通过应用process_agent_response_fn
函数来编辑传入的输出。
from typing import Set, Optional
from llama_index.core.agent.react.output_parser import ReActOutputParser
from llama_index.core.llms import ChatResponse
from llama_index.core.agent.types import Task
def parse_react_output_fn(
task: Task, state: Dict[str, Any], chat_response: ChatResponse
):
"""将ReAct输出解析为推理步骤。"""
output_parser = ReActOutputParser()
reasoning_step = output_parser.parse(chat_response.message.content)
return {"done": reasoning_step.is_done, "reasoning_step": reasoning_step}
parse_react_output = AgentFnComponent(fn=parse_react_output_fn)
def run_tool_fn(
task: Task, state: Dict[str, Any], reasoning_step: ActionReasoningStep
):
"""运行工具并处理工具输出。"""
tool_runner_component = ToolRunnerComponent(
query_engine_tools, callback_manager=task.callback_manager
)
tool_output = tool_runner_component.run_component(
tool_name=reasoning_step.action,
tool_input=reasoning_step.action_input,
)
observation_step = ObservationReasoningStep(observation=str(tool_output))
state["current_reasoning"].append(observation_step)
# TODO: 获取输出
return {"response_str": observation_step.get_content(), "is_done": False}
run_tool = AgentFnComponent(fn=run_tool_fn)
def process_response_fn(
task: Task, state: Dict[str, Any], response_step: ResponseReasoningStep
):
"""处理响应。"""
state["current_reasoning"].append(response_step)
response_str = response_step.response
# 现在我们完成了这一步,将其放入内存
state["memory"].put(ChatMessage(content=task.input, role=MessageRole.USER))
state["memory"].put(
ChatMessage(content=response_str, role=MessageRole.ASSISTANT)
)
return {"response_str": response_str, "is_done": True}
process_response = AgentFnComponent(fn=process_response_fn)
def process_agent_response_fn(
task: Task, state: Dict[str, Any], response_dict: dict
):
"""处理代理响应。"""
return (
AgentChatResponse(response_dict["response_str"]),
response_dict["is_done"],
)
process_agent_response = AgentFnComponent(fn=process_agent_response_fn)
拼接代理查询管道¶
现在我们可以将顶层代理管道拼接起来:agent_input -> react_prompt -> llm -> react_output。
最后一个组件是if-else组件,用于调用子组件。
from llama_index.core.query_pipeline import QueryPipeline as QP
qp = QP(verbose=True)
from llama_index.core.query_pipeline import QueryPipeline as QP
from llama_index.llms.openai import OpenAI
qp.add_modules(
{
"agent_input": agent_input_component,
"react_prompt": react_prompt_component,
"llm": OpenAI(model="gpt-4-1106-preview"),
"react_output_parser": parse_react_output,
"run_tool": run_tool,
"process_response": process_response,
"process_agent_response": process_agent_response,
}
)
# 将输入链接到反应提示以解析出响应(工具操作/输入或观察)
qp.add_chain(["agent_input", "react_prompt", "llm", "react_output_parser"])
# 从反应输出到工具调用添加条件链接(如果未完成)
qp.add_link(
"react_output_parser",
"run_tool",
condition_fn=lambda x: not x["done"],
input_fn=lambda x: x["reasoning_step"],
)
# 从反应输出到最终响应处理添加条件链接(如果完成)
qp.add_link(
"react_output_parser",
"process_response",
condition_fn=lambda x: x["done"],
input_fn=lambda x: x["reasoning_step"],
)
# 无论是响应处理还是工具输出处理,都添加链接到最终代理响应
qp.add_link("process_response", "process_agent_response")
qp.add_link("run_tool", "process_agent_response")
可视化查询管道¶
from pyvis.network import Network
net = Network(notebook=True, cdn_resources="in_line", directed=True)
net.from_nx(qp.clean_dag)
print(net)
{ "Nodes": [ "agent_input", "react_prompt", "llm", "react_output_parser", "run_tool", "process_response", "process_agent_response" ], "Edges": [ { "src_key": null, "dest_key": null, "condition_fn": null, "input_fn": null, "width": 1, "from": "agent_input", "to": "react_prompt", "arrows": "to" }, { "src_key": null, "dest_key": null, "condition_fn": null, "input_fn": null, "width": 1, "from": "react_prompt", "to": "llm", "arrows": "to" }, { "src_key": null, "dest_key": null, "condition_fn": null, "input_fn": null, "width": 1, "from": "llm", "to": "react_output_parser", "arrows": "to" }, { "src_key": null, "dest_key": null, "width": 1, "from": "react_output_parser", "to": "run_tool", "arrows": "to" }, { "src_key": null, "dest_key": null, "width": 1, "from": "react_output_parser", "to": "process_response", "arrows": "to" }, { "src_key": null, "dest_key": null, "condition_fn": null, "input_fn": null, "width": 1, "from": "run_tool", "to": "process_agent_response", "arrows": "to" }, { "src_key": null, "dest_key": null, "condition_fn": null, "input_fn": null, "width": 1, "from": "process_response", "to": "process_agent_response", "arrows": "to" } ], "Height": "600px", "Width": "100%", "Heading": "" }
# 将网络保存为"agent_dag.html"
net.write_html("agent_dag.html")
from IPython.display import display, HTML
# 读取HTML文件的内容
with open("agent_dag.html", "r") as file:
html_content = file.read()
# 显示HTML内容
display(HTML(html_content))
在我们的查询引擎周围设置代理工作程序¶
from llama_index.core.agent import QueryPipelineAgentWorker
from llama_index.core.callbacks import CallbackManager
agent_worker = QueryPipelineAgentWorker(qp)
agent = agent_worker.as_agent(
callback_manager=CallbackManager([]), verbose=True
)
运行代理程序¶
# 开始任务
task = agent.create_task(
"Uber的管理层对财务报告内部控制的报告是什么?"
)
step_output = agent.run_step(task.task_id)
> Running step 26c623b9-0864-45d9-9f91-f893a4696727. Step input: What was Uber's Management's Report on Internal Control over Financial Reporting? > Running module agent_input with input: state: {'sources': [], 'memory': ChatMemoryBuffer(token_limit=3000, tokenizer_fn=functools.partial(<bound method Encoding.encode of <Encoding 'cl100k_base'>>, allowed_special='all'), chat_store=SimpleChatSto... task: task_id='aa7707d1-a35a-4d96-b2cc-ded765a3a3e2' input="What was Uber's Management's Report on Internal Control over Financial Reporting?" memory=ChatMemoryBuffer(token_limit=3000, tokenizer_fn=functool... > Running module react_prompt with input: input: What was Uber's Management's Report on Internal Control over Financial Reporting? > Running module llm with input: messages: [ChatMessage(role=<MessageRole.SYSTEM: 'system'>, content='\nYou are designed to help with a variety of tasks, from answering questions to providing summaries to other types of analyses.\n\n## Too... > Running module react_output_parser with input: chat_response: assistant: Thought: I need to use the uber_10k tool to find the specific section about Uber's Management's Report on Internal Control over Financial Reporting for the year 2021. Action: uber_10k Actio... > Running module run_tool with input: reasoning_step: thought="I need to use the uber_10k tool to find the specific section about Uber's Management's Report on Internal Control over Financial Reporting for the year 2021." action='uber_10k' action_input={... > Running module process_agent_response with input: response_dict: {'response_str': 'Observation: {\'output\': ToolOutput(content="Uber\'s Management\'s Report on Internal Control over Financial Reporting stated that they excluded The Drizly Group, Inc. and TupeloPar...
print(step_output)
Observation: {'output': ToolOutput(content="Uber's Management's Report on Internal Control over Financial Reporting stated that they excluded The Drizly Group, Inc. and TupeloParent, Inc. from their assessment of internal control over financial reporting as of December 31, 2021 due to their acquisition by the company during 2021. The report also mentioned that Drizly and TupeloParent were excluded from the audit of internal control over financial reporting.", tool_name='uber_10k', raw_input={'input': "What was Uber's Management's Report on Internal Control over Financial Reporting?"}, raw_output=Response(response="Uber's Management's Report on Internal Control over Financial Reporting stated that they excluded The Drizly Group, Inc. and TupeloParent, Inc. from their assessment of internal control over financial reporting as of December 31, 2021 due to their acquisition by the company during 2021. The report also mentioned that Drizly and TupeloParent were excluded from the audit of internal control over financial reporting.", source_nodes=[NodeWithScore(node=TextNode(id_='931833d8-5d9e-4f37-bd0b-1ffeb58f0256', embedding=None, metadata={'page_label': '73', 'file_name': 'uber_2021.pdf', 'file_path': 'data/10k/uber_2021.pdf', 'file_type': 'application/pdf', 'file_size': 1880483, 'creation_date': '2024-03-12', 'last_modified_date': '2024-03-12'}, excluded_embed_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], excluded_llm_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], relationships={<NodeRelationship.SOURCE: '1'>: RelatedNodeInfo(node_id='239d870b-d23e-4805-8761-5e83f826f10a', node_type=<ObjectType.DOCUMENT: '4'>, metadata={'page_label': '73', 'file_name': 'uber_2021.pdf', 'file_path': 'data/10k/uber_2021.pdf', 'file_type': 'application/pdf', 'file_size': 1880483, 'creation_date': '2024-03-12', 'last_modified_date': '2024-03-12'}, hash='0037c6d1cdc56230c931100529a1d35ea0d556331ddae62b0b342c2403104e69'), <NodeRelationship.PREVIOUS: '2'>: RelatedNodeInfo(node_id='733e2fd3-fded-4e9d-8698-a16782d23a57', node_type=<ObjectType.TEXT: '1'>, metadata={'page_label': '73', 'file_name': 'uber_2021.pdf', 'file_path': 'data/10k/uber_2021.pdf', 'file_type': 'application/pdf', 'file_size': 1880483, 'creation_date': '2024-03-12', 'last_modified_date': '2024-03-12'}, hash='3c2f360445d5ff1069578c4a7ba2867bd32389a5ab93ecd5ee1c8998a7c1f5fa'), <NodeRelationship.NEXT: '3'>: RelatedNodeInfo(node_id='4876454e-2f82-4460-937a-fe7398fb5974', node_type=<ObjectType.TEXT: '1'>, metadata={}, hash='bb5f14b14770778aa72510551a86642ba81040186ee787609ae76877639d2590')}, text='Our audits also included evaluating the accounting principles used and significantestimates\n made by management, as well as evaluating the overall presentation of the consolidated financial statements. Our audit of internal control over financialreporting\n included obtaining an understanding of internal control over financial reporting, assessing the risk that a material weakness exists, and testing andevaluating\n the design and operating effectiveness of internal control based on the assessed risk. Our audits also included performing such other procedures as weconsidered necessary in th\ne circumstances. We believe that our audits provide a reasonable basis for our opinions.As\n described in Management’s Report on Internal Control over Financial Reporting, management has excluded The Drizly Group, Inc. (“Drizly”) and TupeloParent, Inc. (“Transplace”) from its assessment of internal control over financial reporting as of December 3\n1, 2021 because they were acquired by the Company inpurchase\n business combinations during 2021. We have also excluded Drizly and Transplace from our audit of internal control over financial reporting. Drizly andTransplace\n are wholly-owned subsidiaries whose total assets and total revenues excluded from management’s assessment and our audit of internal control overfinancial\n reporting collectively represent approximately 3% and 4%, respectively, of the related consolidated financial statement amounts as of and for the yearended December 31, 2021.\nDefinition and Limitations of Internal Control over Financial Repor\ntingA\n company’s internal control over financial reporting is a process designed to provide reasonable assurance regarding the reliability of financial reporting and thepreparation\n of financial statements for external purposes in accordance with generally accepted accounting principles. A company’s internal control over financialreporting includes those policies and procedures that (i) pertain to the maintenance of records that, in reasonable detail, accurately an\nd fairly reflect the transactionsand\n dispositions of the assets of the company; (ii) provide reasonable assurance that transactions are recorded as necessary to permit preparation of financialstatements in accordance with\n generally accepted accounting principles, and that receipts and expenditures of the company are being made only in accordance withauthorizations of management\n and directors of the company; and (iii) provide reasonable assurance regarding71', start_char_idx=3733, end_char_idx=6274, text_template='{metadata_str}\n\n{content}', metadata_template='{key}: {value}', metadata_seperator='\n'), score=0.9047882048131767), NodeWithScore(node=TextNode(id_='733e2fd3-fded-4e9d-8698-a16782d23a57', embedding=None, metadata={'page_label': '73', 'file_name': 'uber_2021.pdf', 'file_path': 'data/10k/uber_2021.pdf', 'file_type': 'application/pdf', 'file_size': 1880483, 'creation_date': '2024-03-12', 'last_modified_date': '2024-03-12'}, excluded_embed_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], excluded_llm_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], relationships={<NodeRelationship.SOURCE: '1'>: RelatedNodeInfo(node_id='239d870b-d23e-4805-8761-5e83f826f10a', node_type=<ObjectType.DOCUMENT: '4'>, metadata={'page_label': '73', 'file_name': 'uber_2021.pdf', 'file_path': 'data/10k/uber_2021.pdf', 'file_type': 'application/pdf', 'file_size': 1880483, 'creation_date': '2024-03-12', 'last_modified_date': '2024-03-12'}, hash='0037c6d1cdc56230c931100529a1d35ea0d556331ddae62b0b342c2403104e69'), <NodeRelationship.PREVIOUS: '2'>: RelatedNodeInfo(node_id='5c1073c7-33f4-4f95-bb85-515619f4135a', node_type=<ObjectType.TEXT: '1'>, metadata={'page_label': '72', 'file_name': 'uber_2021.pdf', 'file_path': 'data/10k/uber_2021.pdf', 'file_type': 'application/pdf', 'file_size': 1880483, 'creation_date': '2024-03-12', 'last_modified_date': '2024-03-12'}, hash='5e414926a8e5d3a1ad31529426a96d04ce0fd55f12624297c511c6fa00845bb3'), <NodeRelationship.NEXT: '3'>: RelatedNodeInfo(node_id='931833d8-5d9e-4f37-bd0b-1ffeb58f0256', node_type=<ObjectType.TEXT: '1'>, metadata={}, hash='87fae4857bb55d49c262875bb681de6578c8bf807af889f1cfdd6edc819c7ab2')}, text="Report of Independent Registered Public Accounting FirmTo the Board of Directors and Stockhold\ners of Uber Technologies, Inc.Opinions on the Financial Statements and Internal Control over Financial Reporting\nWe\n have audited the accompanying consolidated balance sheets of Uber Technologies, Inc. and its subsidiaries (the “Company”) as of December 31, 2021 and2020,\n and the related consolidated statements of operations, of comprehensive loss, of redeemable non-controlling interests and equity and of cash flows for eachof\n the three years in the period ended December 31, 2021, including the related notes and financial statement schedule listed in the accompanying index(collectively\n referred to as the “consolidated financial statements”). We also have audited the Company's internal control over financial reporting as of December31,\n 2021, based on criteria established in Internal Control - Integrated Framework (2013) issued by the Committee of Sponsoring Organizations of the TreadwayCommission (COSO).\nIn our\n opinion, the consolidated financial statements referred to above present fairly, in all material respects, the financial position of the Company as of December31,\n 2021 and 2020, and the results of its operations and its cash flows for each of the three years in the period ended December 31, 2021 in conformity withaccounting\n principles generally accepted in the United States of America. Also in our opinion, the Company maintained, in all material respects, effective internalcontrol over financia\nl reporting as of December 31, 2021, based on criteria established in Internal Control - Integrated Framework (2013) issued by the COSO.Changes in Accounting Principles\nAs discussed in\n Note 1 to the consolidated financial statements, the Company changed the manner in which it accounts for convertible instruments and contracts inan entity’s own equity in 2021 and the \nmanner in which it accounts for leases in 2019.Basis for Opinions\nThe\n Company's management is responsible for these consolidated financial statements, for maintaining effective internal control over financial reporting, and forits\n assessment of the effectiveness of internal control over financial reporting, included in Management’s Report on Internal Control over Financial Reportingappearing under Item\n 9A. Our responsibility is to express opinions on the Company’s consolidated financial statements and on the Company's internal control overfinancial\n reporting based on our audits. We are a public accounting firm registered with the Public Company Accounting Oversight Board (United States)(PCAOB)\n and are required to be independent with respect to the Company in accordance with the U.S. federal securities laws and the applicable rules andregulations of the Securi\nties and Exchange Commission and the PCAOB.We\n conducted our audits in accordance with the standards of the PCAOB. Those standards require that we plan and perform the audits to obtain reasonableassurance\n about whether the consolidated financial statements are free of material misstatement, whether due to error or fraud, and whether effective internalcontrol over financial reporti\nng was maintained in all material respects.Our\n audits of the consolidated financial statements included performing procedures to assess the risks of material misstatement of the consolidated financialstatements,\n whether due to error or fraud, and performing procedures that respond to those risks. Such procedures included examining, on a test basis, evidenceregarding\n the amounts and disclosures in the consolidated financial statements. Our audits also included evaluating the accounting principles used and significantestimates\n made by management, as well as evaluating the overall presentation of the consolidated financial statements. Our audit of internal control over financialreporting\n included obtaining an understanding of internal control over financial reporting, assessing the risk that a material weakness exists, and testing andevaluating\n the design and operating effectiveness of internal control based on the assessed risk. Our audits also included performing such other procedures as weconsidered necessary in th\ne circumstances. We believe that our audits provide a reasonable basis for our opinions.As\n described in Management’s Report on Internal Control over Financial Reporting, management has excluded The Drizly Group, Inc. (“Drizly”) and TupeloParent, Inc.", start_char_idx=0, end_char_idx=4599, text_template='{metadata_str}\n\n{content}', metadata_template='{key}: {value}', metadata_seperator='\n'), score=0.8978082427817372), NodeWithScore(node=TextNode(id_='8bd26e38-840b-46ee-88d3-7bfe8f4285da', embedding=None, metadata={'page_label': '306', 'file_name': 'uber_2021.pdf', 'file_path': 'data/10k/uber_2021.pdf', 'file_type': 'application/pdf', 'file_size': 1880483, 'creation_date': '2024-03-12', 'last_modified_date': '2024-03-12'}, excluded_embed_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], excluded_llm_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], relationships={<NodeRelationship.SOURCE: '1'>: RelatedNodeInfo(node_id='64b95267-2f6a-4c1f-8d8f-9de7fe76f4c8', node_type=<ObjectType.DOCUMENT: '4'>, metadata={'page_label': '306', 'file_name': 'uber_2021.pdf', 'file_path': 'data/10k/uber_2021.pdf', 'file_type': 'application/pdf', 'file_size': 1880483, 'creation_date': '2024-03-12', 'last_modified_date': '2024-03-12'}, hash='df98f8c54de64315e8021891795f855846ef72199e1261097b125f88c8178f86'), <NodeRelationship.PREVIOUS: '2'>: RelatedNodeInfo(node_id='75ed4d3d-893c-4466-8dc7-687f1934419b', node_type=<ObjectType.TEXT: '1'>, metadata={'page_label': '305', 'file_name': 'uber_2021.pdf', 'file_path': 'data/10k/uber_2021.pdf', 'file_type': 'application/pdf', 'file_size': 1880483, 'creation_date': '2024-03-12', 'last_modified_date': '2024-03-12'}, hash='2137604806ace0fa5b98cfb9734001992adc7b29e39ae0c0a7825cb9f6d5602e'), <NodeRelationship.NEXT: '3'>: RelatedNodeInfo(node_id='cd51a0cc-80a7-421b-ae34-c7b914f997e6', node_type=<ObjectType.TEXT: '1'>, metadata={}, hash='3249f19608f14fd995c4e7168eeaecbb6a5663275b96522764a0d0521c921ae7')}, text='Exhibit 31.2CERTIFICATION OF PR\nINCIPAL FINANCIAL OFFICERPURSUANT TO EXCHANGE A\nCT RULES 13a-14(a) AND 15d-14(a)AS ADOPTED PURSUANT TO SECTI\nON 302 OF THE SARBANES-OXLEY ACT OF 2002I, Nelson Chai, certify that:\n1.\nI have reviewed this Annual Report on For m 10-K of Uber Technologies, Inc.;2.\nBased on my knowledge, this report does not contain any untrue statement of a material fact or omit to state a material fact necessary to make thestatements made, in l\night of the circumstances under which such statements were made, not misleading with respect to the period covered by this report;3.\nBased on my knowledge, the financia l statements, and other financial information included in this report, fairly present in all material respects thefinancial condition, r\nesults of operations and cash flows of the registrant as of, and for, the periods presented in this report;4.\nThe registrant’s other certifying officer and I are responsible for establishing and maintaining disclosure controls and procedures (as defined in ExchangeAct Rules 13a-15(e) and 15d-15(e)\n) and internal control over financial reporting (as defined in Exchange Act Rules 13a-15(f) and 15d-15(f)) for theregistrant and have:\n(a)\nDesigned such disclosure controls and procedures, or caused such disclosure controls and procedures to be designed under our supervision, toensure that materi\nal information relating to the registrant, including its consolidated subsidiaries, is made known to us by others within thoseentities, particul\narly during the period in which this report is being prepared;(b)\nDesigned such internal contro l over financial reporting, or caused such internal control over financial reporting to be designed under oursupervision, to provide reasonab\nle assurance regarding the reliability of financial reporting and the preparation of financial statements forexternal purposes in acc\nordance with generally accepted accounting principles;(c)\nEvaluated the effec tiveness of the registrant’s disclosure controls and procedures and presented in this report our conclusions about theeffectiveness of the d\nisclosure controls and procedures, as of the end of the period covered by this report based on such evaluation; and(d)\nDisclosed in this report any ch ange in the registrant’s internal control over financial reporting that occurred during the registrant’s most recentfiscal quarter (the registrant’s f\nourth fiscal quarter in the case of an annual report) that has materially affected, or is reasonably likely tomaterially affect, the registrant’s inter\nnal control over financial reporting; and5.\nThe registrant’s other certifying officer and I have disclosed, based on our most recent evaluation of internal control over financial reporting, to theregistrant’s auditors and\n the audit committee of the registrant’s board of directors (or persons performing the equivalent functions):(a)\nAll significant defic iencies and material weaknesses in the design or operation of internal control over financial reporting which are reasonablylikely to adversely affect the\n registrant’s ability to record, process, summarize and report financial information; and(b)\nAny fraud, whether or not mater ial, that involves management or other employees who have a significant role in the registrant’s internal controlover financial reporting.\nDate:\nFebruary 24, 2022 By: /s/ Nelson Chai Nelson Chai\nChief Financial Officer\n(Principal Financial Offic\ner)', start_char_idx=0, end_char_idx=3440, text_template='{metadata_str}\n\n{content}', metadata_template='{key}: {value}', metadata_seperator='\n'), score=0.876161937500491)], metadata={'931833d8-5d9e-4f37-bd0b-1ffeb58f0256': {'page_label': '73', 'file_name': 'uber_2021.pdf', 'file_path': 'data/10k/uber_2021.pdf', 'file_type': 'application/pdf', 'file_size': 1880483, 'creation_date': '2024-03-12', 'last_modified_date': '2024-03-12'}, '733e2fd3-fded-4e9d-8698-a16782d23a57': {'page_label': '73', 'file_name': 'uber_2021.pdf', 'file_path': 'data/10k/uber_2021.pdf', 'file_type': 'application/pdf', 'file_size': 1880483, 'creation_date': '2024-03-12', 'last_modified_date': '2024-03-12'}, '8bd26e38-840b-46ee-88d3-7bfe8f4285da': {'page_label': '306', 'file_name': 'uber_2021.pdf', 'file_path': 'data/10k/uber_2021.pdf', 'file_type': 'application/pdf', 'file_size': 1880483, 'creation_date': '2024-03-12', 'last_modified_date': '2024-03-12'}}))}
# 开始任务
task = agent.create_task("2021年Lyft的营收增长情况是多少?")
step_output = agent.run_step(task.task_id)
> Running step ee9eff5f-a4be-4b76-bae6-d05d2af41ecd. Step input: What was Lyft's revenue growth in 2021? > Running module agent_input with input: state: {'sources': [], 'memory': ChatMemoryBuffer(token_limit=3000, tokenizer_fn=functools.partial(<bound method Encoding.encode of <Encoding 'cl100k_base'>>, allowed_special='all'), chat_store=SimpleChatSto... task: task_id='7a038afc-3ead-4b0c-a924-41cd4f465270' input="What was Lyft's revenue growth in 2021?" memory=ChatMemoryBuffer(token_limit=3000, tokenizer_fn=functools.partial(<bound method Encoding.encode of... > Running module react_prompt with input: input: What was Lyft's revenue growth in 2021? > Running module llm with input: messages: [ChatMessage(role=<MessageRole.SYSTEM: 'system'>, content='\nYou are designed to help with a variety of tasks, from answering questions to providing summaries to other types of analyses.\n\n## Too... > Running module react_output_parser with input: chat_response: assistant: Thought: I need to use the lyft_10k tool to find out the revenue growth for Lyft in 2021. Action: lyft_10k Action Input: {"input": "What was Lyft's revenue growth in 2021?"} > Running module run_tool with input: reasoning_step: thought='I need to use the lyft_10k tool to find out the revenue growth for Lyft in 2021.' action='lyft_10k' action_input={'input': "What was Lyft's revenue growth in 2021?"} > Running module process_agent_response with input: response_dict: {'response_str': 'Observation: {\'output\': ToolOutput(content="Lyft\'s revenue increased by 36% in 2021 compared to the prior year.", tool_name=\'lyft_10k\', raw_input={\'input\': "What was Lyft\'s r...
step_output = agent.run_step(task.task_id)
> Running step 279c7a46-ce9d-4202-bec4-01d5c1ed50bd. Step input: None > Running module agent_input with input: state: {'sources': [], 'memory': ChatMemoryBuffer(token_limit=3000, tokenizer_fn=functools.partial(<bound method Encoding.encode of <Encoding 'cl100k_base'>>, allowed_special='all'), chat_store=SimpleChatSto... task: task_id='7a038afc-3ead-4b0c-a924-41cd4f465270' input="What was Lyft's revenue growth in 2021?" memory=ChatMemoryBuffer(token_limit=3000, tokenizer_fn=functools.partial(<bound method Encoding.encode of... > Running module react_prompt with input: input: What was Lyft's revenue growth in 2021? > Running module llm with input: messages: [ChatMessage(role=<MessageRole.SYSTEM: 'system'>, content='\nYou are designed to help with a variety of tasks, from answering questions to providing summaries to other types of analyses.\n\n## Too... > Running module react_output_parser with input: chat_response: assistant: Thought: The user has repeated the question, but the tool has already provided the answer. Answer: Lyft's revenue increased by 36% in 2021 compared to the prior year. > Running module process_response with input: response_step: thought='The user has repeated the question, but the tool has already provided the answer.' response="Lyft's revenue increased by 36% in 2021 compared to the prior year." is_streaming=False > Running module process_agent_response with input: response_dict: {'response_str': "Lyft's revenue increased by 36% in 2021 compared to the prior year.", 'is_done': True}
step_output.is_last
True
print(step_output)
Uber's Management's Report on Internal Control over Financial Reporting for the year ended December 31, 2021, stated that management excluded The Drizly Group, Inc. ("Drizly") and TupeloParent, Inc. ("Transplace") from its assessment of internal control over financial reporting. This exclusion was due to their acquisition by the company during 2021. Drizly and Transplace were wholly-owned subsidiaries whose total assets and total revenues collectively represented approximately 3% and 4%, respectively, of the related consolidated financial statement amounts for the year.
response = agent.finalize_response(task.task_id)
print(str(response))
Uber's Management's Report on Internal Control over Financial Reporting for the year ended December 31, 2021, stated that management excluded The Drizly Group, Inc. ("Drizly") and TupeloParent, Inc. ("Transplace") from its assessment of internal control over financial reporting. This exclusion was due to their acquisition by the company during 2021. Drizly and Transplace were wholly-owned subsidiaries whose total assets and total revenues collectively represented approximately 3% and 4%, respectively, of the related consolidated financial statement amounts for the year.