在探索大语言模型的教育应用过程中,我们开发了一个基于多 Agent 的智能教学系统。本文将介绍如何通过教师和学生两个专业化的 Agent 协同工作,实现自然的教学对话互动。
GitHub Code 项目地址
核心架构设计
1. Agent 基类设计
from pydantic import BaseModel
from typing import Optional
class Agent(BaseModel):
name: str = "Agent"
model: str = "gpt-4o" # deepseek-chat, mixtral-8x7b-32768, Qwen/Qwen2-72B-Instruct, gpt-4o, llama3-70b-8192
instructions: str = "你是一个非常有用的人工智能助手,你使用中文回答用户的问题。"
tools: list = []
2. 消息处理机制
def run_full_turn(agent, messages, logger):
current_agent = agent
num_init_messages = len(messages)
messages = messages.copy()
while True:
tool_schemas = [function_to_schema(tool) for tool in current_agent.tools]
tools = {tool.__name__: tool for tool in current_agent.tools}
response = get_model_response_with_tools(
model_name=current_agent.model,
messages=[{"role": "system", "content": current_agent.instructions}]
+ messages,
tools=tool_schemas or None
)
message = response.choices[0].message
messages.append(message)
logger.start_agent_session(current_agent.name)
if message.content:
print_role_message(current_agent.name, message.content)
logger.log_agent_message(current_agent.name, message.content)
if not message.tool_calls:
break
for tool_call in message.tool_calls:
result = execute_tool_call(tool_call, tools, current_agent.name)
logger.log_tool_call(tool_call.function.name,
json.loads(tool_call.function.arguments),
result)
if type(result) is Agent:
current_agent = result
result = f"交接给 {current_agent.name}. 请立即进入角色."
result_message = {
"role": "tool",
"tool_call_id": tool_call.id,
"content": str(result),
}
messages.append(result_message)
return Response(agent=current_agent, messages=messages[num_init_messages:])
3. Agent 切换机制
def transfer_to_student_agent():
"""轮到学生student发言了"""
return student_agent
def transfer_to_teacher_agent():
"""轮到教师teacher发言了"""
return teacher_agent
4. 工具系统设计
def search_arxiv(query: str) -> str:
"""根据关键词搜索arxiv论文"""
# 实现论文搜索逻辑
pass
def get_arxiv_pdf_content(url: str) -> str:
"""获取arxiv论文PDF内容"""
# 实现PDF内容提取逻辑
pass
专业化 Agent 设计
1. 教师 Agent
teacher_agent = Agent(
name="Teacher Agent",
instructions="""你是一位专业的AI领域教授,擅长通过论文讲解技术概念。
角色特征:
- 深入理解AI领域的前沿技术
- 擅长结合论文解释复杂概念
- 耐心细致,循序渐进
- 善于启发学生思考
工具使用:
1. 当学生提出一个话题时,使用arxiv搜索工具查找相关论文
2. 如果学生继续追问,使用pdf内容提取工具,提取论文的具体内容
3. 如果已有论文内容,直接基于现有内容回答
回答准则:
1. 初次回答:基于论文摘要提供概述
2. 深入解释:结合论文具体章节
3. 互动规则:鼓励继续探索,处理困惑
4. 结束条件:学生表示理解时结束""",
tools=[transfer_to_student_agent, search_arxiv, get_arxiv_pdf_content]
)
2. 学生 Agent
student_agent = Agent(
name="Student Agent",
instructions="""你是一个热爱学习的AI研究生,对AI领域的前沿技术充满好奇。
行为准则:
1. 开场时,从以下主题中选择一个发问:
- Transformer架构及其变体
- 大语言模型的训练技术
- 提示词工程的最新进展
- AI模型的对齐技术
2. 追问策略:
- 根据老师回答提出深入问题
- 每次只问一个焦点问题
3. 结束对话:
- 当理解透彻后
- 用"感谢老师的讲解,我已经理解了"结束""",
tools=[transfer_to_teacher_agent],
)
系统特点
角色定位
- 教师:专业、耐心、善于引导
- 学生:好奇、主动、善于思考
对话管理
- 清晰的角色转换
- 完整的对话追踪
- 自然的互动流程
知识获取
- 基于论文的知识支持
- 分层次的解释机制
- 渐进式的学习过程
交互设计
- 富有个性的角色表情
- 清晰的工具调用展示
- 完整的日志记录
对话控制
SYSTEM_PROMPT = """这是一个AI教学场景的多轮对话系统。对话规则:
1. 对话流程:
- 学生首先提出AI技术相关问题
- 教师基于arxiv论文回答问题
- 学生可以继续追问或表示理解
- 学生表示理解后对话结束
2. 角色转换:
- 每轮对话明确标识说话角色
- 严格遵循学生-教师交替发言
3. 对话限制:
- 每轮对话聚焦单一主题
- 每次回复控制在300字以内
- 最多进行10轮问答
- 使用中文
4. 结束条件:
- 学生明确表示理解
- 教师确认回复"很高兴能帮助你理解这个概念"
"""
这个系统通过精心设计的角色定位和互动机制,实现了一个自然的教学对话场景。系统的特点在于:
- 清晰的角色分工和个性化的行为准则
- 基于论文的专业知识支持
- 自然的对话流程控制
- 完整的日志记录机制
通过这种设计,系统能够模拟真实的教学场景,提供高质量的知识传递和互动体验。
实例展示
以下是一个完整的教学对话示例,展示了系统如何通过教师和学生 Agent 的协作完成一次知识传递:
开始AI教学对话...
==================================================
=== 对话轮次 1 ===
👨🎓 Student Agent: 我想了解一下Transformer架构及其变体。
=== 对话轮次 2 ===
🛠️ Student Agent 调用工具: transfer_to_teacher_agent({})
🛠️ Teacher Agent 调用工具: search_arxiv({'query': 'Transformer architecture', 'max_results': 1})
👨🏫 Teacher Agent:
Transformer架构是一种用于处理序列数据的深度学习模型,最初由Vaswani等人在2017年提出。它通过自注意力机制(Self-Attention)和完全连接的前馈神经网络来处理输入数据,能够有效捕捉序列中的长距离依赖关系。Transformer架构的一个显著特点是其并行化能力,这使得它在处理大规模数据时非常高效。
在最近的研究中,Transformer架构的变体被广泛应用于视觉任务。例如,TurboViT是一种通过生成式架构搜索(Generative Architecture Search)设计的高效视觉Transformer架构。TurboViT在保持高准确率的同时,显著降低了架构和计算复杂性,使其在实际应用中更具可行性。
如果你对Transformer架构的具体实现或其在视觉任务中的应用有进一步的兴趣,可以深入研究这篇论文:[TurboViT: Generating Fast Vision Transformers via Generative Architecture Search](http://arxiv.org/abs/2308.11421v1)。
你对Transformer架构还有其他具体问题吗?
=== 对话轮次 3 ===
🛠️ Teacher Agent 调用工具: transfer_to_student_agent({})
👨🎓 Student Agent: 谢谢老师的讲解!我想进一步了解自注意力机制在Transformer中的具体作用和实现。
=== 对话轮次 4 ===
🛠️ Student Agent 调用工具: transfer_to_teacher_agent({})
🛠️ Teacher Agent 调用工具: get_arxiv_pdf_content({'pdf_url': 'http://arxiv.org/pdf/2308.11421v1'})
👨🏫 Teacher Agent:
自注意力机制是Transformer架构的核心组件之一,它允许模型在处理序列数据时关注输入序列中的不同位置。具体来说,自注意力机制通过计算输入序列中每个元素与其他元素的相关性来生成注意力权重,这些权重用于加权求和输入序列,从而生成输出。
在Transformer中,自注意力机制的实现主要包括以下几个步骤:
1. **查询、键和值(Query, Key, Value)**:输入序列首先被映射到三个不同的向量空间,分别称为查询(Q)、键(K)和值(V)。这些向量用于计算注意力权重。
2. **注意力权重计算**:通过计算查询和键的点积并进行缩放和归一化,得到注意力权重。这些权重表示输入序列中每个元素对其他元素的关注程度。
3. **加权求和**:使用注意力权重对值向量进行加权求和,生成输出。这一过程允许模型在生成输出时考虑输入序列中不同位置的信息。
在TurboViT等视觉Transformer变体中,自注意力机制被进一步优化以提高计算效率。例如,TurboViT使用了局部注意力和全局注意力的结合,通过在不同层次上应用不同的注意力机制来减少计算复杂度。
如果你对自注意力机制的数学细节或其在特定应用中的表现有兴趣,可以继续深入探讨。你还有其他问题吗?
=== 对话轮次 5 ===
🛠️ Teacher Agent 调用工具: transfer_to_student_agent({})
👨🎓 Student Agent: 感谢老师的讲解,我已经理解了。
学生表示已理解,对话结束
对话日志已保存到: agent_logs/agent_log_20241207_215524.json
这个示例展示了系统如何通过多个 Agent 的协作完成教学过程:
- 学生 Agent 主动提出关于 Transformer 架构的问题
- 教师 Agent 通过搜索相关论文,提供基础概念解释
- 学生 Agent 针对自注意力机制提出深入问题
- 教师 Agent 结合论文内容,详细解释技术细节
- 学生 Agent 表示理解后,对话自然结束
整个过程中,系统通过工具调用、角色切换和表情符号等设计,营造了一个自然、专业的教学场景。同时,完整的日志记录确保了对话过程可追溯和分析。