大家好,我是 同学小张,持续学习C++进阶知识和AI大模型应用实战案例,持续分享,欢迎大家点赞+关注,共同学习和进步。
从实战中学习和拆解AgentScope框架的使用和知识。本文利用AgentScope框架实现的是 多智能体的自由讨论 。
代码参考:https://github.com/modelscope/agentscope/tree/main/examples/conversation_self_organizing
0. 实现效果
先上最终的实现效果,给大家一个直观的感受。本文实现的效果如下:
有多个Agent(例如案例中的 PhysicsTeacher物理老师、curious student好奇的学生、analytical student分析型学生),针对一个话题展开讨论,每个Agent轮流发言。
1. 需求拆解
要实现多智能体之间的自由讨论,需要实现以下内容:
(1)有多个对话智能体
(2)多个对话智能体之间的通信(数据流控制)
(3)本文要实现的是不固定的多智能体对话,也就是说,多智能体是动态创建的,因此有个Agent来组织讨论,例如本例中讨论的物理问题,该Agent需要根据这个物理问题创建相应的智能体(物理老师和各种学生等)
这么一看,是不是就觉得非常简单了?对话智能体(DialogAgent)和数据流控制(Pipeline)我们前面都已经深入学习过了,还不了解的可以去看我前面的AgentScope相关文章。
2. 代码实现
2.1 初始化AgentScope
AgentScope在使用前,需要先初始化配置,主要是将要使用的大模型和相关的API Key 设置一下:
import agentscope model_configs = [ { "model_type": "openai", "config_name": "gpt-3.5-turbo", "model_name": "gpt-3.5-turbo", # "api_key": "xxx", # Load from env if not provided # "organization": "xxx", # Load from env if not provided "generate_args": { "temperature": 0.5, }, }, ] agentscope.init(model_configs=model_configs)
2.2 创建讨论的组织者
根据前面的需求分析,我们首先需要有一个Agent来根据问题动态生成讨论问题的Agent们。
这里使用一个对话智能体DialogAgent
即可:
# init the self-organizing conversation agent_builder = DialogAgent( name="agent_builder", sys_prompt="You're a helpful assistant.", model_config_name="gpt-3.5-turbo", )
有了这个agent实例,可以通过传入Prompt和问题来获取参与讨论的Agents以及各Agents的设定。这里的Prompt是比较重要的,看下示例中的Prompt:
Act as a group discussion organizer. Please provide the suitable scenario for discussing this question, and list the roles of the people who need to participate in the discussion in order to answer this question, along with their system prompt to describe their characteristics. The response must in the format of: #scenario#: <discussion scenario> #participants#: * <participant1 type>: <characteristic description> * <participant2 type>: <characteristic description> Here are some examples. Question: Joy can read 8 pages of a book in 20 minutes. How many hours will it take her to read 120 pages? Answer: #scenario#: grade school class discussion #participants#: * Instructor: Act as an instructor who is in a class group discussion to guide the student group discussion. Please encourage critical thinking. Encourage participants to think critically and challenge assumptions by asking thought-provoking questions or presenting different perspectives. * broad-minded-student: Act as a student who is broad-minded and is open to trying new or different ways to solve problems. You are in a group discussion with other student under the guidance of the instructor. * knowledgeable-student: Act as a knowledgeable student and discuss with others to retrieve more information about the topic. If you do not know the answer to a question, please do not share false information Please give the discussion scenario and the corresponding participants for the following question: Question: {question} Answer:
Prompt里,要求要给出讨论的流程、讨论的参与者与讨论参与者各自的“system prompt”。
运行时,将Prompt与问题组合传给Agent:
query = "假设你眼睛的瞳孔直径为5毫米,你有一台孔径为50厘米的望远镜。望远镜能比你的眼睛多收集多少光?" x = load_txt( "D:\\GitHub\\LEARN_LLM\\agentscope\\start_0\\conversation_self_organizing\\agent_builder_instruct.txt", ).format( question=query, ) x = Msg("user", x, role="user") settings = agent_builder(x)
看下这个Agent的运行结果:
文字版运行结果:
tools:extract_scenario_and_participants:82 - {'Scenario': 'Physics class discussion on optics', 'Participants': {'PhysicsTeacher': 'Act as a physics teacher who is leading the discussion on optics. Your role is to facilitate the conversation, provide explanations, and ensure that the discussion stays focused on the topic of light collection and optics.', 'curious-student': 'Act as a student who is curious and eager to learn more about optics and light collection. You ask insightful questions and actively participate in the discussion to deepen your understanding.', 'analytical-student': 'Act as a student who is analytical and enjoys solving problems related to optics. You approach the question methodically and use logical reasoning to arrive at solutions.'}}
输出结果给出了 Scenario 以及该问题的 Participants参与者,参与者有 PhysicsTeacher、curious-student 和 analytical-student。并给出了这几个参与者的角色设定。
之后通过一个解析函数,将里面的角色和设定解析出来就可以用来动态创建这些Agent了。
def extract_scenario_and_participants(content: str) -> dict: result = {} # define regular expression scenario_pattern = r"#scenario#:\s*(.*)" participants_pattern = r"\*\s*([^:\n]+):\s*([^\n]+)" # search and extract scenario scenario_match = re.search(scenario_pattern, content) if scenario_match: result["Scenario"] = scenario_match.group(1).strip() # search and extract participants participants_matches = re.finditer(participants_pattern, content) participants_dict = {} for match in participants_matches: participant_type, characteristic = match.groups() participants_dict[ participant_type.strip().replace(" ", "_") ] = characteristic.strip() result["Participants"] = participants_dict logger.info(result) return result scenario_participants = extract_scenario_and_participants(settings["content"])
2.3 动态创建讨论者
有了参与者及其描述,直接用循环语句创建这些Agent:
# set the agents that participant the discussion agents = [ DialogAgent( name=key, sys_prompt=val, model_config_name="gpt-3.5-turbo", ) for key, val in scenario_participants["Participants"].items() ]
2.4 开始讨论
这里用了 sequentialpipeline 顺序发言:
max_round = 2 msg = Msg("user", f"let's discuss to solve the question with chinese: {query}", role="user") for i in range(max_round): msg = sequentialpipeline(agents, msg)
运行结果见文章刚开始的实现效果,实现讨论。
3. 总结
本文主要拆解了一个利用AgentScope框架实现的多智能体自由讨论案例,先由一个Agent根据问题生成讨论流程和讨论者,然后根据讨论者动态创建Agent。
主要的亮点在于:
(1)有一个Agent把控全局,生成流程和各参与者的描述
(2)动态创建讨论者Agent,这让这个系统有了更好的通用性,根据不同的问题有不同类型和不同数量的Agent会被创建。
值得借鉴。
如果觉得本文对你有帮助,麻烦点个赞和关注呗 ~~~
- 大家好,我是 同学小张,持续学习C++进阶知识和AI大模型应用实战案例
- 欢迎 点赞 + 关注 👏,持续学习,持续干货输出。
- +v: jasper_8017 一起交流💬,一起进步💪。
- 微信公众号也可搜【同学小张】 🙏
本站文章一览: