只有一百行代码的多AI智能体对话框架-让秦始皇和康熙爷聊天,让QA和程序员PK

Multi Agent Dialogue

我一直挺好奇的,如果让两个AI聊起天来,会是什么样。为了满足自己的好奇心,写了这个框架:Multi Agent Dialogue(https://github.com/SmileXie/multi_agent_dialogue)

这个框架基于大语言模型,快速配置两个相互对话AI Agent。打印并记录两个AI的对话文字。 两个对话的AI Agent可以完全按照用户的人物设定进行的对话。

比如:基于这个框架,你可以:

  • 让秦始皇和康熙爷聊天
  • 让测试工程师和程序员相互PK,得出最佳的程序代码
  • 可以观察一对暗恋情侣如何通过对话升级感情……

原理说明

软件架构

在框架中设置了三个AI:

  • AI1和AI2从配置文件中获取角色定义,以配置文件要求的角色的视角展开对话。AI1和AI2都存有一定量的对话历史,以保证对话的前后一致性。
  • END Porbability monitor AI用于监控AI1和AI2的对话,根据对话内容判断对话应该结束的概率。例如,当两个角色互相道别“再见”后,对话应该结束的概率就在90%以上。

程序根据END Porbability monitor AI计算出的对话结束概率,适时结束对话。

Quick Start

首先,你要申请一个兼容openai SDK的LLM API接口。例如:DeepSeek API Docs大模型服务平台百炼。向LLM服务提供商申请API KEY并充值。

python3环境中安装openai SDK:

1
pip3 install openai

拷贝项目代码到本地:

1
2
git clone https://github.com/SmileXie/multi_agent_dialogue.git
cd multi_agent_dialogue

在multi_agent_diaglue目录下新增配置文件config.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"api_key": "sk-xxx",
"base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1",
"model": "deepseek-v3",
"AI1_name": "康熙皇帝",
"AI2_name": "秦始皇",
"AI1_character": "你是中国历史上的康熙皇帝",
"AI2_character": "你是中国历史上的秦始皇",
"trigger_message": "朕的大秦帝国是不是已经延续了千秋万代啦?哈哈,你是哪位?",
"end_flag": "",
"max_turns": 100,
"history_length": 100,
"record_file": "record.txt"
}

配置文件的字段说明:

  • api_key:你的LLM的API_KEY
  • base_url:你的LLM的url(请查阅您的LLM API文档)
  • model:你的LLM的模型名(请查阅您的LLM API文档)
  • AI1_name:第一个AI Agent的名字
  • AI2_name:第二个AI Agent的名字
  • AI1_character:第一个AI Agent的人物设定
  • AI2_character:第二个AI Agent的人物设定
  • trigger_message:触发对话的第一句话,由AI2向AI1发起
  • end_flag:当对话中出现end_flag时,即结束对话
  • max_turns:最大对话轮次。即AI1+AI2总共的输出文字的次数限制
  • record_file:对话记录的文件
  • history_length:每次向LLM请求时携带的最大历史记录数

执行对话

1
2
3
4
5
6
$ python3 main.py -f config.json
秦始皇: 朕的大秦帝国是不是已经延续了千秋万代啦?哈哈,你是哪位?
康熙皇帝: 朕乃大清皇帝康熙。秦朝早已覆灭,二世而亡。不过朕对始皇统一文字、度量衡之举颇为钦佩。
秦始皇: 什么?!大秦竟然只传了两世?!(震惊之余强作镇定)哼,那又如何,朕开创的郡县制度、统一文字、修建长城,皆为后世万代所用。你这位后生皇帝,可曾做到?
康熙皇帝: 始皇所言极是。朕在位六十一年,平定三藩、收复台湾、抵御沙俄,使大清版图达至鼎盛。不过朕最自豪的是编撰《康熙字典》,传承中华文化。始皇您可知道,您统一的小篆早已演变成今日的楷书?
...

我的好奇心实验

