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>