fastchat与autogen使用要点澄清

news2024/11/15 11:53:15

说明:

本文重点是想使用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 os

from 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: int
    text: str
    logprobs: Optional[int] = None
    # finish_reason: Optional[Literal["stop", "length"]]

class CompletionResponseStreamChoice(BaseModel):
    index: int
    text: str
    logprobs: 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.coloradmin.cn/o/2102937.html

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

相关文章

ElasticSearch学习笔记(五)Bucket聚合、Metric聚合

文章目录 前言9 项目实战9.3 我周边的酒店9.4 酒店竞价排名 10 数据聚合10.1 聚合的分类10.2 DSL实现聚合10.2.1 Bucket聚合10.2.2 聚合结果排序10.2.3 限定聚合范围10.2.4 Metric聚合 10.3 RestAPI实现聚合10.3.1 API语法10.3.2 业务需求10.3.3 业务实现10.3.4 功能测试 前言 …

人工智能、机器学习和深度学习有什么区别?应用领域有哪些?

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 👍感谢小伙伴们点赞、关注! 《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发…

RLHF(带有人类反馈的强化学习)初探

我的目标是,在决策游戏上学习某人风格,可以让人对战“带有某人风格”的AI,比如你可以在这里对战“sky风格的AI”,这样的效果。 我最开始受到的启发来源于xbox的广告《爸爸的幽灵车》,已故人在游戏中留下的速度记录的固定轨迹。 …

传统CV算法——仿射变换原理及应用

可以理解一下常规的翻转和平移。“线性变换”“平移”空间变换中的仿射变换对应着五种变换,平移,缩放,旋转,翻转,错切。而这五种变化由原图像转变到变换图像的过程,可以用仿射变换矩阵进行描述。而这个变换…

异地多活架构计算设计

随着互联网的飞速发展,企业对业务连续性和高可用性的需求日益增加。异地多活架构作为一种高可靠性的系统设计方案,通过在地理上分散的多个数据中心部署应用和数据,有效降低了单一故障点对整个系统的影响,确保业务在灾难发生时能够持续运行。 架构设计策略 业务解耦:将系…

Servelet学习-24.9.3

文章目录 前言一、Servelet概述1.1 简单入门:2.2 生命周期 二、HttpServletRequest对象2.1 常用方法 三、HttpServeletResponse对象 前言 九月,加油 一、Servelet概述 Servelet: server applet servelet就是一个接口,定义了Java类被浏览器访…

《大道平渊》· 廿壹 —— 杀心篇:何谓 “杀心”?本质上,就是寻求杀心的一个过程。

《大道平渊》 "行有不得,反求诸己。" ——《论语 学而》 指的是遇事遭困,须在自身寻因,而非怨天尤人,一味地归咎于外因。 凡事向内求也,多多自省,提高自身的修养和能力,取得成功。…

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

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

模拟算法专题——算法介绍算法讲解力扣实战应用

目录 1、模拟算法介绍 2、算法应用【leetcode】 2.1 替换所有的问号 2.1.1 算法思想 2.1.2 算法代码 2.2 提莫攻击 2.2.1 算法思想 2.2.2 算法代码 2.3 Z字形变换 2.3.1 算法思想 2.3.2 算法代码 2.4 外观数列 2.4.1 算法思想 2.4.2 算法代码 2.5 数青蛙 2.5.1 算…

复旦NLP团队新作:大规模语言模型从理论到实践PDF版

2022 年 11 月,Chat GPT 的问世展示了大语言模型的强大潜能,并迅速引起了广泛关注。Chat GPT 能够有效理解用户需求,并根据上下文提供恰当的回答。它不仅可以进行日常对话,还能够完成复杂任务,如撰写文章、回答问题等。…

测试工程师学历路径:从功能测试到测试开发

现在软件从业者越来越多,测试工程师的职位也几近饱和,想要获得竞争力还是要保持持续学习。基本学习路径可以从功能测试-自动化测试-测试开发工程师的路子来走。 功能测试工程师: 1、软件测试基本概念: 学习软件测试的定义、目的…

Cubase里如何使用效果器插件?

Cubase里如何使用效果器插件?具体操作步骤如下: 1、首先,在你的电脑上打开Cubase软件。进入页面后,单击菜单栏上的设备以进入插件管理器,如下所示,然后继续下一步。 2、接下来,弹出插件管理器窗…

银行业智能化转型:智能客服的崛起与挑战

更多内容个人网站:孔乙己大叔 在当今这个科技日新月异的时代,银行业作为传统金融业的支柱,正经历着一场前所未有的变革。智能客服的兴起,不仅重塑了银行的服务模式,也深刻影响着银行员工的职业生涯。这场由技术驱动的变…

遥控器显示分别对应的无人机状态详解!!

1. 电量显示 遥控器电量:遥控器上通常会显示自身的电池电量,以提醒用户及时充电。 无人机电量:部分高端遥控器还会显示无人机的电池电量,以进度条或百分比的形式表示,帮助用户了解无人机的续航能力。 2. 飞行模式与…

24并发设计模式——线程池模式

一、线程池模式介绍 线程池模式(Thread Pool Pattern)是一种并发设计模式,用于管理和循环使用线程资源以处理大量任务。它旨在提高系统性能和资源利用率,特别是在需要频繁创建和销毁线程的环境中。 1、线程池模式结构图 线程池管…

弱通联条件下的人机混合控制

弱通联条件下的人机混合控制指的是在通信连接不稳定或不可靠的情况下,如何有效地将人工控制与自动化/智能化系统结合起来进行操作。这种情况下,控制系统需要设计得既能在网络问题时维持基本功能,又能充分利用人工输入来补充自动系统的不足。下…

Win10提示输入网络凭据解决方法(Win10 Prompts for Entering Network Credentials Solution)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

什么?!新版 Node.js V22.5 自带 SQLite 模块啦

前言 2024年7月,Node.js V22.5.0 版本发布,自带了 SQLite 模块,意味着开发者可以直接在程序中使用 SQLite 数据库,而无需引入第三方库👍。 话不多说,感觉来体验一波✈。 安装/升级 我现在用的是21.4.0版…

xss.haozi.me

0x03 审查源码我们发现,括号, 方括号都被过滤了 这段代码是一个简单的 JavaScript 函数,名为 render。它接受一个字符串 input 作为参数,并返回一个新的字符串,其中所有圆括号 ( 和 ) 都被移除了。 函数内部定义了一个正则表达式…

三级_网络技术_58_应用题

一、 请根据下图所示网络结构回答下列问题。 1.填写RG的路由表项。 目的网络/掩码长度输出端口__________S0(直接连接)__________S1(直接连接)__________S0__________S1__________S0__________S1 (2)如果在不改变路由表项的前提…