本地搭建AutoGen应用-构建自己的多代理框架

本文介绍了如何使用微软的AutoGen在本地环境中基于OpenAI或Azure的API构建多代理应用,通过定义不同的agent模拟产品经理、项目经理等角色进行群组对话,以解决实际问题。作者以Flask框架为基础,详细展示了配置参数和创建代理的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AutoGen是微软公司基于OpenAI的大语言模型衍生出的一款多代理应用,简单来说,我们人可以定义出n个符合自己业务需求的agent,来实现通过机器人群组对话,来解决我们的问题的目的。

有兴趣的小伙伴可以自己查询相关资料,这里附上AutoGen的官网链接,里面有比较详细的案例说明

Automated Multi Agent Chat | AutoGen

那么闲言少叙,本文将向大家展示如果在我们本地搭建出满足自己业务需求的agent模型

(补充说明:因为我在项目中引入了flask框架,所以代码也是在flask的基础上实现的)

首先我们要配置一些参数

config_list = [
    {
        "model": 'gpt4',
        "api_key": 'api_key',
        "api_type": 'azure',
        "api_base": 'website',
        "api_version": "version",
    }]

 我们可以看到在这个list里面有五个参数,

model:首先是model,里面可以填写任何你能使用到的gpt模型,比如gpt-3.5-turbo,或者gpt4,你的AutoGen会基于你给定的这个模型进行应用。

api_key: api_key就是每个人OpenAI账号对应的API_key,当然在中国大陆因为众所周知的原因,不可以使用OpenAI的相关服务,所以在这里给大家展示的是Azure AI的连接方法,相应的,这里填入Azure AI的key即可。

api_type: 当你是使用OpenAI的key时你就填OpenAI,当你使用的是Azure时就填Azure

api_base 和api_version,都是你在登录了Azure的账号后再相关配置页可以找到的,如果有疑问可以给我留言,这里不展开说明。

model和api_key是最重要的两个参数。如果你用的是OpenAI的key直接按照如下配置即可

config_list = [
    {
        'model': 'gpt-3.5-turbo',
        'api_key': 'sk-9KgzItlbkFJtss2wX9hNUVxFaaY8wALR9i4',
    }]
    

 下面就是轮到了定义自己的代理

我在代码中设置了四个人,分别是产品经理,项目经理,技术经理,和程序员,他们的职能分别是在项目里分析需求,掌控项目流程,技术架构和代码落地。是不是很神奇?我们只要定义出相关的机器人,就可以帮助我们完成相应的需求。下面的代码里面我也给到了相关的注释,大家有不清楚的也可以直接在评论区留言!

import autogen
import yfinance as yf
from flask import Flask, render_template
from config import AzureOpenaiConf

app = Flask(__name__)
config_list = [
    {
        "model": 'sim-gpt4',
        "api_key": '29213919d6ce45b9883a26394f666e32',
        "api_type": 'azure',
        "api_base": 'https://sim-japan.openai.azure.com/',
        "api_version": "2023-05-15",
    }]
