React Agent 自定义实现
目录
背景
langchin 中的 agent
langchin 中 agent 的问题
langchain 的 agent 案例
自定义 React Agent
大模型
工具定义
问题设定
问题改写,挖掘潜在意图
React Prompt
下一步规划
问题总结
代码
背景
之前使用过 langchian 中的 agent 去实现过一些案例,angchian 的 React Agent 是有问题的,且内部代码有点难看懂,所以自己来根据 React 思想,灵活来实现试一下。
可以先看看我自定义实现的逻辑图,后面详细说明:
langchin 中的 agent
langchian 中的几种 agent 怎么用,我都看过了,也整理了一下了,那些能用,那些有问题的可以看注释,代码链接:https://github.com/5zjk5/prompt-engineering
langchin 中 agent 的问题
先来说说我用过的发现的问题,就是它的 React agent 有点问题,只调用一个工具就结束了,详细实验的文章:langchain 的 agent + tool 使用_langchain agent tool-CSDN博客
想去看看代码到底怎么运行的,发现太难看懂了。
后面在我自己实现 React agent 的时候,突然发现,跟 prompt 关系挺大的,langchian 那个 prompt 应该是根据 openai 的去写的,这是我目前想到只能调用一个工具的原因。
langchain 的 agent 案例
GitHub - 5zjk5/prompt-engineering: prompt 工程项目案例
自定义 React Agent
大模型
用的智谱 glm-4-air,如果换了模型,效果还不太稳定,需要调 prompt。
工具定义
定义两个工具,一个是 tavily 的搜索,去官网开通账号就可以获得一个 api,免费调用 1000 次;
一个工具是根据名字查询身高的自定义函数
from tavily import TavilyClient
from llm.llm_api_key import TAVILY_API_KEY
import timedef tavily_search(query):try:# Step 1. Instantiating your TavilyClienttavily_client = TavilyClient(api_key=TAVILY_API_KEY)# Step 2. Executing a Q&A search queryanswer = tavily_client.qna_search(query=query)# Step 3. That's it! Your question has been answered!return answerexcept:time.sleep(1)# Step 1. Instantiating your TavilyClienttavily_client = TavilyClient(api_key=TAVILY_API_KEY)# Step 2. Executing a Q&A search queryanswer = tavily_client.qna_search(query=query)# Step 3. That's it! Your question has been answered!return answerdef height_search(name):height_dic = {"张三": 180,"李四": 175,"王五": 170,"赵六": 165,"钱七": 160,"孙八": 175,"周九": 170,"吴十": 165,"郑十一": 180,"王十二": 175,"李十三": 170,"赵十四": 165,"钱十五": 180,"孙十六": 175,}return height_dic.get(name)
工具描述,要让大模型理解工具,需要定义描述,这里参考的智谱官方的工具的描述写法:
tavily_search_tool = {"type": "function","function": {"name": 'tavily_search',"description": "根据用户查询,去搜索引擎,返回搜索结果","parameters": {"type": "object","properties": {"query": {"description": "用户搜索内容 query","type": "string"},},"required": ["query"]}}}height_search_tool = {"type": "function","function": {"name": 'height_search',"description": "只要是有姓名,身高关键字,都需要使用此工具根据姓名,查询对应身高,每次只能查询一个人的身高","parameters": {"type": "object","properties": {"name": {"description": "指具体的姓名或名字","type": "string"},},"required": ["name"]}}}
问题设定
设定一个问题:
这个问题潜在意图是查询钱七,李四身高,并且搜索大模型定义,是想调用身高查询工具 2 次,搜索工具 1 次。
问题改写,挖掘潜在意图
为什么加这一步呢?因为把问题传给大模型后发现一个问题,它可能发现不了潜在意图,例如这里潜在意图要查询身高,问题中没有明显提出,大模型思考结果:
这样的话就只使用搜索工具就结束了,所以加了一步问题改写,去发现潜在意图,是利用大模型能力去做的,用 prompt,改写结果成功识别出潜在意图,并思考出要调用哪个工具:
尽你所能改写以下问题,可以有多个答案,可以参照以下工具进行改写,识别用户潜在意图:
```{tools}```
Question:`{query}`
Answer 按照以下格式,每一点代表一个意图,如果需要用到工具的需要列出工具名字,不需要具体参数:
```
1.
2.
...
```
React Prompt
React agent 核心的 prompt 怎么让模型自动规划,先来看 langchain 中的写法:
Answer the following questions as best you can. You have access to the following tools:{tools}Use the following format:Question: the input question you must answerThought: you should always think about what to doAction: the action to take, should be one of [{tool_names}]Action Input: the input to the actionObservation: the result of the action... (this Thought/Action/Action Input/Observation can repeat N times)Thought: I now know the final answerFinal Answer: the final answer to the original input questionBegin!Question: {input}Thought:{agent_scratchpad}
传入变量 tool 为所有工具,tool_names 为所有工具名称列表,input 问题输入,agent_scratchpad 思考要做什么,怎么做。
参照进行改编:
尽你所能回答以下问题。您可以使用以下工具:
```{tools}```严格使用以下 JSON 格式:
```
{{Question: 根据 thought 当前需要回答的问题,此字段必须存在Thought: 对于 Question 要做什么,此字段必须存在Action: {{'tool': 要采取的动作,应该是[{tool_names}]之一,如果不需要工具可以空着}}Action Input: 动作的输入,是一个 JSON 格式,此字段必须存在,如果不需要输入可以空着Observation: 行动的结果,此字段必须存在,默认为空
}}
```
(Question/Thought/Action/Action Input/Observation 五个字段必须存在,以上步骤只能重复 1 次)开始吧!
Question:`{query}`
thought:`{agent_scratchpad}`
根据 agent_scratchpad 每次运行得到 json 的 action,接着提取工具名及参数,去进行工具调用,这里因为是 json,格式控制好了提取就方便了。
使用完工具后,把结果赋值给 Observation。
下一步规划
agent_scratchpad 就是下一步规划的思考,用 prompt 去进行规划,传给已经执行的 action,问题及思考,让自动规划下一步应该做什么:
# 背景
有一个问题 Question,已经有了对这个问题的思考 Thought,已执行的思考 Action,需要根据这些信息去规划出下一步应该做什么。# 输入
## Question:`{query}`
## Thought:`{thought}`
## Action:`{all_action_res}`# 思考推理:
- 1、参考 Question 仔细理解 Thought,思考 Action 还有哪些没有行动。
- 2、判断你下一步做什么行动,不能过于发散过多的行动,必须根据步骤 1 的思考。
- 3、确保你的回答在语义上与 Action 中的内容不重复是一个全新的步骤。
- 4、若 Thought 已经全部执行了,直接回答`no`。# 输出要求(严格按照以下要求输出)
- 回答需要用一句话清晰的总结下一步需要做什么,不需要其他任何信息。
- 如果没有需要做的了,直接输出`no`,不需要其他任何信息,不需要解释任何理由。
这里遇到一个问题,就是可能会一直重复规划,导致死循环,在代码中加了判断,理论上开始重复规划了,说明已经没有可以给出新的规划了,那就结束吧。
问题总结
所有 action 的结果,用了一个列表保存的,最后用大模型自己去总结去回答问题就可以了。
D:\programming\dev_env\anaconda\anaconda3\python.exe "D:\Python_project\NLP\大模型学习\prompt-engineering\自定义 React Agant\run_agent.py"
D:\programming\dev_env\anaconda\anaconda3\Lib\site-packages\langchain\callbacks\__init__.py:37: LangChainDeprecationWarning: Importing this callback from langchain is deprecated. Importing it from langchain will no longer be supported as of langchain==0.2.0. Please import from langchain-community instead:`from langchain_community.callbacks import get_openai_callback`.To install langchain-community run `pip install -U langchain-community`.warnings.warn(
输入 token:103/输出 token:268/总共 token:371/
问题改写,识别潜在意图:
1. 识别用户提到的“身高比较高的小伙子”和“长得像钱七”,可能需要查询钱七的身高信息(使用工具:height_search)。
2. 识别用户提到的“还有他跟他身高差不多的兄弟李四”,可能需要查询李四的身高信息(使用工具:height_search)。
3. 用户对“大模型”表示不清楚,需要解释或搜索“大模型”的定义和相关信息(使用工具:tavily_search)。
=====================================
输入 token:53/输出 token:376/总共 token:429/
解决此问题的思考 Thought:
根据用户的问题,我们需要查询钱七和李四的身高信息,并获取关于“大模型”的解释和相关信息。因此,我们需要使用height_search工具来查询身高信息,以及使用tavily_search工具来搜索大模型的相关内容。
=====================================
输入 token:89/输出 token:426/总共 token:515/
{'Action': {'tool': 'height_search'},'Action Input': {'name': '钱七'},'Observation': 160,'Question': '1. 识别用户提到的“身高比较高的小伙子”和“长得像钱七”,可能需要查询钱七的身高信息(使用工具:height_search)。','Thought': '需要使用工具查询钱七的身高信息。'}
=====================================
输入 token:12/输出 token:289/总共 token:301/
下一步需要做什么:
需要使用工具查询李四的身高信息。
=====================================
输入 token:60/输出 token:435/总共 token:495/
{'Action': {'tool': 'height_search'},'Action Input': {'name': '李四'},'Observation': 175,'Question': '查询李四的身高信息。','Thought': '使用height_search工具查询李四的身高。'}
=====================================
输入 token:14/输出 token:301/总共 token:315/
下一步需要做什么:
使用tavily_search工具搜索大模型的相关内容。
=====================================
输入 token:61/输出 token:437/总共 token:498/
{'Action': {'tool': 'tavily_search'},'Action Input': {'query': '大模型是什么意思'},'Observation': 'Based on the data provided, the term "大模型" (Big Model) refers ''to a method or technology used in the fields of machine ''learning and artificial intelligence to handle large-scale ''data and complex models. These models are typically ''constructed using deep neural networks with a large number of ''parameters, ranging from billions to even trillions. The ''purpose of big models is to improve model expressive power ''and predictive performance, enabling them to handle more ''complex tasks and datasets effectively. Big models play a ''crucial role in addressing challenges posed by increasing ''data volumes and model complexities in the field of AI and ''machine learning.','Question': '大模型是什么意思?','Thought': '使用搜索引擎查询大模型的相关信息。'}
=====================================
输入 token:10/输出 token:311/总共 token:321/
开始生成重复步骤,或已执行 action 过多,判断结束了!重复步骤:使用搜索引擎查询大模型的相关信息。
下一步需要做什么:
no
=====================================
输入 token:109/输出 token:332/总共 token:441/
最终答案:
根据您的描述,钱七的身高是160厘米,而李四的身高是175厘米。至于您提到的“大模型”,这是一种在机器学习和人工智能领域中使用的方法或技术。大模型通常指的是具有大量参数(从数十亿到数万亿不等)的深度神经网络模型。这些模型的目的是提高表达能力和预测性能,使它们能够更有效地处理大规模数据和复杂任务。简而言之,大模型是为了应对人工智能和机器学习领域中数据量增加和模型复杂性提升的挑战而发展起来的技术。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Process finished with exit code 0
代码
prompt-engineering/自定义 React Agant at master · 5zjk5/prompt-engineering · GitHub
相关文章:

React Agent 自定义实现
目录 背景 langchin 中的 agent langchin 中 agent 的问题 langchain 的 agent 案例 自定义 React Agent 大模型 工具定义 问题设定 问题改写,挖掘潜在意图 React Prompt 下一步规划 问题总结 代码 背景 之前使用过 langchian 中的 agent 去实现过一些…...

RabbitMQ 入门(六)SpringAMQP五种消息类型(Direct Exchange)
一、发布订阅-DirectExchange(路由模式) 在Fanout模式中,一条消息,会被所有订阅的队列都消费。但是,在某些场景下,我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。 Direct Exchan…...
2062:【例1.3】电影票
【题目描述】 已知一位小朋友的电影票价是10元,计算x位小朋友的总票价是多少? 【输入】 输入x。 【输出】 人数和电影票总价,中间用一个空格隔开。 【输入样例】 2 【输出样例】 2 20 Code #include<iostream> using namespace st…...

Python | Leetcode Python题解之第477题汉明距离总和
题目: 题解: class Solution:def totalHammingDistance(self, nums: List[int]) -> int:n len(nums)ans 0for i in range(30):c sum(((val >> i) & 1) for val in nums)ans c * (n - c)return ans...

Leecode刷题之路第25天之K个一组翻转链表
题目出处 25-K个一组翻转链表-题目出处 题目描述 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保…...
nuxtjs3 使用tailwindcss做自适应
步骤 1: 安装 Tailwind CSS npm install tailwindcss postcss autoprefixer nuxtjs/tailwindcss步骤 2: 配置 Tailwind CSS 这将生成一个 tailwind.config.js 文件。 npx tailwindcss init步骤 3: 配置 nuxt.config.ts // https://nuxt.com/docs/api/configuration/nuxt-con…...
数据资产目录构建方法与应用
一、引言随着大数据、云计算、人工智能等技术的飞速发展,数据驱动已经成为企业发展的新引擎。数据资产目录作为数据管理的核心工具,不仅能够帮助企业更好地掌握自身数据资源的状况,还能为数据资产的全生命周期管理提供有力支撑。因此…...

【Python爬虫实战】从文件到数据库:全面掌握Python爬虫数据存储技巧
🌈个人主页:https://blog.csdn.net/2401_86688088?typeblog 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、文本文件数据存储的基础 二、如何将爬取的数据存储为.txt文件 三、如何…...

断其一指,无惧!ProFusion3D: 相机或者激光失效仍高效的多传感器融合3D目标检测算法
Abstract 多传感器融合在自动驾驶中的3D目标检测中至关重要,摄像头和激光雷达是最常用的传感器。然而,现有方法通常通过将两种模态的特征投影到鸟瞰视角(BEV)或透视视角(PV)来进行单视角的传感器融合&…...

CCS字体、字号更改+CCS下载官方链接
Step1、 按照图示箭头操作 step2 Step3 点击确定,点击Apply(应用),点击Apply and close(应用和关闭) 4、历代版本下载链接 CCS下载:官方链接https://www.ti.com/tool/CCSTUDIO The last but not least 如果成功的解决了你的问题&#x…...

YOLO11改进|注意力机制篇|引入SEAM注意力机制
目录 一、【SEAM】注意力机制1.1【SEAM】注意力介绍1.2【SEAM】核心代码二、添加【SEAM】注意力机制2.1STEP12.2STEP22.3STEP32.4STEP4三、yaml文件与运行3.1yaml文件3.2运行成功截图一、【SEAM】注意力机制 1.1【SEAM】注意力介绍 下图是【SEAM】的结构图,让我们简单分析一下…...
简历修订与求职经历 - Chap04
节后第一周有点山中无甲子的状况。Oct08,节后第一天几乎全天处于心流状态。上午下午很快时间就结束了。 周五,按照既有的面试频次,感觉可以做点别的。然后就联系了附近的驾校,打算把摩托车驾驶证拿了。然后几乎到了驾校ÿ…...

鸿蒙开发案例:推箱子
推箱子游戏(Sokoban)的实现。游戏由多个单元格组成,每个单元格可以是透明的、墙或可移动的区域。游戏使用Cell类定义单元格的状态,如类型(透明、墙、可移动区域)、圆角大小及坐标偏移。而MyPosition类则用于…...

mysql--表的约束
目录 理解表的约束和操作 如何理解? 1、空属性null 2、默认值default 3、列描述comment 4、自动填充zorefill 5、主键primary key (1)创建表时指定可以 (2)创建表后指定key (3)删除主…...

Ubuntu 上安装 docker 并配置 Docker Compose 详细步骤
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…...
MySQL去除空白字符(如非标准空格、制表符等)
在 MySQL 中,需要去除 site_name 字段的空格,可以使用 TRIM() 函数。这个函数可以去掉字符串开头和结尾的空格。以下是一个示例查询,演示如何选择去除空格后的 site_name: SELECT TRIM(site_name) AS site_name FROM site_info;如…...
2063:【例1.4】牛吃牧草
【题目描述】 有一个牧场,牧场上的牧草每天都在匀速生长,这片牧场可供15头牛吃20天,或可供20头牛吃10天,那么,这片牧场每天新生的草量可供几头牛吃1天? 【输入】 (无) 【输出】 如题…...

QT开发:深入掌握 QtGui 和 QtWidgets 布局管理:QVBoxLayout、QHBoxLayout 和 QGridLayout 的高级应用
目录 引言 1. QVBoxLayout:垂直布局管理器 基本功能 创建 QVBoxLayout 添加控件 添加控件和设置对齐方式 设置对齐方式 示例代码与详解 2. QHBoxLayout:水平布局管理器 基本功能 创建 QHBoxLayout 添加控件 添加控件和设置对齐方式 设置对齐…...

Bootstrapping、Bagging 和 Boosting
bagging方法如下: bagging和boosting比较...
板块龙头公司
高通 高通(Qualcomm)是一家总部位于美国加利福尼亚州的全球领先半导体和电信设备公司。成立于1985年,高通专注于无线通信技术的研发和创新。 移动处理器: 高通开发的骁龙(Snapdragon)系列芯片广泛用于智能手机和平板电…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...