【Langchain Agent研究】SalesGPT项目介绍(五)

【Langchain Agent研究】SalesGPT项目介绍(四)-CSDN博客        

        上节课,我们分析了一下salesGPT项目里源代码的一些问题,重新写了一个运行方法,换了一个模型并修改了一些源代码开始把项目跑起来了,我们已经可以通过console和模型进行对话了。

        我们之前选的模式是不使用工具的模式,所以我们启用的是sales_conversation_utterance_chain,这节课我们尝试使用工具,也就是之前我们介绍过的sales_agent_executor和用setup_knowledge_base()方法构造的knowledge_base。

1. 运行使用工具的Agent

        我们重新写一个my_test_with_tools.py的方法,其他的地方一样,注意在构造sales_agent的时候,use_tools=True,product_catalog要改一下,用你项目本地的地址:

sales_agent = SalesGPT.from_llm(llm,verbose=True,use_tools=True,product_catalog=r"C:\Users\Administrator\SalesGPT\examples\sample_product_catalog.txt",salesperson_name="Ted Lasso",salesperson_role="Sales Representative",company_name="Sleep Haven",company_business="""Sleep Haven is a premium mattress company that providescustomers with the most comfortable andsupportive sleeping experience possible. We offer a range of high-quality mattresses,pillows, and bedding accessories that are designed to meet the unique needs of our customers.""",)

        我们运行一下这块代码,发现在我们询问产品价格后,Agent开始思考是否要使用工具(就是我们之前构造的另外一个Agent——knowledge_base,它是一个RetrievalQA类型的Chain,也可以认为是一个Agent),下面是它的思考过程,我直接用prompt模板里面的内容了:

Previous conversation history:
Ted Lasso: Hello there! This is Ted Lasso from Sleep Haven. How are you doing today? <END_OF_TURN>
User: 我挺好的 <END_OF_TURN>
Ted Lasso: That's great to hear! I hope you're having a wonderful day. How can I assist you today? <END_OF_TURN>
User: 能介绍一下你们的产品么? <END_OF_TURN>
Ted Lasso:
Thought: Do I need to use a tool? Yes
Action: ProductSearch
Action Input: Sleep Haven mattresses
Observation: Sleep Haven offers a range of mattresses, including the Luxury Cloud-Comfort Memory Foam Mattress, the Classic Harmony Spring Mattress, the Plush Serenity Bamboo Mattress, and the EcoGreen Hybrid Latex Mattress. Each mattress has its own unique features and benefits, catering to different preferences and needs. The prices and sizes available for each mattress are as follows:
1. Luxury Cloud-Comfort Memory Foam Mattress:
- Price: $999
- Sizes available: Twin, Queen, King
2. Classic Harmony Spring Mattress:
- Price: $1,299
- Sizes available: Queen, King
3. Plush Serenity Bamboo Mattress:
- Price: $2,599
- Sizes available: King
4. EcoGreen Hybrid Latex Mattress:
- Price: $1,599
- Sizes available: Twin, Full
These mattresses are designed to provide comfort, support, and a restful night's sleep.
Thought: 

        这里能看到我和机器人对话的聊天记录(我使用的是中文询问),也能看到当我询问产品和价格后,我们启用了 sales_agent_executor,它开始思考是否使用它的工具——另外一个Agent进行QA查询。它的决定是YES,启用knowledge_base去查询价格。

        我们在【Langchain Agent研究】SalesGPT项目介绍(三)-CSDN博客中留下了两个遗留问题,我们在能运行项目之后再来看一下这里面的东西就清晰了:

2. CustomPromptTemplateForTools

        首先在调用CustomPromptTemplateForTools时,有三个地方需要注意,第一个是tools_getter=lambda x: tools。