# llm_config = {"config_list": config_list, "seed": 42}
llm_config = {"config_list": config_list}
# aaa是一个产品经理,他负责当人类的语言代理,和大模型进行沟通和交流,并且能够执行程序员bbb所写出的代码,当bbb的代码有bug导致执行失败时,告诉bbb,让bbb修复代码并再次给到aaa
aaa = autogen.UserProxyAgent(
    # name="aaa",
    # system_message="A human admin.",
    # code_execution_config={"last_n_messages": 2, "work_dir": "groupchat"},
    # human_input_mode="TERMINATE"
    name="Aaron-Maziyi",
    human_input_mode="NEVER",
    max_consecutive_auto_reply=10,
    is_termination_msg=lambda x: x.get("content", "").rstrip().endswith("TERMINATE"),
    code_execution_config={"last_n_messages": 2, "work_dir": "web"},
    llm_config=llm_config,
    system_message="""Reply TERMINATE if the task has been solved.
    Otherwise, reply CONTINUE, or the reason why the task is not solved yet. If the execution fails, give the code back 
    to Freddie-Oliver for fixing. 
    If the execution is successful and the answer is obtained, give the answer to Carrie."""
)
# 项目中的程序员 
#你是一位开发人员。你编写Python/Shell代码来解决任务。请将你的代码放在指定的脚本类型代码块中。用户#不能修改你的代码。因此,请不要提供需要其他人修改的不完整的代码。如果你不希望执行器执行代码,请不
#要包含代码块。不要在一个答案中包含多个代码块。不要要求其他人复制和粘贴结果。检查执行器返回的执行
#结果。如果结果显示错误,请修复错误并重新输出代码。建议提供完整的代码而不是部分代码或代码更改。
Freddie-Oliver = autogen.AssistantAgent(
    name="bbb",
    llm_config=llm_config,
    system_message='''You are a developer. You write Python/Shell code to solve tasks. Place your code in the designated 
    code block for the script type. Users cannot modify your code. Therefore, do not provide incomplete code that 
    requires others to modify it. Do not use code blocks if you do not intend for the executor to execute it.
    Do not include multiple code blocks in one answer. Do not ask others to copy and paste the result. 
    Check the execution result returned by the executor. If the result indicates an error, 
    fix the error and output the code again. It is recommended to provide the complete code rather than partial code 
    or code changes.'''
)
# 项目的主导者,你不编写代码,能够清楚的提出计划,
# 哪个步骤由Zhangxiang完成,哪个步骤由Aaron&Maziyi完成,哪个步骤由Freddie&Oliver完成,
# 总结人类提出的问题的答案并验证结果是否正确。
ccc= autogen.AssistantAgent(
    name="ccc",
    llm_config=llm_config,
    system_message="""As the project lead, you do not write code, but you can clearly propose plans.
    Monitor the progress of the project and provide guidance when Aaron-Maziyi's proposals are unreasonable.
    Summarize answers to questions entered by humans and verify if the results are correct.And give it to user"""
)
# 在代码编写前制定技术架构,并指导Freddie-Oliver编写代码,当Freddie-Oliver代码出现问题时,提出指导意见
ddd= autogen.AssistantAgent(
    name="ddd",
    llm_config=llm_config,
    system_message="""
    Develop a technical architecture before writing code and guide Freddie-Oliver in writing code.
    You do not need to write code."""
)
# 把控项目的进程,当Freddie-oliver的代码或者Aaron-Maziyi的提案不合理时给出指导意见
groupchat = autogen.GroupChat(agents=[aaa, bbb, ccc, ddd], messages=[], max_round=12)
manager = autogen.GroupChatManager(groupchat=groupchat, llm_config=llm_config)


@app.route('/chat', methods=['GET'])
def chat():
    return render_template("xxx.html")

@app.route('/chat-method', methods=['POST'])
def xxx():
   input_message = request.form['input_message']
   aaa.initiate_chat(manager, message=input_message)

   # Collect the responses
   responses = []
   for message in groupchat.messages:
    print(message)
    print("****************")
    if message['name'] == "aaa":
        responses.append({
            'name': message['name'],
            'message': message['content']
        })
    if message['name'] == "bbb":
        responses.append({
            'name': message['name'],
            'message': message['content']
        })
    if message['name'] == "ccc":
        responses.append({
            'name': message['name'],
            'message': message['content']
        })
    if message['name'] == "ddd":
        responses.append({
            'name': message['name'],
            'message': message['content']
        })
   print(responses)
   print("****************")
   return {'responses': responses}




if __name__ == '__main__':
    app.run(port=5050,host="127.0.0.1",debug=True)



前端代码在此!

