当前位置: 首页 > news >正文

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元&#xff0c;计算x位小朋友的总票价是多少&#xff1f; 【输入】 输入x。 【输出】 人数和电影票总价&#xff0c;中间用一个空格隔开。 【输入样例】 2 【输出样例】 2 20 Code #include<iostream> using namespace st…...

Python | Leetcode Python题解之第477题汉明距离总和

题目&#xff1a; 题解&#xff1a; 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 &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保…...

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…...

数据资产目录构建方法与应用

一、引言随着大数据、云计算、人工智能等技术的飞速发展&#xff0c;数据驱动已经成为企业发展的新引擎。数据资产目录作为数据管理的核心工具&#xff0c;不仅能够帮助企业更好地掌握自身数据资源的状况&#xff0c;还能为数据资产的全生命周期管理提供有力支撑。因此&#xf…...

【Python爬虫实战】从文件到数据库:全面掌握Python爬虫数据存储技巧

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、文本文件数据存储的基础 二、如何将爬取的数据存储为.txt文件 三、如何…...

断其一指,无惧!ProFusion3D: 相机或者激光失效仍高效的多传感器融合3D目标检测算法

Abstract 多传感器融合在自动驾驶中的3D目标检测中至关重要&#xff0c;摄像头和激光雷达是最常用的传感器。然而&#xff0c;现有方法通常通过将两种模态的特征投影到鸟瞰视角&#xff08;BEV&#xff09;或透视视角&#xff08;PV&#xff09;来进行单视角的传感器融合&…...

CCS字体、字号更改+CCS下载官方链接

Step1、 按照图示箭头操作 step2 Step3 点击确定&#xff0c;点击Apply(应用)&#xff0c;点击Apply and close(应用和关闭) 4、历代版本下载链接 CCS下载&#xff1a;官方链接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&#xff0c;节后第一天几乎全天处于心流状态。上午下午很快时间就结束了。 周五&#xff0c;按照既有的面试频次&#xff0c;感觉可以做点别的。然后就联系了附近的驾校&#xff0c;打算把摩托车驾驶证拿了。然后几乎到了驾校&#xff…...

鸿蒙开发案例:推箱子

推箱子游戏&#xff08;Sokoban&#xff09;的实现。游戏由多个单元格组成&#xff0c;每个单元格可以是透明的、墙或可移动的区域。游戏使用Cell类定义单元格的状态&#xff0c;如类型&#xff08;透明、墙、可移动区域&#xff09;、圆角大小及坐标偏移。而MyPosition类则用于…...

mysql--表的约束

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

Ubuntu 上安装 docker 并配置 Docker Compose 详细步骤

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…...

MySQL去除空白字符(如非标准空格、制表符等)

在 MySQL 中&#xff0c;需要去除 site_name 字段的空格&#xff0c;可以使用 TRIM() 函数。这个函数可以去掉字符串开头和结尾的空格。以下是一个示例查询&#xff0c;演示如何选择去除空格后的 site_name&#xff1a; SELECT TRIM(site_name) AS site_name FROM site_info;如…...

2063:【例1.4】牛吃牧草

【题目描述】 有一个牧场&#xff0c;牧场上的牧草每天都在匀速生长&#xff0c;这片牧场可供15头牛吃20天&#xff0c;或可供20头牛吃10天&#xff0c;那么&#xff0c;这片牧场每天新生的草量可供几头牛吃1天&#xff1f; 【输入】 &#xff08;无&#xff09; 【输出】 如题…...

QT开发:深入掌握 QtGui 和 QtWidgets 布局管理:QVBoxLayout、QHBoxLayout 和 QGridLayout 的高级应用

目录 引言 1. QVBoxLayout&#xff1a;垂直布局管理器 基本功能 创建 QVBoxLayout 添加控件 添加控件和设置对齐方式 设置对齐方式 示例代码与详解 2. QHBoxLayout&#xff1a;水平布局管理器 基本功能 创建 QHBoxLayout 添加控件 添加控件和设置对齐方式 设置对齐…...

Bootstrapping、Bagging 和 Boosting

bagging方法如下&#xff1a; bagging和boosting比较...

板块龙头公司

高通 高通&#xff08;Qualcomm&#xff09;是一家总部位于美国加利福尼亚州的全球领先半导体和电信设备公司。成立于1985年&#xff0c;高通专注于无线通信技术的研发和创新。 移动处理器: 高通开发的骁龙&#xff08;Snapdragon&#xff09;系列芯片广泛用于智能手机和平板电…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...