5.1. Tianji MetaGPT Agent
Tianji MetaGPT Agent 是一个基于MetaGPT框架的多智能体系统,专注于理解用户意图并提供精准的人情世故相关建议。该系统由多个协同工作的智能体组成,每个智能体都有其特定的职责和功能。
在使用之前,你需要进行初始安装和配置:
pip install metagpt==0.8.1
并进行配置:
metagpt --init-config # 创建 ~/.metagpt/config2.yaml,此时找到位置,随意修改一个key根据您的需求修改它
# windows 可能创建在类似 C:\Users\用户名\.metagpt\config2.yaml 的地址,请注意运行命令后的终端显示
注意,这里metagpt有默认的大模型调用,我们使用的是自定义的调用,所以此处可以随便配置中写一个key(但一定要写 否则会报错!)
当然,你也可以选择在metagpt的配置中写入大模型key,然后体验快速开始:
metagpt "创建一个 2048 游戏" # 这将在 ./workspace 创建一个仓库
接下来,我们将介绍 Tianji 中 metagpt 的实现,如何实现一个送祝福智能体的串联。
5.1.1. 核心智能体
5.1.1.1. 1. 意图识别智能体 (IntentReg)
代码位置: tianji/agents/metagpt_agents/intentRecognition/role.py
职责:分析用户输入,识别用户意图并映射到预定义场景
主要功能:
分析用户输入的自然语言文本
识别用户当前的意图和需求
将用户问题匹配到预定义的场景类型
输出场景标签供后续处理
可用Actions:
class IntentAnalyze(Action):
"""分析用户意图并映射到预定义场景标签
使用LLM分析用户输入,返回对应的场景类型编号
"""
name: str = "IntentAnalyze"
示例:
# Input示例
user_input = "我想给妈妈过生日,该说些什么祝福语?"
# Output示例(带解释)
scene_label = "4" # 4表示"送祝福"场景
# 解释:系统识别到用户想要进行"祝福"活动,且涉及"生日"和"妈妈"这两个关键要素,
# 因此将其映射到预定义的"送祝福"场景(编号4)
5.1.1.2. 2. 场景细化智能体 (SceneRefine)
代码位置:tianji/agents/metagpt_agents/sceneRefinement/role.py
职责:提取和完善场景要素
主要功能:
信息抽取:从用户对话中提取场景要素
提问助手:对缺失的场景要素进行提问
场景要素验证:确保所有必要信息完整
可用Actions:
class sceneRefineAnalyze(Action):
"""提取场景要素
从用户输入中提取特定场景所需的关键信息
"""
name: str = "sceneRefineAnalyze"
class RaiseQuestion(Action):
"""生成补充问题
针对缺失的场景要素生成自然的追问
"""
name: str = "RaiseQuestion"
示例:
# Input示例(基于上述意图识别结果)
scene_label = "4"
user_input = "我想给妈妈过生日,该说些什么祝福语?"
# Output示例(带解释)
# 1. 首先通过sceneRefineAnalyze提取已有信息:
scene_attributes = {
"节日": "生日",
"对象角色": "妈妈",
"对象年龄段": "", # 未提供
"语言风格": "" # 未提供
}
# 2. 然后通过RaiseQuestion生成追问:
assistant_response = """我理解您想要给妈妈送上生日祝福。为了让祝福更加贴心,
我想了解一下您期望的表达方式:
1. 您想用什么样的语言风格来表达?比如温馨感人、活泼可爱、正式庄重等
2. 您觉得更适合什么样的表达方式?"""
# 解释:系统发现缺少"语言风格"这个关键要素,因此生成自然的追问,
# 并提供具体选项帮助用户更好地表达偏好
5.1.1.3. 3. 回答助手智能体 (AnswerBot)
代码位置:tianji/agents/metagpt_agents/answerBot/role.py
职责:基于场景要素生成定制化回答
主要功能:
整合场景信息和用户需求
生成针对性的建议和解答
提供详细的示例和说明
可用Actions:
class AnswerQuestion(Action): """生成定制化回答 基于完整的场景要素,生成符合用户需求的详细回答 使用模板系统确保回答的结构性和完整性 """ name: str = "AnswerQuestion"
示例:
# Input示例
scene_attributes = {
"节日": "生日",
"对象角色": "妈妈",
"对象年龄段": "中年",
"语言风格": "温馨感人"
}
# Output示例(带解释)
answer = """亲爱的妈妈,生日快乐!
感谢您这些年来的养育之恩,是您的爱让我茁壮成长。
愿您永远健康快乐,我会一直陪伴在您身边。
祝您生日快乐,幸福安康!"""
# 解释:系统根据场景要素生成了回答:
# 1. 使用"温馨感人"的语言风格
# 2. 包含了对母亲养育之恩的感谢
# 3. 表达了对未来的美好祝愿
# 4. 整体风格温情脉脉,适合中年妈妈
5.1.1.4. 4. 搜索助手智能体 (Searcher)
代码位置:tianji/agents/metagpt_agents/searcher/role.py
职责:通过网络搜索补充回答内容
主要功能:
查询扩展:生成相关搜索查询
网络搜索:使用搜索引擎获取相关信息
结果筛选:判断和筛选有价值的网页内容
内容提取:抓取和过滤网页内容
结果整合:将搜索结果整合到回答中
可用Actions:
class QueryExpansion(Action): """生成扩展查询 基于用户输入生成多个相关的搜索查询 """ name: str = "queryExpansion" class WebSearch(Action): """执行网络搜索 使用搜索引擎获取相关网页内容 """ name: str = "WebSearch" class SelectResult(Action): """筛选搜索结果 判断哪些搜索结果值得进一步分析 """ name: str = "selectResult" class SelectFetcher(Action): """抓取网页内容 获取筛选后的网页的具体内容 """ name: str = "selectFetcher" class FilterSelectedResult(Action): """过滤和提取信息 从网页内容中提取有价值的信息 """ name: str = "FilterSelectedResult"
示例:
# Input示例 query = "妈妈生日祝福语温馨感人" # Output示例(带解释) # 1. QueryExpansion生成多个相关查询: expanded_queries = [ "母亲生日祝福语大全", "感人的生日祝福妈妈", "写给妈妈的生日祝福" ] # 解释:系统基于原始查询,生成多个相关查询以获取更全面的信息 # 2. WebSearch和SelectResult筛选后的结果: search_results = { 0: { "url": "https://example.com/birthday-wishes", "title": "暖心的母亲生日祝福语", "content": "...", "filtered_content": "精选的生日祝福内容..." } } # 解释:系统搜索并筛选出最相关的内容,过滤掉广告和无关信息, # 保留对生成祝福语有帮助的优质内容
5.1.2. 工作流程
意图识别:
接收用户输入
分析意图
匹配预定义场景
场景细化:
提取场景要素
检查信息完整性
必要时向用户提问补充信息
答案生成:
基于场景要素生成初步回答
如果启用搜索功能:
扩展搜索查询
获取网络资源
筛选相关内容
整合搜索结果
生成最终回答
5.1.3. 使用示例
from tianji.agents.metagpt_agents.intentRecognition import IntentReg
from tianji.agents.metagpt_agents.answerBot import AnswerBot
from tianji.agents.metagpt_agents.sceneRefinement import SceneRefine
from tianji.agents.metagpt_agents.searcher import Searcher
# 初始化智能体
role_intentReg = IntentReg()
role_sceneRefine = SceneRefine()
role_answerBot = AnswerBot()
role_search = Searcher()
# 使用智能体
intent_ans = await role_intentReg.run(user_input)
refine_ans = await role_sceneRefine.run(user_input)
final_ans = await role_answerBot.run(user_input)
search_results = await role_search.run(user_input)
5.1.4. 支持的场景类型
系统支持多种人情世故相关的场景,包括但不限于:
如何说对话
化解尴尬场合
矛盾与冲突应对
送礼礼仪文化
送祝福
每个场景都有其特定的属性要素,如:
语言场景
对象角色
对象性格
对象情绪
时间等
您可以通过以下文件研究 MetaGPT 的实现:
5.1.4.1. 基础测试用例
test/agents/metagpt/test_metagpt_dummy.py: 简单的计算器助手示例,展示了基本的 Action 和 Role 实现test/agents/metagpt/test_WebSearch.py: 基于 Tavily API 的网页搜索示例
5.1.4.2. 场景化测试
test/agents/metagpt/intentReg_test_case.py: 意图识别助手的测试用例test/agents/metagpt/sceneRefine_test_case.py: 场景细化助手的测试用例test/agents/metagpt/answerBot_test_case.py: 回答助手的测试用例test/agents/metagpt/searcher_test_case.py: 搜索助手的测试用例
5.1.5. 配置要求
Python 3.8+
MetaGPT框架
必要的API密钥(用于LLM和搜索功能)
5.1.6. 注意事项
使用搜索功能需要配置相应的API密钥:
在 .env 文件中配置 TAVILY_API_KEY
可以从 https://app.tavily.com/ 获取 API key
示例配置:
TAVILY_API_KEY=your-tavily-api-key
搜索功能的使用可以参考 searcher_test_case.py:
# 初始化搜索智能体 role_searchBot = Searcher() # 执行搜索 search_results = await role_searchBot.run(user_input) # 搜索结果包含: # - extra_query: 生成的额外查询 # - urls: 搜索返回的网页 # - filter_weblist: 需要进一步查询的网页 # - filtered_content: 从搜索结果提取的资讯
场景要素必须完整才能生成最终答案
网络搜索结果会自动过滤无关内容
系统专注于人情世故相关问题的解答
5.1.7. 扩展指南:自定义Action和Role
在了解了基本的使用方法后,让我们来看看如何扩展系统的功能。通过自定义Action和Role,我们可以根据实际需求构建更加个性化的智能体系统。详细代码可以参考 test/agents/metagpt/test_metagpt_dummy.py
5.1.7.1. 1. 自定义Action
首先让我们从最基础的构建块 - Action开始。Action代表了智能体可以执行的具体操作,就像人类的各种技能一样。要创建自己的Action,我们需要继承MetaGPT提供的Action基类:
from metagpt.actions import Action
class SimpleCalculator(Action):
"""定义Action的示例"""
name: str = "SimpleCalculator" # Action的名称
async def run(self, instruction: str) -> str:
"""实现具体的操作逻辑
Args:
instruction: 输入参数
Returns:
执行结果
"""
try:
num1, num2 = map(int, instruction.split('+'))
result = f"{num1} + {num2} = {num1 + num2}"
return result
except Exception as e:
return f"计算错误: {str(e)}"
5.1.7.2. 2. 自定义Role
Role代表一个具有特定功能的智能体。创建自定义Role需要:
继承
Role基类设置基本属性
配置Action列表
设置反应模式
from metagpt.roles.role import Role, RoleReactMode
class CalculatorAssistant(Role):
"""定义Role的示例"""
name: str = "Calculator" # Role的名称
profile: str = "一个简单的计算助手" # Role的描述
def __init__(self, **kwargs):
super().__init__(**kwargs)
# 设置该Role可以使用的Action列表
self.set_actions([SimpleCalculator])
# 设置反应模式
self._set_react_mode(react_mode=RoleReactMode.BY_ORDER.value)
5.1.7.3. 3. 反应模式说明
Role支持三种反应模式:
REACT模式:按照”思考-行动”循环执行 (
_think -> _act -> _think -> _act)BY_ORDER模式:按照指定的Action顺序依次执行
PLAN_AND_ACT模式:先思考后执行多个动作 (
_think -> _act -> act -> ...)
5.1.7.4. 4. 使用示例
async def main():
# 创建Role实例
calculator = CalculatorAssistant()
# 运行Role并获取结果
result = await calculator.run("5 + 3")
print(f"计算结果: {result}")
# 使用asyncio运行
import asyncio
asyncio.run(main())
5.1.7.5. 5. 注意事项
Action的
run方法必须是异步的(使用async定义)Role的反应模式会影响Action的执行顺序和方式
确保正确处理异常情况
建议在Action中添加适当的日志记录
Role可以配置多个Action,根据需要选择合适的反应模式
通过这种方式,你可以创建自己的智能体系统,实现特定的功能需求。