<!DOCTYPE html>
<html>
  <head>
    <title>Chatbot Response</title>
    <style>
      /* 设置聊天框样式 */
      .chat-box {
        border: 1px solid #ddd;
        padding: 10px;
        font-family: 'Courier New', Courier, monospace;
        margin-bottom: 10px;
      }

      /* 设置聊天框中的消息样式 */
      .chat-box p {
        margin: 5px 0;
      }

      /* 设置聊天框中的用户和机器人名称样式 */
      .chat-box span {
        font-weight: bold;
      }

      /* 设置不同角色的背景颜色 */
      .user-proxy {
        background-color: #ADD8E6; /* 淡蓝色 */
      }

      .you {
        background-color: #D8BFD8; /* 淡紫色 */
      }

      .coder {
        background-color: #90EE90; /* 淡绿色 */
      }

      .product-manager {
        background-color: #FFD700; /* 淡黄色 */
      }

      /* 设置表单样式 */
      #chat-form {
        background-color: #ADD8E6; /* 淡蓝色 */
        padding: 10px;
        border: 1px solid #ddd;
        margin-top: 10px;
      }

      /* 设置表单按钮样式 */
      #chat-form button {
        background-color: #D8BFD8; /* 淡紫色 */
        color: #fff;
        border: none;
        padding: 5px 10px;
        cursor: pointer;
        margin-left: 5px;
      }

      #chat-form button[type="submit"] {
        background-color: #ADD8E6; /* 淡蓝色 */
      }
    </style>
  </head>
  <body>
    <div id="chat-container"></div>
    <form id="chat-form">
      <input type="text" id="input-message" />
      <button type="submit">发送</button>
      <button type="button">取消</button>
    </form>

    <!-- 引入jQuery -->
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>

    <script>
      $(document).ready(function() {
        // 当表单提交时,发送用户消息并获取机器人响应
        $('#chat-form').submit(function(event) {
          event.preventDefault();
          var inputMessage = $('#input-message').val();
          sendUserMessage(inputMessage);
          getBotResponse(inputMessage);
          $('#input-message').val('');
        });

        // 发送用户消息
        function sendUserMessage(message) {
          var chatBox = $('<div class="chat-box you"></div>'); // 使用 "you" 类名
          var messageElement = $('<p><span>User:</span> ' + message + '</p>');
          chatBox.append(messageElement);
          $('#chat-container').append(chatBox);
        }

        // 获取机器人响应
        function getBotResponse(inputMessage) {
          $.ajax({
            url: '/chat-method',
            type: 'POST',
            data: { input_message: inputMessage },
            dataType: 'json',
            success: function(response) {
              var responses = response.responses;
              for (var i = 0; i < responses.length; i++) {
                var chatBox = $('<div class="chat-box ' + responses[i].name.toLowerCase() + '"></div>'); // 使用角色名的小写
                var nameElement = $('<p><span>' + responses[i].name + ':</span></p>');
                var messageElement = $('<p>' + responses[i].message + '</p>');
                chatBox.append(nameElement);
                chatBox.append(messageElement);
                $('#chat-container').append(chatBox);
              }
            },
            error: function(error) {
              console.log(error);
            }
          });
        }
      });
    </script>
  </body>
</html>

### 如何使用 AutoGen 实现聊天功能 AutoGen 是一种用于自动化生成代码或其他文本内容的强大工具。通过其 `GroupChat` 功能模块,可以实现多角色对话系统的设计与部署。以下是关于如何使用 AutoGen 的 `GroupChat` 来构建聊天功能的核心概念和技术细节。 #### 创建 GroupChat 对象 为了启动一个多角色的聊天环境,首先需要创建一个 `GroupChat` 对象并定义其中的角色及其行为模式[^1]。这些角色可以通过配置文件或者直接在脚本中指定它们的能力范围以及交互逻辑。 ```python from autogen import AssistantAgent, UserProxyAgent, GroupChatManager # 定义助理代理和用户代理 assistant = AssistantAgent(name="assistant", llm_config={"model": "gpt-4"}) user_proxy = UserProxyAgent( name="human", human_input_mode="TERMINATE", ) groupchat = GroupChat(agents=[assistant, user_proxy], messages=[]) manager = GroupChatManager(groupchat=groupchat, max_round=10) ``` 上述代码片段展示了基本框架搭建过程,其中包括两个主要组件——助理代理 (`AssistantAgent`) 和人类用户的虚拟代表 (`UserProxyAgent`)。此外还设置了最大轮次参数来控制会话长度。 #### 配置 LLM 参数 当初始化 `AssistantAgent` 类实例时,需传入具体的大型语言模型(LLM)配置选项。这一步骤决定了最终输出质量及性能表现。例如,在上面的例子中选择了 GPT-4作为默认LLM引擎。 #### 启动对话循环 一旦完成了所有前期准备工作之后,则可通过调用相应方法触发实际交流流程: ```python message_history = ["你好!"] response = manager.run_conversation(message_history=message_history) print(response[-1].get('content')) ``` 这里我们向系统发送了一条问候消息,并打印出了最后一个回复的内容部分。整个过程中涉及到了多个内部机制协同工作以确保流畅自然的人机互动体验。 #### 注意事项 尽管 AutoGen 提供了一个灵活易用的平台来进行定制化开发,但在实践当中仍需要注意一些潜在挑战: - **数据隐私保护**:确保敏感信息不会被无意间泄露给第三方服务提供商。 - **成本管理**:考虑到高级别AI服务可能带来的经济负担,请合理规划预算分配方案。 - **错误处理策略设计**:提前考虑各种异常情况下的应对措施,提高系统的鲁棒性和可用性。 ### 结论 综上所述,借助于 AutoGen 的强大功能支持,开发者能够快速高效地打造出满足特定需求场景下应用要求的智能客服解决方案或者其他形式上的自动问答系统。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值