AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


Llamaindex最佳实践:13.ReAct 代理 - 简单的计算器工具介绍
发布日期:2024-06-06 12:43:28 浏览次数: 1881


这是一个展示 ReAct 代理如何使用简单的计算器工具(没有复杂的 RAG 管道或 API 调用)的笔记本。

我们将展示它如何逐步推理,使用不同的工具来实现最终目标。

如果你在 colab 中打开这个笔记本,你可能需要安装 LlamaIndex ?。

%pip install llama-index-llms-openai
!pip install llama-index
from llama_index.core.agent import ReActAgent
from llama_index.llms.openai import OpenAI
from llama_index.core.llms import ChatMessage
from llama_index.core.tools import BaseTool, FunctionTool
[nltk_data] Downloading package stopwords to /Users/jerryliu/Programmi
[nltk_data] ng/gpt_index/.venv/lib/python3.10/site-
[nltk_data] packages/llama_index/legacy/_static/nltk_cache...
[nltk_data] Unzipping corpora/stopwords.zip.
[nltk_data] Downloading package punkt to /Users/jerryliu/Programming/g
[nltk_data] pt_index/.venv/lib/python3.10/site-
[nltk_data] packages/llama_index/legacy/_static/nltk_cache...
[nltk_data] Unzipping tokenizers/punkt.zip.

定义函数工具

我们设置一些简单的 multiply  add 工具。请注意,你可以定义任意函数并传递给 FunctionTool(它将处理docstring和参数签名)。

def  multiply(a: int, b: int) -> int:
"""将两个整数相乘并返回结果整数"""
return a * b


multiply_tool = FunctionTool.from_defaults(fn=multiply)
def  add(a: int, b: int) -> int:
"""将两个整数相加并返回结果整数"""
return a + b


add_tool = FunctionTool.from_defaults(fn=add)

运行一些查询

gpt-3.5-turbo

llm = OpenAI(model="gpt-3.5-turbo-instruct")
agent = ReActAgent.from_tools([multiply_tool, add_tool], llm=llm, verbose=True)
response = agent.chat("20+(2*4) 的计算步骤是什么?")
Thought:  我需要使用工具来帮助我回答问题。
Action: multiply
Action Input: {"a": 2, "b": 4}
Observation: 8
Thought: 我需要使用工具来帮助我回答问题。
Action: add
Action Input: {"a": 20, "b": 8}
Observation: 28
Thought: 我不需要再使用任何工具就可以回答。
Answer: 28
response_gen = agent.stream_chat("20+2*4 的计算步骤是什么?")
response_gen.print_response_stream()
28

GPT-4

llm = OpenAI(model="gpt-4")
agent = ReActAgent.from_tools([multiply_tool, add_tool], llm=llm, verbose=True)
response = agent.chat("2+2*4 是多少")
print(response)
Thought:  我需要使用工具来帮助我回答问题。根据数学中的运算顺序(BIDMAS/BODMAS),乘法应该在加法之前进行。所以,我首先会计算  2   4  的乘积,然后将结果加到  2  上。
Action: multiply
Action Input: {'a': 2, 'b': 4}
Observation: 8
Thought: 现在我有了乘法的结果,接下来需要将这个结果加到 2 上。
Action: add
Action Input: {'a': 2, 'b': 8}
Observation: 10
Thought: 我可以直接给出答案,无需再使用工具。
Answer: 10

查看提示

让我们来看看驱动 ReAct 代理的核心系统提示!

在代理内部,当前的对话历史记录将在这行下面显示。

llm = OpenAI(model="gpt-4")
agent = ReActAgent.from_tools([multiply_tool, add_tool], llm=llm, verbose=True)
prompt_dict = agent.get_prompts()
for k, v in prompt_dict.items():
print(f"提示: {k}\n\n值: {v.template}")
提示: agent_worker:system_prompt

值:
你被设计来帮助处理各种任务,从回答问题到提供摘要以及其他类型的分析。

## 工具
你有多种工具可供使用。你负责根据完成手头任务所需的情况,以任何适当的顺序使用这些工具。
这可能需要将任务分解为子任务,并使用不同的工具来完成每个子任务。

你有以下工具可用:
{tool_desc}

## 输出格式
为了回答问题,请使用以下格式。

```
思考:我需要使用工具来帮助我回答问题。
操作:工具名称({tool_names} 中的一个),如果使用工具。
操作输入:以 JSON 格式表示的工具参数(例如,{{"input": "hello world", "num_beams": 5}})
`
``

请始终以“思考”开始。

请使用有效的 JSON 格式为“操作输入”。不要这样做 {{'input': 'hello world', 'num_beams': 5}}。

如果使用此格式,用户将按以下格式响应:

```
观察:工具响应
`
``