prompt = CustomPromptTemplateForTools(template=SALES_AGENT_TOOLS_PROMPT,tools_getter=lambda x: tools,# This omits the `agent_scratchpad`, `tools`, and `tool_names` variables because those are generated dynamically# This includes the `intermediate_steps` variable because that is neededinput_variables=["input","intermediate_steps",  #这是在调用tools时,会产生的中间变量,是一个list里面的一个tuple,一个是action,一个是observation"salesperson_name","salesperson_role","company_name","company_business","company_values","conversation_purpose","conversation_type","conversation_history",],)

        这一行的意思是,tools_getter这个lambda函数接收任意一个参数,返回tools。所以在后面的代码里,我改变了原来代码的输入,这完全不影响后续的结果:

  # tools = self.tools_getter(kwargs["input"])tools = self.tools_getter([])

         第二个是input_variables里的input是没有值的,这一点困惑了我很久,后来我才发现其实这里根本不需要input应该也是不影响代码调用的,大家可以自己试试。

         第三个是intermediate_steps,这是一个只有在代码运行中并调用了tools时才会产生的中间变量,我把它找了出来贴一下:

[(AgentAction(tool='ProductSearch', tool_input='mattress prices', log='Thought: Do I need to use a tool? Yes\nAction: ProductSearch\nAction Input: mattress prices'), 'The prices for the Sleep Haven mattresses are as follows:\n\n1. Luxury Cloud-Comfort Memory Foam Mattress: $999\n2. Classic Harmony Spring Mattress: $1,299\n3. EcoGreen Hybrid Latex Mattress: $1,599\n4. Plush Serenity Bamboo Mattress: $2,599\n\nPlease note that these prices are subject to change and may vary depending on the size of the mattress.')]

        这个是一个LIST,里面有一个tuple,tuple里面又是两个tuple ,一个是action,一个是observation,我们就用action的log和observation去构造agent_scratchpad,agent_scratchpad是构造有memory的agent必要的一个组件。至此,我们就基本搞明白了CustomPromptTemplateForTools,用它的format方法把输入的参数进行一些调整、拼接,获得一个新的prompt。但是有一点我有点不太明白的是,CustomPromptTemplateForTools这个类的format方法我并没有调用过,为啥就生效呢?这个确实不太明白,可能涉及到langchain对于prompt这块的底层设计原理,我现在还接触不到。

3. SalesConvoOutputParser

        我们来看一下这个输出解析器。这块也是之前遗留的一个难点,因为这个Parser处理的是sales_agent_executor执行后的结果,不看到具体的输出我们确实很难理解这块代码在干什么。

        我们启动代码,然后输入查询价格的指令:

Ted Lasso: Hello there! This is Ted Lasso from Sleep Haven. How are you doing today? 
say something FINE , I WANT TO KNOW YOUR PRODUCT PRICE

        首先,stage_analyzer_chain进行阶段判断,判定到了第三个阶段:

Conversation Stage ID: 3
Conversation Stage: Value proposition: Briefly explain how your product/service can benefit the prospect. Focus on the unique selling points and value proposition of your product/service that sets it apart from competitors.

        然后,AgentExecutor开始执行,AgentExecutor在读取了历史聊天记录后开始进行分析,这个是它的输出:

TEXT
Thought: Do I need to use a tool? Yes
Action: ProductSearch
Action Input: Mattress price
-------

        到这里,我们就理解了SalesConvoOutputParser代码中:

        regex = r"Action: (.*?)[\n]*Action Input: (.*)"match = re.search(regex, text)if not match:## TODO - this is not entirely reliable, sometimes results in an error.return AgentFinish({"output": "I apologize, I was unable to find the answer to your question. Is there anything else I can help with?"},text,)# raise OutputParserException(f"Could not parse LLM output: `{text}`")action = match.group(1)action_input = match.group(2)return AgentAction(action.strip(), action_input.strip(" ").strip('"'), text)

        regex = r"Action: (.*?)[\n]*Action Input: (.*)" 是一个正则表达式,这个正则表达式可以用来匹配文本中以"Action:"开头,接着是动作内容,然后是零个或多个换行符,最后以"Action Input:"开头,接着是动作输入内容的部分。后面做的事情就是要用这个正则表达式去查询TEXT内容,去把"Action:"和"Action Input:"后面的东西提取出来,并赋值给action和action_input。

        这是AgentExecutor第一轮的输出,然后到第二轮的输出:

TEXT
Ted Lasso: The prices for our Sleep Haven mattresses range from $999 to $2,599, depending on the model you choose. We have the Classic Harmony Spring Mattress for $1,299, the Luxury Cloud-Comfort Memory Foam Mattress for $999, the EcoGreen Hybrid Latex Mattress for $1,599, and the Plush Serenity Bamboo Mattress for $2,599. These prices reflect the high-quality materials and craftsmanship that go into creating our mattresses. Is there a specific model you are interested in?
-------

        这个时候,已经通过调用工具进行了知识库查询,获得了这段TEXT,然后我们就理解了这段代码的作用:

        if f"{self.ai_prefix}:" in text:return AgentFinish({"output": text.split(f"{self.ai_prefix}:")[-1].strip()}, text)

         就是如果发现了Ted Lasso:为开头的输出,那就表明AgentExecutor已经获得了执行结果,代表可以返回AgentFinish,代表这个流程结束了。

 4.结束语

        至此,我们就基本掌握了SalesGPT的基本原理,也了解了它的核心代码逻辑和一些有难点的地方,这对于我们理解多Agent系统,对话阶段判断和prompt与parser的内容组装调整有巨大的好处。

        下一步,我们将尝试把我们之前构造的聊天机器人加入多Agent系统,让他可以根据用户对话的情况进行分析,给用户推销适配的旅游产品。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/685623.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【leetcode热题】二叉树的层序遍历

难度&#xff1a; 中等通过率&#xff1a; 46.1%题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目描述 给定一个二叉树&#xff0c;返回其按层次遍历的节点值。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&…

STM32F1 - 中断系统

Interrupt 1> 硬件框图2> NVIC 中断管理3> EXTI 中断管理3.1> EXTI与NVIC3.2> EXTI内部框图 4> 外部中断实验4.1> 实验概述4.2> 程序设计 5> 总结 1> 硬件框图 NVIC&#xff1a;Nested Vectored Interrupt Controller【嵌套向量中断控制器】 管理…

拿捏c语言指针(上)

目录 前言 ​编辑 指针 内存与地址 计算机常见单位 理解编址 取地址&#xff0c;指针变量&#xff0c;解引用 取地址 指针变量 解引用 指针变量大小 指针类型的作用 char*解引用后 指针-整数 应用 void*指针 const修饰指针变量 const修饰普通变量 const修饰指…

自动化测试-RIDE编写自动化脚本

自动化脚本软件测试的必修内容&#xff0c;是自动化测试的核心&#xff0c;脚本的逻辑严谨性、可维护性非常重要&#xff0c;优秀的自动化脚本需要能兼顾用例的正确有效性和自动化测试的效率&#xff0c;本篇文章将介绍如何用RIDE写自动化脚本。我们将深入探讨RIDE的具体用法&a…

相机图像质量研究(22)常见问题总结:CMOS期间对成像的影响--光学串扰

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

C++:迭代器的封装思想

C&#xff1a;迭代器的封装思想 list迭代器实现反向迭代器实现 本博客将通过实现list的迭代器&#xff0c;以及它的反向迭代器&#xff0c;来帮助大家理解迭代器的底层逻辑&#xff0c;以及封装思想。 list迭代器实现 迭代器是一个遍历容器的工具&#xff0c;其可以通过自增自…

Linux POSIX信号量 线程池

Linux POSIX信号量 线程池 一. 什么是POSIX信号量&#xff1f;二. POSIX信号量实现原理三. POSIX信号量接口函数四. 基于环形队列的生产消费模型五. 线程池 一. 什么是POSIX信号量&#xff1f; POSIX信号量是一种用于同步和互斥操作的机制&#xff0c;属于POSIX&#xff08;Po…

项目管理工具软件Maven趣闻

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Maven这个单词来自于意第绪语&#xff08;Yiddish&#xff09;&#xff0c;这是一种与德语和希伯来语有密切关系的犹太民族语言。在这个语境中&#xff0c;Maven意为“知识的…

ChatGPT高效提问—prompt实践(智能辅导-心理咨询-职业规划)

ChatGPT高效提问—prompt实践&#xff08;智能辅导-心理咨询-职业规划&#xff09; ​ 智能辅导是指利用人工智能技术&#xff0c;为学习者提供个性化、高效的学习辅助服务。它基于大数据分析和机器学习算法&#xff0c;可以针对学习者的学习行为、状态和能力进行评估和预测&a…

Shell - 学习笔记 - 2.15 - Shell关联数组(下标是字符串的数组)

现在最新的 Bash Shell 已经支持关联数组了。关联数组使用字符串作为下标&#xff0c;而不是整数&#xff0c;这样可以做到见名知意。 关联数组也称为“键值对&#xff08;key-value&#xff09;”数组&#xff0c;键&#xff08;key&#xff09;也即字符串形式的数组下标&…

AutoSAR(基础入门篇)10.1-Autosar_Ecum模式管理概述

目录 一、什么是模式管理 二、再谈BswM 1、BswM概述 2、BswM执行流程 三、再谈EcuM 模式管理应该算是我们实践篇中较难的内容了,还有就是诊断那章也比较难。因为模式管理里面可能回涉及到很多的名词,很多的特性,所以博主准 备分个8次左右来讲解这些内容。但是在实际的应…

如何在 Angular 中使用环境变量

简介 如果你正在构建一个使用 API 的应用程序&#xff0c;你会想在开发过程中使用测试环境的 API 密钥&#xff0c;而在生产环境中使用生产环境的 API 密钥。在 Angular 中&#xff0c;你可以通过 environment.ts 文件创建环境变量。 在本教程中&#xff0c;你将学习如何在 A…

【Java万花筒】数据流的舵手:大数据处理和调度库对比指南

智慧的导航仪&#xff1a;为您的数据流选择正确的大数据处理和调度库 前言 在如今的信息时代&#xff0c;大数据处理和调度已经成为许多企业和组织中关键的任务。为了有效地处理和管理大规模数据流&#xff0c;选择适合的调度库是至关重要的。本文将介绍几种常用的大数据处理…

【前端工程化面试题】使用 webpack 来优化前端性能/ webpack的功能

这个题目实际上就是来回答 webpack 是干啥的&#xff0c;你对webpack的理解&#xff0c;都是一个问题。 &#xff08;1&#xff09;对 webpack 的理解 webpack 为啥提出 webpack 是啥 webpack 的主要功能 前端开发通常是基于模块化的&#xff0c;为了提高开发效率&#xff0…

MATLAB知识点:datasample函数(★★☆☆☆)随机抽样的函数,能对矩阵数据进行随机抽样

讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自第3章&#xff1a;课后习题讲解中拓展的函数 在讲解第三…

数据类型与变量

目录 作业回顾 有关JDK, JRE, JVM三者&#xff1a; 判断题 新课学习 字面常量 数据类型 变量 整型变量 长整型变量 短整型变量 字节型变量 浮点型变量 字符型变量 布尔型变量 类型转换 自动类型转换&#xff08;隐式&#xff09; 强制类型转换&#xff08;显式…

Navicat安装使用连接MySQL

目录 安装登录MySQL登录MySQL用Navicat连接MySQL 安装 选择“我同意”&#xff0c;点击下一步。 选择安装的目标文件夹&#xff0c;点击下一步。 点击下一步。 点击下一步。 点击安装。 软件安装需要一些时间&#xff0c;请耐心等待 点击“完成”。 注册 输入 密钥&#x…

Crypto-RSA3

题目&#xff1a;&#xff08;BUUCTF在线评测 (buuoj.cn)&#xff09; 共模攻击 ​ 前提&#xff1a;有两组及以上的RSA加密过程&#xff0c;而且其中两次的m和n都是相同的&#xff0c;那么就可以在不计算出d而直接计算出m的值。 ​ 设模数为n&#xff0c;两个用户的公钥分别为…

全栈笔记_浏览器扩展篇(manifest.json文件介绍)

manifest.json介绍 是web扩展技术必不可少的插件配置文件,放在根目录作用: 指定插件的基本信息 name:名称manifest_version:manifest.json文件的版本号,可以写2或3version:版本description:描述定义插件的行为: browser_action:添加一个操作按钮到浏览器工具栏,点击按…

LeetCode 0103.二叉树的锯齿形层序遍历:层序遍历 + 适时翻转

【LetMeFly】103.二叉树的锯齿形层序遍历&#xff1a;层序遍历 适时翻转 力扣题目链接&#xff1a;https://leetcode.cn/problems/binary-tree-zigzag-level-order-traversal/ 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往…