fastchat与autogen使用要点澄清

说明:

本文重点是想使用autogen构建智能体,并且想要通过加载本地模型来构建,以灵活使用。但是autogen重点是以API调用支持openai, mistral等大模型使用的,对于使用国内的一些模型不是那么友好方便。然后在查找方法的过程中,找到了fastchat这样一个方法。

所以记录下结合使用的过程关键点。

(如果可以正常远程调用,请忽略)

一、fastchat与autogen简要介绍

1.1 autogen

utoGen是一个由Microsoft团队开发的开源框架,旨在简化大型语言模型(LLM)的工作流程编排和优化。这个框架特别适用于开发涉及对话自治性、代理数量和代理对话拓扑的下一代LLM应用。AutoGen的核心特点包括:

  1. 多代理对话框架:AutoGen允许使用多个代理进行对话和解决任务,这些代理是可定制和可对话的,并且可以无缝地允许人类参与。它们能在使用LLM、人类输入和工具的各种模式下运行2。
  2. 简化和自动化LLM工作流:AutoGen简化了复杂LLM工作流的编排、自动化和优化,最大化了LLM模型的性能,并克服了它们的弱点。它支持多样化的对话模式,适用于复杂的工作流程2。

  3. 模块化和可重用的代理:在AutoGen框架中,开发复杂的多代理对话系统只需两个步骤:定义一组代理,每个代理都有其角色和功能;定义代理之间的交互行为。这些代理是模块化且直观的,可组合且可重用4。

1.2 fastchat

FastChat是一个用于训练、部署和评估基于大型语言模型的聊天机器人的开放平台。这个平台的核心功能包括提供最先进的大型语言模型(LLM)的权重、训练代码和评估代码,例如Vicuna和FastChat-T5模型。此外,FastChat还提供了一个基于分布式多模型的服务系统,这个系统拥有Web界面,并且与OpenAI的RESTful API兼容12。

FastChat是由UC Berkeley主导的Large Model Systems Organization开源的,专门面向LLM的训练、推理和评估。通过这个平台,用户可以快速部署多模型的LLM服务,并且可以通过Web UI以及兼容OpenAI API的RESTful API来访问这些服务。

二、autogen使用本地模型方式

2.1 兼容 OpenAI API 的代理服务器

原理如下,任何提供与OpenAI 的 API兼容的 API 的代理服务器都可以与 AutoGen 一起使用。

这些代理服务器可以是基于云的,也可以在您的环境中本地运行。本文中采用的就是右侧local proxy server方式,即自己建立一个服务API,进行调用。

2.2 autogen代码配置

调用代码示例如下,其中 llm_config 就是我们要配置的大模型的信息。

import osfrom autogen import ConversableAgent# 创建一个名为 agent_with_number 的 ConversableAgent 对象
agent_with_number = ConversableAgent("agent_with_number",system_message="你正在玩一个猜数字的游戏。你心里想的数字是53,我会尝试猜出来。如果我猜得太高,请说'太高';如果我猜得太低,请说'太低'。",llm_config={"config_list": [{"model": "gpt-4", "api_key": os.environ["OPENAI_API_KEY"]}]},is_termination_msg=lambda msg: "53" in msg["content"],  # 如果对方猜中了数字,终止对话human_input_mode="NEVER",  # 不需要人类输入
)# 创建一个名为 agent_guess_number 的 ConversableAgent 对象
agent_guess_number = ConversableAgent("agent_guess_number",system_message="我心里有一个数字,你要猜出来。如果我说'太高',你应该猜一个更小的数字。如果我说'太低',你应该猜一个更大的数字。",llm_config={"config_list": [{"model": "gpt-4", "api_key": os.environ["OPENAI_API_KEY"]}]},human_input_mode="NEVER",
)# agent_with_number 发起对话,并将 agent_guess_number 作为对话对象
result = agent_with_number.initiate_chat(agent_guess_number,message="我心里有一个1到100之间的数字。猜猜看吧!",
)

我们可以把这个config_list配置抽出来,放到一个json文件里面(如下图所示)。其中如果是官方支持的gpt4之类的,则要简单很多。如果是我们自己部署的模型服务,则需要重点提供base_url,同时保持 api_type=open_ai, api_key=NULL。

对于base_url,大家可以根据自己的情况,更新 http://127.0.0.1:8089部分,/v1必须要带上。

三、使用fastchat部署模型服务