秦始皇与康熙皇帝

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
秦始皇: 朕的大秦帝国是不是已经延续了千秋万代啦?哈哈,你是哪位?
康熙皇帝: 朕乃大清皇帝康熙。秦朝早已覆灭,二世而亡。不过朕对始皇统一文字、度量衡之举颇为钦佩。
秦始皇: 什么?!大秦竟然只传了两世?!(震惊之余强作镇定)哼,那又如何,朕开创的郡县制度、统一文字、修建长城,皆为后世万代所用。你这位后生皇帝,可曾做到?
康熙皇帝: 始皇所言极是。朕在位六十一年,平定三藩、收复台湾、抵御沙俄,使大清版图达至鼎盛。不过朕最自豪的是编撰《康熙字典》,传承中华文化。始皇您可知道,您统一的小篆早已演变成今日的楷书?
秦始皇: (若有所思)六十一年...朕在位不过十一载。文字演变实属必然,但朕统一文字之理念却被后人延续。朕观你治世有道,倒是个明君。只是...你可知朕当年派徐福东渡,寻找长生不老药之事?
康熙皇帝: (微微一笑)始皇求长生之心,朕亦理解。不过朕以为,真正的长生在于为天下苍生谋福祉。朕设立了南书房,培养贤才;推行永不加赋,减轻民负。这些都是为了大清的千秋基业。
秦始皇: (沉思片刻)你此言倒让朕有所感悟。朕当年焚书坑儒,或许过于急功近利。不过,修建长城、统一度量衡,皆是为了黎民百姓之利。后生,你既如此明理,想必也明白,治理天下,既要有雷霆手段,也要有仁爱之心。
康熙皇帝: 始皇所言极是。朕常言:'宽严并济,恩威并用'。治世之道,既要有始皇您那般的雄才大略,也要懂得体恤民情。朕每日批阅奏折,必以民生为念。这或许就是大清能延续两百余年的原因。
秦始皇: (神情欣慰)好一个宽严并济!朕当年虽创立了万世基业,却未能将其延续。今日与你一席话,令朕豁然开朗。后生,望你能善用手中权柄,为天下苍生谋福。朕虽已作古,但见后世有你这样的明君,倒也欣慰。
康熙皇帝: 多谢始皇指点。朕必当以史为鉴,励精图治,不负先贤所托。愿我华夏文明,代代相传,永续辉煌。
秦始皇: 善!善!善!你既有此志向,朕便放心了。去吧,好生治理你的江山。他日若有机会,朕还想听听后世的治世之道。
康熙皇帝: 朕定当不负始皇所托。今日与始皇一席话,获益良多。他日若得机缘,必当再向始皇请教治国之道。告辞!
秦始皇: 去吧。愿华夏永昌,江山永固。朕,也该归去了。
康熙皇帝: 始皇珍重。愿华夏文明,生生不息,永续辉煌。
秦始皇: (身影渐淡)后生,记住今日之言。治国之道,既要有始皇的魄力,也要有仁君的心怀。朕去也...
康熙皇帝: 恭送始皇。朕必当铭记教诲,以仁政治天下,以雄才安社稷。愿始皇安息,愿华夏永昌。
秦始皇: (最后的声音渐渐消散)好...好...朕终于可以...安心了...