你应该一直重复上述格式,直到你有了足够的信息
不再使用任何工具来回答问题。到那时,你必须以以下两种格式之一回答:

```
思考:我不需要再使用任何工具就可以回答。
回答:[你的答案]
`
``

```
思考:我无法用提供的工具回答问题。
回答:抱歉,我无法回答你的问题。
`
``

## 当前对话
以下是交错的人类和助手消息的当前对话。

自定义提示

为了增加趣味性,让我们尝试让助手在回答时附带解释答案的步骤,以项目符号列出。请查看"## 额外规则"部分。

from llama_index.core import PromptTemplate

react_system_header_str = """\

You are designed to help with a variety of tasks, from answering questions \
to providing summaries to other types of analyses.

## Tools
You have access to a wide variety of tools. You are responsible for using
the tools in any sequence you deem appropriate to complete the task at hand.
This may require breaking the task into subtasks and using different tools
to complete each subtask.

You have access to the following tools:
{tool_desc}

## Output Format
To answer the question, please use the following format.

```
Thought: I need to use a tool to help me answer the question.
Action: tool name (one of {tool_names}) if using a tool.
Action Input: the input to the tool, in a JSON format representing the kwargs (e.g. {{"input": "hello world", "num_beams": 5}})
```

Please ALWAYS start with a Thought.

Please use a valid JSON format for the Action Input. Do NOT do this {{'input': 'hello world', 'num_beams': 5}}.

If this format is used, the user will respond in the following format:

```
Observation: tool response
```

You should keep repeating the above format until you have enough information
to answer the question without using any more tools. At that point, you MUST respond
in the one of the following two formats:

```
Thought: I can answer without using any more tools.
Answer: [your answer here]
```

```
Thought: I cannot answer the question with the provided tools.
Answer: Sorry, I cannot answer your query.
```

## Additional Rules
- The answer MUST contain a sequence of bullet points that explain how you arrived at the answer. This can include aspects of the previous conversation history.
- You MUST obey the function signature of each tool. Do NOT pass in no arguments if the function expects arguments.

## Current Conversation
Below is the current conversation consisting of interleaving human and assistant messages.

"""

react_system_prompt = PromptTemplate(react_system_header_str)

agent.get_prompts()
{'agent_worker:system_prompt': PromptTemplate(metadata={'prompt_type': <PromptType.CUSTOM: 'custom'>}, template_vars=['tool_desc', 'tool_names'], kwargs={}, output_parser=None, template_var_mappings=None, function_mappings=None, template='\nYou are designed to help with a variety of tasks, from answering questions to providing summaries to other types of analyses.\n\n## Tools\nYou have access to a wide variety of tools. You are responsible for  using\nthe tools in any sequence you deem appropriate to complete the task at hand.\nThis may require breaking the task into subtasks and using different tools\nto complete each subtask.\n\nYou have access to the following tools:\n{tool_desc}\n\n## Output Format\nTo answer the question, please use the following format.\n\n```\nThought: I need to use a tool to help me answer the question.\nAction: tool name (one of {tool_names}) if using a tool.\nAction Input: the input to the tool, in a JSON format representing the kwargs (e.g. {{"input": "hello world", "num_beams": 5}})\n```\n\nPlease ALWAYS start with a Thought.\n\nPlease use a valid JSON format for  the Action Input. Do NOT do this {{\'input\': \'hello world\', \'num_beams\': 5}}.\n\nIf this format is used, the user will respond in the following format:\n\n```\nObservation: tool response\n```\n\nYou should keep repeating the above format until you have enough information\nto answer the question without using any more tools. At that point, you MUST respond\nin the one of the following two formats:\n\n```\nThought: I can answer without using any more tools.\nAnswer: [your answer here]\n```\n\n```\nThought: I cannot answer the question with the provided tools.\nAnswer: Sorry, I cannot answer your query.\n```\n\n## Current Conversation\nBelow is the current conversation consisting of interleaving human and assistant messages.\n\n')}
agent.update_prompts({"agent_worker:system_prompt": react_system_prompt})
agent.reset()
response = agent.chat("5+3+2 是多少")
print(response)
Thought: I need to use the add tool to help me answer the question.
Action: add
Action Input: {'a': 5, 'b': 3}
Observation: 8
Thought: Now I need to add the result from the previous operation to 2.
Action: add
Action Input: {'a': 8, 'b': 2}
Observation: 10
Thought: I can answer without using any more tools.
Answer: The result of 5+3+2 is 10.

- I first added 5 and 3 using the add tool, which resulted in 8.
- Then I added the result (8) to 2 using the add tool again, which resulted in 10.
The result of 5+3+2 is 10.

- I first added 5 and 3 using the add tool, which resulted in 8.
- Then I added the result (8) to 2 using the add tool again, which resulted in 10.



53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询