3.1 fastchat安装

参考官网指导,直接pip安装即可。

pip3 install "fschat[model_worker,webui]"

3.2 启动服务(重点)

参考官网信息和其他博客的时候,会发现,要启动几个相关的服务和命令(如下所示),然而这几个之间什么关系,什么注意点,没有明确说明,这就是踩坑的地方,特此记录个人查阅了解的信息,说明一下。

python3 -m fastchat.serve.controller

python3 -m fastchat.serve.model_worker --model-path lmsys/vicuna-7b-v1.5

python3 -m fastchat.serve.openai_api_server --host localhost --port 8000

利用 FastChat 框架部署一个完整的模型服务主要分为三个部分,分别为: Controller , Server 以及多个 Worker 。这三者之间的关系如官方给出的下图所示:

(openai_api_server则在gradio server的位置,主要目的是包装成openai api的兼容模式)

3.2.1 启动控制器服务

fastchat.serve.controller 是 FastChat 框架中的控制器服务。控制器服务负责管理和调度模型工作进程以及其他相关组件。为了确保模型工作进程能够正常连接到控制器,您需要先启动控制器服务。

启动控制器服务通常可以通过以下命令完成,最好同时指定控制器服务的host和port配置,这样后面可以启动model_worker 跟 openai_api_server的时候,好对应起来。

python -m fastchat.serve.controller --host 127.0.0.1 --port 8087

其中,

--host 127.0.0.1:表示控制器将在本地网络接口上监听。
--port 8087:指定控制器监听的端口号。

启动成功之后,会有如下所示的提示

3.2.2 启动模型工作进程

这是负责加载模型并在后台处理实际推理请求的组件。它主要负责模型的具体运行逻辑。

启动模型工作进程命令如下:(另外打开一个terminal窗口)

python -m fastchat.serve.model_worker --model-path /xxx/ZhipuAI/glm-4-9b-chat/ --worker-address http://127.0.0.1:8087 --controller-address http://127.0.0.1:8087 --host=127.0.0.1 --port=8088

注意:

  • controller-address:就是我们3.2.1中启动的控制器服务的地址,用于模型工作进程与控制器通信。
  • worker-address:模型工作进程对外提供服务的地址,用于注册到控制器。(建议跟controller-address保持一致)
  • host和port:指定 Uvicorn 服务器监听的地址和端口,用于接收实际请求。
  • 通过这种指定的方式,可以确保模型工作进程正确地注册到控制器,并且 Uvicorn 服务器监听指定的端口。

执行命令之后,我们可以前往控制器启动的窗口,会发现有如下提示,说明注册成功:

2024-09-03 17:14:24 | INFO | controller | Register a new worker: http://127.0.0.1:8088
2024-09-03 17:14:24 | INFO | controller | Register done: http://127.0.0.1:8088, {'model_names': ['glm-4-9b-chat'], 'speed': 1, 'queue_length': 0}
2024-09-03 17:14:24 | INFO | stdout | INFO:     127.0.0.1:33239 - "POST /register_worker HTTP/1.1" 200 OK

然后,可以通过如下的方式,测试控制器与工作进程之间的连通性:

python3 -m fastchat.serve.test_message --model-name glm-4-9b-chat --worker-address http://127.0.0.1:8088 --controller-address http://127.0.0.1:8087

测试结果如下:

Human: Tell me a story with more than 1000 words.
Assistant: Of course! Here's a story for you:

---

### The Enchanted Forest

In the heart of the ancient kingdom of Eldoria, there lay a

3.2.3 启动 OpenAI API 服务器

这是兼容OpenAI API并实际应用到autogen中的接口,同样也需要注册到控制器

python -m fastchat.serve.openai_api_server --host 127.0.0.1 --port 8089 --controller-address http://localhost:8087

 然后就可以将 http://127.0.0.1:8089更新到 config_list 配置文件中了。

3.3 附加说明
3.3.1 直接启动

综上主要是为了记录探索过程中的一些过程点,如果想要直接快速使用的话,也可以参考官方网站的指导,直接采用如下命令启动,此时host与port均采用默认设置:

1、启动控制器

python -m fastchat.serve.controller

2、启动模型工作进程:

python -m fastchat.serve.model_worker --model-path chatglm2-6b

3、启动 RESTful API 服务器

python -m fastchat.serve.openai_api_server --host localhost --port 8000

3.3.2 错误提示