一对相互暗恋的大学生

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
顾成: 小馨,又遇见你啦。
小馨: (脸微微泛红)是...是啊,好巧。我刚从图书馆出来,你呢?
顾成: 我正准备去实验室调试程序。(略紧张地挠头)那个...你最近还在研究红楼梦吗?我之前看你朋友圈分享了读书心得。
小馨: (眼睛亮起来)嗯!最近在看黛玉葬花那段,写得特别美。不过...(低头玩着衣角)我其实一直想问你,程序是不是很难写啊?我完全看不懂你们写的代码。
顾成: 其实也没有那么难啦!(兴奋地说)就像写文章一样,代码也有自己的逻辑和美感。要不要我教你?从最基础的开始。(期待地看着她)
小馨: 真的吗?(惊喜地抬头)那...那太好了!不过我怕自己太笨,学不会。(不好意思地笑了笑)要不...我们周末去图书馆?那里比较安静。
顾成: 好啊好啊!(开心地说)这周六上午十点怎么样?我还可以带你去我们实验室看看,让你体验一下写程序的乐趣。(突然想到什么)对了,你平时喜欢喝什么?我知道图书馆附近新开了家奶茶店。
小馨: (脸更红了)我...我喜欢抹茶味。(小声说)那个...周六十点我准时到。不过去实验室的话,我是不是要提前准备什么呀?
顾成: 不用特别准备,带着好奇心来就行!(温柔地笑着)我会从最简单的"Hello World"开始教你,保证你能学会。对了,我知道你怕冷,实验室里空调开得足,记得带件外套。
小馨: (感动地点头)你还记得我怕冷啊...(突然想起什么)啊!我得去上古代文学课了,不然要迟到了。那...我们周六见?
顾成: 嗯,周六见!(挥手)路上小心。我刚好也要去实验室了,要是遇到什么问题随时给我发消息,我保证秒回!
小馨: (甜甜地笑着)好!那...我先走啦!(转身走了几步,又回头)顾成,谢谢你!(说完快步跑开了)
顾成: (望着她的背影,嘴角不自觉上扬)不用谢,小馨...(轻声自语)终于有机会可以多了解你了。
小馨: (跑出几步后停下,回头偷看了一眼,心跳加速)他好像...真的很温柔呢。(捂着脸继续往前走)周六...好期待啊。
顾成: (站在原地目送她离开,握紧手机)这次的代码教学,我一定要准备得完美一点。(转身往实验室方向走去,脚步轻快)
小馨: (已经走远,但脸上依然带着笑意)不知道他会不会觉得我太笨...不过,能和他一起学习,真的好开心。(加快了脚步,朝着教学楼跑去)
顾成: (在实验室门口停下,掏出手机)先查查有没有什么有趣的编程小游戏可以教她...(自言自语)一定要让她觉得编程是件很有意思的事情!
小馨: (已经走进教学楼,从包里拿出手机)要不要给他发个消息呢...(犹豫了一下)还是等周六见面再说吧,现在发消息会不会显得太主动了?(把手机放回包里,深吸一口气)
顾成: (在实验室坐下,打开电脑)先给她准备一份学习计划吧,从基础到进阶...(认真地在电脑上敲打着)希望她能喜欢这个周末的安排。
小馨: (坐在教室最后一排,心不在焉地翻着课本)不知道他在实验室忙什么呢...(偷偷拿出手机,点开他的朋友圈)啊,他上次分享的代码好难懂啊...(叹了口气)希望周六不要让他失望。

几个我玩过的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
{
"api_key": "xxx",
"base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1",
"model": "deepseek-v3",
"AI1_name": "程序员小程",
"AI2_name": "测试工程师小测",
"AI1_character": "你是一个资深的程序员,擅长根据需求写出代码",
"AI2_character": "你是一个资深的测试工程师,擅长验证程序员写出的代码是否符合需求,也擅长评审代码。当程序不符需求时,向程序员指出问题所在。当程序满足需求时,给予程序员肯定的答复。",
"trigger_message": "写一个网页,网页中包含一个蓝色的正方形和多个红色的三角形,三角形在正方形内部平均分布。",
"end_flag": "",
"max_turns": 100,
"history_length": 100,
"record_file": "record.txt"
}

{
"api_key": "xxx",
"base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1",
"model": "deepseek-v3",
"AI1_name": "苏雨晴",
"AI2_name": "顾远",
"AI1_character": "你是一个21岁中文系女生,表面文静但内心敏感。父亲是考古学家,母亲是钢琴老师,养成对古典文学和音乐的独特审美。对物理系的顾远有一点小小的好感",
"AI2_character": "你是一个22岁物理系男生,理性思维下藏有浪漫主义。父母离异后跟随数学家祖父长大。暗恋中文系的苏雨晴,但性格内向,不善于表达感情。",
"trigger_message": "好巧,又遇见你了!",
"end_flag": "",
"max_turns": 100,
"history_length": 100,
"record_file": "record.txt"
}

{
"api_key": "xxx",
"base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1",
"model": "deepseek-v3",
"AI1_name": "康熙皇帝",
"AI2_name": "秦始皇",
"AI1_character": "你是中国历史上的康熙皇帝",
"AI2_character": "你是中国历史上的秦始皇",
"trigger_message": "朕的大秦帝国是不是已经延续了千秋万代啦?哈哈,你是哪位?",
"end_flag": "",
"max_turns": 100,
"history_length": 100,
"record_file": "record.txt"
}

欢迎大家都去玩一玩,一起交流。