fastchat与autogen使用要点澄清

embedded/2024/12/22 22:17:29/

说明:

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

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

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

一、fastchatautogen简要介绍

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.ppmy.cn/embedded/105378.html

相关文章

检测文件解析漏洞的工具

免责声明此文档仅限于学习讨论与技术知识的分享,不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本文作者不为此承担任何责任,一旦造成后果请自行承担&…

不再畏惧猫咪浮毛,希喂、安德迈、美的宠物空气净化器性能PK

夏天来了,宠物换毛季加上天气闷热,难消的异味和漫天乱飞的猫毛双重夹击,家里的空气质量直线下降。还是鼻炎患者的我感到非常不适,有股想把家里两只毛孩子逐出家门的冲动。每天不是梳毛就是在吸毛的路上,猫咪们还爱到处…

【STM32+HAL库】---- 按键中断控制LED

硬件开发板:STM32G0B1RET6 软件平台:cubemaxkeilVScode1 新建cubemax工程 1.1 配置系统时钟树 1.2 配置相关GPIO引脚 ①LED由PC13引脚控制 选择PA5引脚,GPIO_Output模式 GPIO模式配置: ②按键开关由PC13引脚控制 选择PC13引…

Pytorch安装 CUDA Driver、CUDA Runtime、CUDA Toolkit、nvcc、cuDNN解释与辨析

Pytorch的CPU版本与GPU版本 Pytorch的CPU版本 仅在 CPU 上运行,适用于没有显卡或仅使用 CPU 的机器。安装方式相对简单,无需额外配置 CUDA 或 GPU 驱动程序。使用方式与 GPU 版相同,唯一不同的是计算将自动在 CPU 上进行。 Pytorch的GPU版…

系统思考—关键决策

结‮影构‬响行为,精‮决准‬策创造价值! 最‮身近‬边很多‮伙小‬伴找我“助力”,父‮也母‬经常发‮息信‬让我帮忙,忍‮住不‬研究了一下‮些这‬助力活动的“玩法”。说实话,这‮设种‬计从‮构结‬上真‮很的‬…

安防视频综合管理系统EasyCVR视频汇聚平台集群部署出现状态不同步的情况是什么原因?

随着视频监控技术的快速发展,各类视频资源的整合、管理与分发成为了安防行业的重要挑战。视频综合管理系统EasyCVR视频汇聚平台通过集群部署,实现了视频资源的高效整合与管理。集群部署不仅能够提升系统的处理能力和稳定性,还能有效避免单点故…

服务器出现故障怎么办?快速排查与解决方法

当服务器出现故障时,可能会导致业务中断,给企业或个人带来不小的损失。为了尽快恢复服务,我们需要迅速定位问题并采取相应的解决措施。下面,我们将介绍一些服务器故障的快速排查与解决方法。 常见服务器故障及原因 服务器故障可…

PyQt6 / PySide 6 实现可拖拽的多标签页 web 浏览器【1】(有 Bug)

声明: 本项目代码来自以下两个项目 PyQt 5 / PySide 2 实现 QTabWidget 的拖入拖出功能 https://github.com/akihito-takeuchi/qt-draggable-tab-widget SimPyWeb X —— 使用PyQt5以及QWebEngineView构建网页浏览器 Bug: 存在很多问题: 1. 新拖拽的…