通常情况下,这将正常工作。但是,如果遇到像 这样的 错误,可以通过在 fastchat/protocol/api_protocol.py 和 fastchat/protocol/openai_api_protocol.py 中注释掉所有包含 finish_reason 的行来解决问题。修改后的代码如下所示:

class CompletionResponseChoice(BaseModel):index: inttext: strlogprobs: Optional[int] = None# finish_reason: Optional[Literal["stop", "length"]]class CompletionResponseStreamChoice(BaseModel):index: inttext: strlogprobs: Optional[float] = None# finish_reason: Optional[Literal["stop", "length"]] = None

四、代码实践

测试的时候发现,API的方式响应很慢。下一篇文章将记录直接使用自定义模型加载类来实现的方式,相对会快一些。

测试代码如下:

# -*- coding: utf-8 -*-from autogen.agentchat.conversable_agent import ConversableAgent# 示例配置
llm_config = {"config_list": [{"base_url": "http://localhost:8000/api/v1/","api_key": "NULL","model": "glm-4-9b-chat"},]
}# 示例使用
def func_method_02(llm_config):# 初始化您的代理agent_a = ConversableAgent("脱口秀演员A",llm_config=llm_config,human_input_mode="NEVER")agent_b = ConversableAgent("脱口秀演员B",llm_config=llm_config,human_input_mode="NEVER")message = {"role": "user","content": "大家好,欢迎大家来参加脱口秀大会,下面将由我们俩为大家讲一段儿脱口秀,感谢大家捧场了"}result = agent_a.initiate_chat(agent_b, message=message)print("result: \n", result)func_method_02(llm_config)

参考资料:

  • FastChat官方github
  • autogen官方指导-Non-OpenAI Models
  • 本地大模型接入Autogen,多专家Agent帮你处理问题
  • FastChat工作原理解析

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

一篇常见第三方库之以及详细使用示例教程

作者:郭震 我们介绍了几个常用的 Python 第三方库,包括 NumPy、Pandas、Matplotlib 和 Requests.本篇将通过一些简单的示例来演示如何有效地使用这些库,以帮助小白理解它们的基本用法.通过这些案例,你可以直观感受到这些库在日常编程中的价值. NumPy NumPy 是一个强…

规控面试复盘

目录 前言 一、京东方 1、CPP和C的区别是什么? 2、讲一下的ROS的话题通信 二、Momenta(泊车部门实习面试) 1、MPC的预测时间步是多少? 2、MPC的代价函数考虑的是什么? 三、九识 1、智能指针有哪些优缺点? 优点: 缺点: 2、Protobuf的数据传输效率为什么更高…

【陪诊系统-PC管理端】动态路由

先说说这里为什么要使用动态路由? 因为前面的菜单管理功能模块中,可以创建或修改不同权限,当前登录账号可以绑定不同的权限,不同权限能访问的功能页面不同,所以使用动态路由来控制。 而登录成功后,服务器…

前端报文加密

前端加密功能 前端提供简单的AES对称加密算法,注意key 和后端网关配置相同,这里打包混淆后,相对安全。 (lun-ui\src\store\modules\user.js、base-gateway-dev.yml) 后端解密功能 使用hutool提供的工具类进行解密pub…

【无标题】docker-compose一键部署项目,haproxy容器代理多个web或java容器

# 创建脚本,可以在java环境中运行任何的jar包或者war包#!/bin/bash/usr/local/jdk/bin/java -jar /java/src/*.?ar 一、思路分析: (1)nginx 1、下载镜像,将本地的dist项目的目录挂载在容器的/usr/share/nginx/html/ …

连接型CRM+智能制造,助力医疗器械企业高质量发展

8月29日,由中国医疗器械行业协会智能制造与智慧监管分会主办,纷享销客参与协办的“数字化建设与智能制造助力医疗器械企业高质量发展”研讨会于苏州圆满落幕,国内知名医疗器械企业高层、行业专家及在医疗行业合规前沿的优秀专业人士齐聚一堂&…

【RabbitMQ】基本概念以及安装教程

