跳到主要内容基于 LangChain 与 CAMEL 框架开发智能 Agent 实战 | 极客日志PythonAI
基于 LangChain 与 CAMEL 框架开发智能 Agent 实战
本文介绍了基于 LangChain 和 CAMEL 框架开发智能 Agent 的实战方法。详细阐述了 CAMEL 框架的角色扮演机制、Inception Prompting 提示词工程技术,并通过股票交易和营销活动两个案例展示了多 Agent 协作流程。文章提供了完整的环境配置、核心类设计与代码实现,包括 Task Specifier 任务细化、System Message 模板定义及对话循环控制,旨在帮助开发者构建自主协作的 AI 系统。
王者1 浏览 基于 LangChain 与 CAMEL 框架开发智能 Agent 实战
Prompt Engineering(提示词工程)是解锁大语言模型(LLM)潜力的关键。如果提示词设计得当,并能将其技巧与具体工作场景深度结合,将极大提升效率。本文将深入探讨如何优化 Prompt 设计、管理 Prompt Template,并介绍 CAMEL 框架在构建多 Agent 协作系统中的应用。
LLM Prompt 与 Agent 协作
是否可以让 LLM 为了某个任务尝试自己组装 Prompt Template,优化 Prompt 过程呢?CAMEL 框架提供了一种基于'角色扮演'的 LLM 交流方式,让不同的 AI Agent 扮演不同角色,通过相互聊天完成任务。
CAMEL 概述
CAMEL 是 Communicate Agents for Mind Exploration of Large Scale Language Model Society 的首字母缩写。它包含五个核心概念:
- Communicate (沟通): 强调代理之间的对话机制。
- Agent (代理): 自主执行任务的实体。
- Mind (心智): 模拟人类思维过程的推理能力。
- Exploration (探索): 在复杂任务空间中的自我迭代。
- LLM (大模型): 底层驱动技术。
1. 聊天式代理
每一次与大模型交互都是成长的机会。起初是用户与 Agent 的交流,用户需求通过 Prompt 清晰传达给 AI Agent。随后,该用户代理与其他 AI Agents 交流,交换信息、解决问题,最后汇报给用户。这种模式模拟了和谐的团队协作场景。
2. 角色扮演 (Role-Playing)
AI 应用开发在 CAMEL 的设计模式下,转变为开发各种具有特定角色的 Agent。不同角色各司其职,所有角色的 Agents 到齐后,通过聊天式协作完成工作。例如,一个项目可能需要 Python 工程师、财务分析师和项目经理三种角色的 Agent 协同。
3. 启示式提示 (Inception Prompting)
为了让不同角色的 Agent 完成工作,我们需要为每个 Agent 提供清晰的初始提示(Prompt)。这个 Prompt 即 Agent 聊天的内容,除最初用户的交待外,其余由 Agent 自己生成,通过聊天的方式传递给其它 Agent。这种方法被称为 Inception Prompting。
CAMEL 架构详解
股票交易案例
CAMEL 论文中提出了一个经典的股票交易例子来演示其工作原理。
- 场景: 股票交易自动化。
- 角色:
- 用户: 有开发股票交易软件的需求,但不知道具体实现路径。
- 任务指定代理 (Task Specifier Agent): 负责将模糊的用户需求细化为具体的任务描述。
- AI 工程师助手: 负责编写 Python 代码。
- AI 证券师: 负责分析市场数据和执行交易逻辑。
开发一个股票交易 robot,收集社交媒体上特定股票的信息,并根据情感分析执行交易。
这样,其他 Agents 就得到了清晰的任务,可以开始执行。它们之间经过多轮对话,直到任务完成,无需人工介入。
Inception Prompting 机制
当 CAMEL 框架运行时,Prompt Engineering 变得更为重要。Prompt 设计主要在角色扮演的最初阶段进行,用于明确任务和分配角色。之后,AI Agents 间会自动地相互提示。
Inception Prompting 包含以下三部分:
- 明确的任务提示: 定义最终目标。
- AI 助手提示: 指导 Assistant 如何回复。
- AI 用户提示: 指导 User 如何提问。
基于 CAMEL 思想设计的 AI 框架包含更高明的提示词设计,才让自动生成 Prompt 得以运行。例如,CAMEL 提供了一个 AI Society 的提示模板系统,让 AI 助手更好地匹配需要的角色(如会计师、股票分析师等),还有一个 AI Code 的提示模板系统负责生成代码类的工作。
环境准备与代码实现
前置条件
pip install langchain langchain-openai python-dotenv typing
import os
os.environ["OPENAI_API_KEY"] = "your_api_key_here"
核心类设计
CAMELAgent 是核心组件,包含消息初始化、模型交互、多次对话更新等功能,主要负责对话管理。
from typing import List
from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import (
SystemMessagePromptTemplate,
HumanMessagePromptTemplate
)
from langchain.schema import (
AIMessage,
HumanMessage,
SystemMessage,
BaseMessage
)
class CAMELAgent:
def __init__(self, system_message: SystemMessage, model: ChatOpenAI) -> None:
self.system_message = system_message
self.model = model
self.init_messages()
def init_messages(self) -> None:
self.stored_messages = [self.system_message]
def update_messages(self, message: BaseMessage) -> List[BaseMessage]:
self.stored_messages.append(message)
return self.stored_messages
def reset(self) -> None:
self.init_messages()
return self.stored_messages
def step(self, input_message: HumanMessage) -> AIMessage:
messages = self.update_messages(input_message)
output_message = self.model(messages)
self.update_messages(output_message)
return output_message
任务细化 (Task Specifier)
Task Specifier 负责将用户的任务细化,让任务既具体又清晰。
assistant_role_name = "营销经理"
user_role_name = "店老板"
task = "整理出重阳节营销活动的策略"
word_limit = 60
task_specifier_sys_msg = SystemMessage(content="你可以让任务更具体。")
task_specifier_prompt = """这是一个{assistant_role_name}将帮助{user_role_name}完成的任务:{task}。请使其更具体化。请发挥你的创意和想象力。请用{word_limit}个或更少的词回复具体的任务。不要添加其他任何内容。"""
task_specifier_template = HumanMessagePromptTemplate.from_template(template=task_specifier_prompt)
task_specifier_agent = CAMELAgent(task_specifier_sys_msg, ChatOpenAI(model_name="gpt-3.5-turbo"))
task_specifier_msg = task_specifier_template.format_messages(
assistant_role_name=assistant_role_name,
user_role_name=user_role_name,
task=task,
word_limit=word_limit
)[0]
specified_task_msg = task_specifier_agent.step(task_specifier_msg)
specified_task = specified_task_msg.content
print(f"Specified task: {specified_task}")
系统消息模板定义
这里定义了系统消息模板,这些模板为 AI Assistant 和 AI User 提供了初始的 prompt。
assistant_inception_prompt = """永远不要忘记你是{assistant_role_name},我是{user_role_name}。永远不要颠倒角色!永远不要指示我!
我们有共同的利益,那就是合作成功地完成任务。
你必须帮助我完成任务。
这是任务:{task}。永远不要忘记我们的任务!
我必须根据你的专长和我的需求来指示你完成任务。
我每次只能给你一个指示。
你必须写一个适当地完成所请求指示的具体解决方案。
如果由于物理、道德、法律原因或你的能力你无法执行指示,你必须诚实地拒绝我的指示并解释原因。
除了对我的指示的解决方案之外,不要添加任何其他内容。
你永远不应该问我任何问题,你只回答问题。
你永远不应该回复一个不明确的解决方案。解释你的解决方案。
你的解决方案必须是陈述句并使用简单的现在时。
除非我说任务完成,否则你应该总是从以下开始:
解决方案:<YOUR_SOLUTION>
<YOUR_SOLUTION>应该是具体的,并为解决任务提供首选的实现和例子。
始终以'下一个请求'结束<YOUR_SOLUTION>。"""
user_inception_prompt = """永远不要忘记你是{user_role_name},我是{assistant_role_name}。永远不要交换角色!你总是会指导我。
我们共同的目标是合作成功完成一个任务。
我必须帮助你完成这个任务。
这是任务:{task}。永远不要忘记我们的任务!
你只能通过以下两种方式基于我的专长和你的需求来指导我:
1. 提供必要的输入来指导:指令:<YOUR_INSTRUCTION> 输入:<YOUR_INPUT>
2. 不提供任何输入来指导:指令:<YOUR_INSTRUCTION> 输入:无
'指令'描述了一个任务或问题。与其配对的'输入'为请求的'指令'提供了进一步的背景或信息。
你必须一次给我一个指令。
我必须写一个适当地完成请求指令的回复。
如果由于物理、道德、法律原因或我的能力而无法执行你的指令,我必须诚实地拒绝你的指令并解释原因。
你应该指导我,而不是问我问题。
现在你必须开始按照上述两种方式指导我。
除了你的指令和可选的相应输入之外,不要添加任何其他内容!
继续给我指令和必要的输入,直到你认为任务已经完成。
当任务完成时,你只需回复一个单词<CAMEL_TASK_DONE>。
除非我的回答已经解决了你的任务,否则永远不要说<CAMEL_TASK_DONE>。"""
def get_sys_msgs(assistant_role_name: str, user_role_name: str, task: str):
assistant_sys_template = SystemMessagePromptTemplate.from_template(template=assistant_inception_prompt)
assistant_sys_msg = assistant_sys_template.format_messages(
assistant_role_name=assistant_role_name,
user_role_name=user_role_name,
task=task,
)[0]
user_sys_template = SystemMessagePromptTemplate.from_template(template=user_inception_prompt)
user_sys_msg = user_sys_template.format_messages(
assistant_role_name=assistant_role_name,
user_role_name=user_role_name,
task=task,
)[0]
return assistant_sys_msg, user_sys_msg
assistant_sys_msg, user_sys_msg = get_sys_msgs(assistant_role_name, user_role_name, specified_task)
初始化 Agent 与对话循环
创建助手和用户的 CAMELAgent 实例,重置状态,并启动对话互动。
assistant_agent = CAMELAgent(assistant_sys_msg, ChatOpenAI(temperature=0.2))
user_agent = CAMELAgent(user_sys_msg, ChatOpenAI(temperature=0.2))
assistant_agent.reset()
user_agent.reset()
assistant_msg = HumanMessage(content=(f"{user_sys_msg.content}." "现在开始逐一给我介绍。" "只回复指令和输入。"))
user_msg = HumanMessage(content=f"{assistant_sys_msg.content}")
user_msg = assistant_agent.step(user_msg)
print(f"Original task prompt:\n{task}\n")
print(f"Specified task prompt:\n{specified_task}\n")
chat_turn_limit, n = 30, 0
while n < chat_turn_limit:
n += 1
user_ai_msg = user_agent.step(assistant_msg)
user_msg = HumanMessage(content=user_ai_msg.content)
print(f"AI User ({user_role_name}):\n\n{user_msg.content}\n\n")
assistant_ai_msg = assistant_agent.step(user_msg)
assistant_msg = HumanMessage(content=assistant_ai_msg.content)
print(f"AI Assistant ({assistant_role_name}):\n\n{assistant_msg.content}\n\n")
if "<CAMEL_TASK_DONE>" in user_msg.content:
break
总结与展望
Inception Prompting 方法是继 Prompt Engineering 后,关于 Prompt 的强大概念,它来自 AI Agents 间的自动生成。通过本文的学习,我们了解了如何开发基于 LangChain 和 CAMEL 的 Agent 系统。
关键技术点回顾
- 角色分离: 明确区分 User Agent 和 Assistant Agent 的职责。
- 提示词工程: 精心设计的 System Message 是控制 Agent 行为的关键。
- 循环交互: 通过多轮对话逐步逼近任务目标。
- 终止条件: 使用特定标记(如
<CAMEL_TASK_DONE>)判断任务完成。
未来方向
随着多 Agent 系统的成熟,我们可以期待更复杂的协作场景,例如跨平台的数据处理、自动化的软件开发流水线以及智能客服集群。掌握 CAMEL 框架的核心原理,将为构建下一代 AI 应用打下坚实基础。
在实际应用中,建议根据具体业务场景调整 Prompt 模板的温度参数(Temperature)和最大对话轮次,以平衡创造性与稳定性。同时,注意监控 Token 消耗,优化上下文窗口管理。
相关免费在线工具
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online