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

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

        上节课,我们介绍了SalesGPT他的业务流程和技术架构,这节课,我们来关注一下他的项目整体结构、poetry工具和一些工程项目相关的设计。

项目整体结构介绍

        我们把整个项目从git上拉下来之后,来看一下它的整体工程结构:

        这里面所有的文件,其中,最最重要的是salesgpt这个文件夹,打开这个文件夹,可以看到里面的python文件:

       

        回想一下,我们旅游聊天机器人(【Langchain+Streamlit】旅游聊天机器人-CSDN博客)里面的工程结构,和这个有些类似是不是?只不过多了logger、parsers等其他的python文件,这些我们后面会涉及到:

        所以后面我们会重点研究salesgpt文件夹里面的东西。我们在看salesGPT整个工程结构的时候发现一个问题,就是我们找不到一般项目的requirements.txt,但是我们发现了这两个文件:

        我们打开pyproject.toml,看看里面的代码:

[tool.poetry]
name = "SalesGPT"
version = "0.1.1"  
description = "SalesGPT - Your Context-Aware AI Sales Assistant"
authors = ["Filip Michalsky "]
license = "Apache-2.0"
readme = "README.md"
homepage = "https://github.com/filip-michalsky/SalesGPT"
repository = "https://github.com/filip-michalsky/SalesGPT"
classifiers = ["Development Status :: 4 - Beta","Intended Audience :: Developers","License :: OSI Approved :: Apache Software License","Programming Language :: Python :: 3","Programming Language :: Python :: 3 :: Only","Programming Language :: Python :: 3.8","Programming Language :: Python :: 3.9","Programming Language :: Python :: 3.10","Programming Language :: Python :: 3.11","Topic :: Scientific/Engineering :: Artificial Intelligence",
]
keywords = ["openai", "sales", "gpt", "autonomous", "agi"][tool.poetry.dependencies]
python = "^3.8.1"
langchain = "0.1.0"
openai = "1.7.0"
chromadb = "^0.4.18"
tiktoken = "^0.5.2"
pydantic = "^2.5.2"
litellm = "^1.10.2"
ipykernel = "^6.27.1"
pytest = "^7.4.3"
pytest-cov = "^4.1.0"
pytest-asyncio = "^0.23.1"
langchain-openai = "0.0.2"[tool.poetry.group.dev.dependencies]
black = "^23.11.0"
flake8 = "^6.1.0"
isort = "^5.12.0"
pytest = "^7.4.3"
pytest-cov = "^4.1.0"[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

        大概可以猜出来这是一个类似配置文件的东西,上面有项目的基本信息,然后是项目的依赖,基本上可以确定这个文件就是顶替requirements.txt的,这个叫poetry的东西我们之前没有接触过,不过在网上能找到大把资料,我们花一小节简单介绍一下这个东西。

poetry介绍

        简单来说,对于较大型、复杂和需要部署的项目,需要有好的依赖管理、虚拟环境管理、打包和发布的工具,poetry就是来做这个的。poetry的主要作用有如下三点:

1. 项目的依赖管理(下载和追踪)。替代pip的功能

2. 虚拟环境的管理。替代传统的python虚拟环境构建方法,poetry直接生成一个可直接使用的虚拟环境。

3. 打包和发布管理。这个我们知道就行了,暂时还用不上。

这个是poetry的官网和一些我觉得介绍poetry比较好的CSDN博主介绍文章:

 1. 官网:Poetry - Python dependency management and packaging made easy

2. poetry其他博主的介绍:Python 依赖管理及打包三方库 Poetry_python poetry-CSDN博客

        大家可以自己花一些时间去看一下poetry这个管理工具怎么用,我觉得这个工具设计得还是蛮好的,对于依赖管理、虚拟环境管理和打包发布都很方便,以后我们自己的大型项目我们也都用poetry好了。

运行文件run.py 和 run-api.py分析

        我们看一下项目里的可运行文件(.py)只有两个:

        我们来看一下run.py的代码:

import argparse
import json
import osfrom dotenv import load_dotenv
from langchain_community.chat_models import ChatLiteLLMfrom salesgpt.agents import SalesGPTload_dotenv()  # loads .env file# LangSmith settings section, set TRACING_V2 to "true" to enable it
# or leave it as it is, if you don't need tracing (more info in README)
os.environ["LANGCHAIN_TRACING_V2"] = "false"
os.environ["LANGCHAIN_ENDPOINT"] = "https://api.smith.langchain.com"
os.environ["LANGCHAIN_API_KEY"] = os.getenv("LANGCHAIN_SMITH_API_KEY")
os.environ["LANGCHAIN_PROJECT"] = ""  # insert you project name here

        引入必要的包,load_dotenv()用来加载环境变量,主要是openai_key。然后是langchain_smith的引入,langchain_smith是用来进行过程监督和控制的,这个我们有时间单独来讲一下,这个东西是一个辅助管理工具,可以不要。

        然后是main函数里面的东西:

if __name__ == "__main__":# Initialize argparseparser = argparse.ArgumentParser(description="Description of your program")# Add argumentsparser.add_argument("--config", type=str, help="Path to agent config file", default="")parser.add_argument("--verbose", type=bool, help="Verbosity", default=False)parser.add_argument("--max_num_turns",type=int,help="Maximum number of turns in the sales conversation",default=10,)# Parse argumentsargs = parser.parse_args()# Access argumentsconfig_path = args.configverbose = args.verbosemax_num_turns = args.max_num_turns

        这个argparse也是一个新东西,我们之前也没见过,来看看它是做什么的。这个模块的介绍资料网上也是大把(argparse简介-CSDN博客),argparse 模块是 Python 内置的用于命令项选项与参数解析的模块,argparse 模块可以让人轻松编写用户友好的命令行接口,能够帮助程序员为模型定义参数。

        这块代码的作用就是方便用户运行代码时,进行输入的(通过命令行),其中最主要的是

max_num_turns这个参数有实际的用处。我们之前介绍过agent,agent会不断审查agent_executor的执行结果,有可能就进死循环了(而且会不断消耗token),所以需要设置一个最大运行轮次来控制agent的循环轮次。这个参数就和我们之前在构造agentexecutor里设置的max_iterations是一个东西【2024最全最细LangChain教程-13】Agent智能体(二)-CSDN博客 这里面有这个参数,我直接截图了

        可以看到上面的代码主要是用来获取用户输入的,我们继续来看代码:

 llm = ChatLiteLLM(temperature=0.2, model_name="gpt-3.5-turbo-instruct")if config_path == "":print("No agent config specified, using a standard config")# keep boolean as string to be consistent with JSON configs.USE_TOOLS = "True"if USE_TOOLS == "True":sales_agent = SalesGPT.from_llm(llm,use_tools=USE_TOOLS,product_catalog="examples/sample_product_catalog.txt",salesperson_name="Ted Lasso",verbose=verbose,)else:sales_agent = SalesGPT.from_llm(llm, verbose=verbose)else:with open(config_path, "r", encoding="UTF-8") as f:config = json.load(f)print(f"Agent config {config}")sales_agent = SalesGPT.from_llm(llm, verbose=verbose, **config)

        这里构造了一个llm,然后判断一下用户之前的输入有没有config信息,如果没有项目config信息的话就构造一个默认的sales_agent,注意这里使用的SalesGPT的 from_llm方法,这个方法是后面我们关注的重点。这个agent使用了一个默认的产品目录和销售人员名称。

        这块代码有点让人困惑的就是这块,大家应该知道我在说啥:

       这段代码运行到这里,我们就成功构造了一个sales_agent,然后我们继续往下走:

sales_agent.seed_agent()print("=" * 10)cnt = 0while cnt != max_num_turns:cnt += 1if cnt == max_num_turns:print("Maximum number of turns reached - ending the conversation.")breaksales_agent.step()# end conversationif "<END_OF_CALL>" in sales_agent.conversation_history[-1]:print("Sales Agent determined it is time to end the conversation.")breakhuman_input = input("Your response: ")sales_agent.human_step(human_input)print("=" * 10)

        然后我们用seed_agent()这个方法来初始化一下这个agent,然后就开始进入用户输入、系统输出的阶段了,这里都是用CMD来交互的。

        这里会用到之前我们设置的max_num_turns这个参数,如果达到了这个上限就终止对话,如果没有的话,就调用sagels_agent的step方法来进行输出。

        如果sales_agent的会话历史conversation_history的最后一个元素不是"END_OF_CALL",就让用户进行他的输入,并把用户输入放到sales_agent的human_step这个方法里作为入参。

        可以看到,run.py整个代码的逻辑是:设置用户命令行输入的参数结构,如果没有的话就用默认设置,然后初始化agent,然后让agent先向用户提问,然后让用户通过命令行输入,然后一轮一轮进行对话,直到到达用户设置的最大轮次(默认是10次)或者对话完结。这个基本上就是run.py的整个业务流程。不难看出,这里最重要的就是:

from salesgpt.agents import SalesGPT

       从这里引入的SalesGPT这个类了,通过这个类实例化构造的agent,是整个业务逻辑的核心,下节课我们开始重点分析SalesGPT这个类。

        最后我们来看看run-api.py这个文件:

import os
from typing import Listimport uvicorn
from fastapi import FastAPI
from pydantic import BaseModelfrom salesgpt.salesgptapi import SalesGPTAPIapp = FastAPI()GPT_MODEL = "gpt-3.5-turbo-0613"
# GPT_MODEL_16K = "gpt-3.5-turbo-16k-0613"@app.get("/")
async def say_hello():return {"message": "Hello World"}class MessageList(BaseModel):conversation_history: List[str]human_say: str@app.post("/chat")
async def chat_with_sales_agent(req: MessageList):sales_api = SalesGPTAPI(config_path="examples/example_agent_setup.json", verbose=True)name, reply = sales_api.do(req.conversation_history, req.human_say)res = {"name": name, "say": reply}return resdef _set_env():with open(".env", "r") as f:env_file = f.readlines()envs_dict = {key.strip("'"): value.strip("\n")for key, value in [(i.split("=")) for i in env_file]}os.environ["OPENAI_API_KEY"] = envs_dict["OPENAI_API_KEY"]if __name__ == "__main__":_set_env()uvicorn.run(app, host="127.0.0.1", port=8000)

        简单浏览一下整个代码,尤其是main函数里的东西,就大概知道了,这是要用FASTAPI(一种用python快速构建服务端的工具)来构建一个可以给前端响应的后端服务,那我们就基本明白了这是聚焦于如何和用户交互获取用户输入信息的另外一个版本,和run.py没有啥本质的区别,就是交互方式不一样了,所以我们也不需要花太多时间在这个上面。如果到了服务要部署的时候,我们再系统地学习一遍FASTAPI工具然后模仿他这块的代码就行,后面我们就不讲这块代码了,我们就用run.py的命令行方式来和agent交互就足够了。

     

        

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

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

相关文章

互联网医院架构系统设计与实现

随着互联网技术的快速发展&#xff0c;互联网医院作为一种新兴的医疗服务模式&#xff0c;正逐渐受到人们的关注和使用。本文将介绍互联网医院架构系统的设计原则和关键组件&#xff0c;以及如何实现一个安全、高效和可扩展的互联网医疗服务平台。 内容&#xff1a; 1. 引言 …

LeetCode Python - 9.回文数

文章目录 题目答案运行结果 题目 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 例如&am…

【开源】基于JAVA+Vue+SpringBoot的实验室耗材管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 耗材档案模块2.2 耗材入库模块2.3 耗材出库模块2.4 耗材申请模块2.5 耗材审核模块 三、系统展示四、核心代码4.1 查询耗材品类4.2 查询资产出库清单4.3 资产出库4.4 查询入库单4.5 资产入库 五、免责说明 一、摘要 1.1…

Ps:信息面板

Ps菜单&#xff1a;窗口/信息 Window/Info 快捷键&#xff1a;F8 信息 Info面板提供了关于工作文档和当前操作的实时信息&#xff0c;包括鼠标指针的位置、取样点的颜色值&#xff08;包括调整前后的对比值&#xff09;&#xff0c;以及当前所用工具的提示信息等等&#xff0c;…

PyTorch深度学习实战(26)——多对象实例分割

PyTorch深度学习实战&#xff08;26&#xff09;——多对象实例分割 0. 前言1. 获取并准备数据2. 使用 Detectron2 训练实例分割模型3. 对新图像进行推断小结系列链接 0. 前言 我们已经学习了多种图像分割算法&#xff0c;在本节中&#xff0c;我们将学习如何使用 Detectron2 …

【前端高频面试题--Vue基础篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;前端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac;前端高频面试题--Vue基础篇 Vue基本原理双向绑定与MVVM模型Vue的优点计算属性与监听属性计算属性监…

python+flask+django医院预约挂号病历分时段管理系统snsj0

技术栈 后端&#xff1a;python 前端&#xff1a;vue.jselementui 框架&#xff1a;django/flask Python版本&#xff1a;python3.7 数据库&#xff1a;mysql5.7 数据库工具&#xff1a;Navicat 开发软件&#xff1a;PyCharm . 第一&#xff0c;研究分析python技术&#xff0c…

浅谈人工智能之深度学习~

目录 前言&#xff1a;深度学习的进展 一&#xff1a;深度学习的基本原理和算法 二&#xff1a;深度学习的应用实例 三&#xff1a;深度学习的挑战和未来发展方向 四&#xff1a;深度学习与机器学习的关系 五&#xff1a;深度学习与人类的智能交互 悟已往之不谏&#xff0…

模拟发送 Ctrl+Alt+Del 快捷键

目录 前言 一、在 XP 系统上模拟 SAS 二、在不低于 Vista 的系统上模拟 SAS 2.1 一些细节 2.2 实现原理和应用 三、完整实现代码和测试 3.1 客户端控制台程序 3.2 服务程序 3.3 编译&测试程序 四、总结&更新 参考文献 前言 对于开启了安全登陆的窗口工作站…

nodejs爬虫框架

nodejs爬虫框架 在Node.js中&#xff0c;有一些常用的爬虫框架可以帮助你实现网页抓取和数据提取的任务。以下是几个流行的Node.js爬虫框架&#xff1a; 1. **Puppeteer**: Puppeteer 是由 Google 开发的一个用于控制 headless Chrome 或 Chromium 浏览器的 Node.js 库。它提供…

python-产品篇-游戏-玛丽冒险

文章目录 开发环境要求运行方法代码效果 开发环境要求 本系统的软件开发及运行环境具体如下。 &#xff08;1&#xff09;操作系统&#xff1a;Windows 7、Windows 8、Windows 10。 &#xff08;2&#xff09;Python版本&#xff1a;Python 3.7.0。 &#xff08;3&#xff09;…

Packet Tracer - Configure IOS Intrusion Prevention System (IPS) Using the CLI

Packet Tracer - 使用CLI配置IOS入侵防御系统&#xff08;IPS&#xff09; 地址表 目标 启用IOS入侵防御系统&#xff08;IPS&#xff09;。 配置日志记录功能。 修改IPS签名规则。 验证IPS配置。 背景/场景 您的任务是在R1上启用IPS&#xff0c;扫描进入192.168.1.0网络…

Matplotlib核心:掌握Figure与Axes

详细介绍Figure和Axes&#xff08;基于Matplotlib&#xff09; &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333; 一、Figure&#xff08;图形&#xff09;&#x1f333;&#x1f341;1. 创建Figure&#x1f341;&#x1f341;2. 添加Axes&am…

四.Linux实用操作 12-14.环境变量文件的上传和下载压缩和解压

目录 四.Linux实用操作 12.环境变量 环境变量 环境变量--PATH $ 符号 自行设置环境变量 自定义环境变量PATH 总结 四.Linux实用操作 13.文件的上传和下载 上传&#xff0c;下载 rz&#xff0c;sz命令 四.Linux实用操作 14.压缩和解压 压缩格式 tar命令 tar命令压缩…

深度解析Pandas聚合操作:案例演示、高级应用与实战技巧【第74篇—Pandas聚合】

深度解析Pandas聚合操作&#xff1a;案例演示、高级应用与实战技巧 在数据分析和处理领域&#xff0c;Pandas一直是Python中最受欢迎的库之一。它提供了丰富的数据结构和强大的功能&#xff0c;使得数据清洗、转换和分析变得更加高效。其中&#xff0c;Pandas的聚合操作在数据…

数据库基础学习笔记

一.基础概念 数据库、数据库管理系统、SQL 主流数据库&#xff1a; mysql的安装&#xff1a;略 mysql图形化界面的安装&#xff1a;略 二.数据模型 1). 关系型数据库&#xff08;RDBMS&#xff09; 概念&#xff1a;建立在关系模型基础上&#xff0c;由多张相互连接的二维表…

华为 huawei 交换机 接口 MAC 地址学习限制接入用户数量 配置示例

目录 组网需求: 配置思路&#xff1a; 操作步骤&#xff1a; 配置文件&#xff1a; 组网需求: 如 图 2-14 所示&#xff0c;用户网络 1 和用户网络 2 通过 LSW 与 Switch 相连&#xff0c; Switch 连接 LSW 的接口为GE0/0/1 。用户网络 1 和用户网络 2 分别属于 VLAN10 和 V…

导数的定义【高数笔记】

【含义】可以抽象成&#xff0c;在一个极其短的时间段内&#xff0c;温度差 / 时间差 【本质】瞬间的平均值 【分类】可以分成几类&#xff1f;每类需要注意的点 【导数存在的必要条件】 【导数与极限的关系】可以参考导数的定义的式子 【题型解法】分几个题型&#xff1f;每个…

基于微信小程序的校园故障维修管理系统的研究与实现

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

电路设计(16)——纪念馆游客进出自动计数显示器proteus仿真

1.设计要求 设计、制作一个纪念馆游客进出自动计数显示器。 某县&#xff0c;有一个免费参观的“陶渊明故里纪念馆”&#xff0c;游客进出分道而行&#xff0c;如同地铁有确保单向通行的措施。在入口与出口处分别设有红外检测、声响、累加计数器装置&#xff0c;当游人进&#…