1. 什么是MQ MQ( Message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是消息(message)而已.消息可以非常简单,比如只包含文本字符串,JSON等,也可以很复杂,比如内嵌对象.MQ多用于分布式系统之间进行通信 系统之间的调用通常有两种方式…

光盘安全隔离与信息单向导入系统-信刻

信刻从用户需求出发,为更多用户提供安全可靠的跨网数据单向导入/导出光盘摆渡系统解决方案,解决内外网数据交换的问题,确保数据交换过程的安全性。 公司所研发出的光盘安全隔离与信息单向导入系统依托软硬件相结合的技术,集策略摆…

mac 安装redis

官网下载指定版本的redis https://redis.io/ 目前3.2.0 是最新最稳定的 版本 这里是历史版本下载 下载指定版本 安装 1.放到自定义目录下并解压 2.打开终端,执行命令 cd redis的安装目录下 make test -- 此命令的作用是将redis源代码编译成可执行文件&#xff0c…

飞思相机存储卡格式化数据如何恢复?提供全面指南

在数字摄影时代,‌飞思相机以其卓越的成像质量和专业的性能,‌赢得了众多摄影师的青睐。‌然而,‌即使是专业的设备也难免遭遇数据丢失的困境,‌尤其是当存储卡不幸被格式化时。‌面对这一突如其来的灾难,‌许多摄影师…

JSON 格式详解

JSON 格式详解 随着互联网的发展和各种 Web 应用程序的普及,数据交换已经成为了我们日常开发中的重要环节。而在各种数据交换格式中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,以其简洁、易于阅…

基于yolov8的106种鲜花识别花朵检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的106种鲜花识别花朵检测系统是一项融合了先进深度学习技术的创新应用。该系统利用YOLOv8算法,这一目前最先进的目标检测模型之一,实现了对106种不同花卉的快速、准确识别。 YOLOv8以其速度快、准确性高和鲁棒性强的特点&#…

IP的SSL证书的申请及配置方式

随着互联网技术的发展,数据安全变得越来越重要。HTTPS协议因其提供的加密传输能力而成为现代Web通信的标准。实现HTTPS的关键组件之一就是SSL/TLS证书,它为网站提供了一层保护,确保客户端与服务器之间的数据传输是加密的。本文将指导您如何为…

xmos 相关知识--- xn文件解析

1.XN 文件解析 type 声明是device name 是名称 tile 资源声明 一个是XCore 一个是 usb 相关的物理层资源 package 对应芯片,包含两个Node 和一个link 两个node ,一个是xcore 一个是USB,每个node 都有一个id号,从0开始 xrun: C…

指针之旅(2)——const修饰词 野指针、空指针与泛型指针

目录 Part one(一) 1. const关键字 1.1 const修饰普通变量 1.1.1 const的作用 1.1.2 指针绕过const 1.2 const修饰指针变量 1.2.1 const在 * 前 1.2.2 const在 * 后 1.2.3 双重const修饰 Part two(二) 1. 野指针 * 野…

Sentence-BERT实现文本匹配【回归目标函数】

引言 上篇文章我们通过Sentence-Bert提出的分类目标函数来训练句子嵌入模型,本文同样基于Sentence-Bert的架构,但改用回归目标函数。 架构 如上图,计算两个句嵌入 u \pmb u u和 v \pmb v v​之间的余弦相似度,然后可以使用均方误…

Webpack详解与配置环境

webpack:webpack网址 1、工作原理: Webpack是一个非常强大的静态模块的打包工具。从文件入口开始,递归解析以来关系,然后将所有模块打包成一个或多个budle文件。 2、webpack核心概念: Entry:入口起点(en…

【STM32+HAL库】---- 通用定时器实现外部脉冲计数

硬件开发板:STM32G0B1RET6 软件平台:cubemaxkeilVScode1 新建cubemax工程 1.1 配置系统时钟RCC 1.2 配置定时器 选择通用定时器TIM2,时钟源选择ETR2,对应的输入端口为PA0引脚,预分频系数为0,重装载值选择…

Python简易IDE工作界面制作

、 休闲一下,学习编程还是要学习一些界面编程,能够根据需要制作图形操作界面,这样我们开发的程序才能方便操作和使用,同时获得更友好的人机交互体验。下面是一个用PyQt5制作的简易界面,供大学参考。如下图所示&a…

在SpringMVC中用fmt标签实现国际化/多语言

SpringMVC中用fmt标签实现国际化主要解决界面的多语言化,ftm标签会根据浏览器的语言值来先择对应的文件配置,如中文简体的浏览器值是zh_CN,那么ftm标签就会用以zh_CN.properties结尾的配置文件中的key来取值,从而实现自多语言的自动切换&…