返回顶部
热门问答 更多热门问答
技术文章 更多技术文章

Llamaindex最佳实践:13.ReAct 代理 - 简单的计算器工具介绍

[复制链接]
链载Ai 显示全部楼层 发表于 前天 10:05 |阅读模式 打印 上一主题 下一主题

ingFang SC", Cambria, Cochin, Georgia, serif;text-wrap: wrap;">这是一个展示 ReAct 代理如何使用简单的计算器工具(没有复杂的 RAG 管道或 API 调用)的笔记本。

ingFang SC", Cambria, Cochin, Georgia, serif;text-wrap: wrap;">我们将展示它如何逐步推理,使用不同的工具来实现最终目标。

ingFang SC", Cambria, Cochin, Georgia, serif;text-wrap: wrap;">如果你在 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.

ingFang SC", Cambria, Cochin, Georgia, serif;letter-spacing: normal;text-align: start;text-wrap: wrap;">定义函数工具

ingFang SC", Cambria, Cochin, Georgia, serif;text-wrap: wrap;">我们设置一些简单的multiplyadd工具。请注意,你可以定义任意函数并传递给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)

ingFang SC", Cambria, Cochin, Georgia, serif;letter-spacing: normal;text-align: start;text-wrap: wrap;">运行一些查询

ingFang SC", Cambria, Cochin, Georgia, serif;letter-spacing: normal;text-align: start;text-wrap: wrap;">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

ingFang SC", Cambria, Cochin, Georgia, serif;letter-spacing: normal;text-align: start;text-wrap: wrap;">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

ingFang SC", Cambria, Cochin, Georgia, serif;letter-spacing: normal;text-align: start;text-wrap: wrap;">查看提示

ingFang SC", Cambria, Cochin, Georgia, serif;text-wrap: wrap;">让我们来看看驱动 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.



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

链载AI是专业的生成式人工智能教程平台。提供Stable Diffusion、Midjourney AI绘画教程,Suno AI音乐生成指南,以及Runway、Pika等AI视频制作与动画生成实战案例。从提示词编写到参数调整,手把手助您从入门到精通。
  • 官方手机版

  • 微信公众号

  • 商务合作

  • Powered by Discuz! X3.5 | Copyright © 2025-2025. | 链载Ai
  • 桂ICP备2024021734号 | 营业执照 | |广西笔趣文化传媒有限公司|| QQ