LangChain 开发智能Agent,你学会了吗?

Prompt Enginnering 是打开LLM宝库的一把金钥匙,如果prompt得法,并能将其技巧与某项工作深度结合,那必将大大增效。今天我们来聊聊如何优化Prompt设计、Prompt Template管理等技术和体力活,并赋能老喻干货店的营销活动。

LLM Prompt

有没有可能让LLM为了某个任务尝试自己组装Prompt Template,优化Prompt过程呢?

CAMEL

来自阿卜杜拉国王大学的CAMEL,提出了一种基于“角色扮演”的LLM交流方式,让不同的的AI Agent扮演不同的角色,相互聊天把活给整了。这不就是AutoGen吗?欢迎大家看我的AutoGen系列文章。

image.png

CAMEL是头骆驼,英文全称是Communicate Agents for Mind Exploration of Large Scale Language Model Society。CAMEL是Communicate(沟通)、Agent(代理)、Mind(心智)、Exploration(探索)和LLM(大模型)的首字母缩写集合。

  • 聊天式代理

每一次和大佬聊天,都是成长的机会,Communicate Agents大概就是这个意思。起初的交流是用户与Agent的交流,让用户的需求通过Prompt的方式清晰和完整的交给AI Agent。之后这个用户代理Agent和其它AI Agents交流,交换信息、解决问题,待解决完成后,最后汇报给用户。多么和谐的国王朝会场景啊。

  • 角色扮演

role-playing。国王朝会,大臣是AI Agents,当然各司其职,各有角色。所谓鸡鸣狗盗者,都有其用武之地。AI应用开发,在CAMEL的设计模式下,就变成了以开发各种不同的Agent为主。不同角色,所有角色的Agents到齐后,聊天式做完工作。

  • 启示式提示

inception prompting。让不同角色的Agent完成工作,我们需要给每个Agent以清晰的提示,即Prompt。而且这个Prompt 即Agent聊天的内容,除最初用户的交待外,其余的由Agent自己生成,通过聊天的方式交给其它Agent。

CAMEL 股票交易

CAMEL论文中提了一个股票交易的例子。

image.png

  • 场景

即股票交易

  • 角色

用户有开发股票交易软件的需求,但不知道怎么做。就好像马云不会写代码和财务一样,他只要有让天下没有难做的生意这个场景和需求,它只要找来程序员Agent和财务Agent就可以了。喔,和AI Agent一起共事或创业是未来的主旋律。

任务指定代理 (Task Specifier Agent)。用户的需求和想法可能比较模糊,任务指定代理负责将其细化,那么Task Sepcifier Agent大概会生成这样的启示式提示:

开发一个股票交易robot,收集社交媒体上特定股票的信息,并根据情感分析执行交易。

这样,其它Agents就得到了清晰的任务,可以开始执行,并且需要的AI角色有:

  1. 一个会写Python的AI 工程师助手
  2. 一个懂股票交易的AI 证券师

接下来,它们两位会经过多轮对话,直到将任务完成,我们不需要有任何介入,这就是CAMEL的魅力。

Prompt Template

当CAMEL向我们走来的时候,Prompt Engineering变的更为重要。与其它应用不同的是,我们的prompt设计只在角色扮演的最初阶段进行,主要用于明确任务和分配角色。之后,AI Agents间会自动地相互提示,我们把AI生成Prompt的方法称为Inception Prompting,它包含以下三部分:

  • 明确的任务提示
  • AI助手提示
  • AI用户提示

那么Inception Prompting又是怎么工作的呢,这是因为基于CAMEL思想设计的AI框架包含更高明的提示词设计,才让自动生成Prompt得以work。比如在股票交易中的两个角色。CAMEL提供了一个AI Society的提示模板系统让AI助手更好地匹配需要的角色。AI助手可以扮演会计师、股票分析师、演员、歌手、工程师等角色。另外,还有一个AI Code的提示模板系统负责生成代码类的工作。

image.png

image.png

AI Society 会在一开始就指定AI Agent的社会角色,它被用户Agent所需要。当我们以规则、法律,将Agents间的交流规则确认,这个系统将会正常运转。

老喻干货店营销方案

得到CAMEL后,我们现在为老喻干货店做个营销方案。

  • 引入所需的库
# 设置OPENAI_API_KEY 环境变量
import os
os.environ["OPENAI_API_KEY"]=""
#从类型库中导入List List是一种有序、可变、容纳任意类型元素的数据结构类型 它和数组是有区别的,数组表达一种特定类型的连续存储,List是动态的,更灵活
from typing import List
#引入OpenAI聊天模型
from langchain.chat_models import ChatOpenAI
# 从聊天模板中引入 系统消息模板和用户聊天模板
from langchain.propmts.chat import (
    SystemMesssagePromptTemplate,
    HumanMessagePromptTemplate
)
from langchain.schema import (
    AIMessage,
    HumanMessage,
    SystemMessage,
    BaseMessage
)

  • CAMELAgent 类

CAMELAgent是核心,包含消息初始化、模型交互、多次对话更新等,主要做对话管理。

# 用于管理与LLM的交互
class CAMELAgent:
    
    def __init__(
        self,
        # 用户开始的任务prompt
        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

  • 给定角色和Prompt

在这次的老喻干货店的营销项目中,我们需要以下角色、任务描述等

assistant_role_name = "干货店营销经理"
user_role_name="店老板老喻"
task="整理出重阳节营销活动的策略"
word_limit=60  # 每次讨论的字数限制

当我们为CAMEL项目定义好了营销经理和老板老喻后,不同的角色,就有了它们的不同职责和交互的规则:

用户在这里是干货店的老板,它会向营销经理提出关于干货店重阳节推广活动的需求和询问,然后由营销经理来回复。

role-playing让我们模拟了生活中的真实场景,更好理解。这些角色从Agent走向硅基生命,这一天会不会到来?

  • Task Specifier

Task Specifier 负责将用户的任务细化,让任务既具体又清晰。

task_specifier_sys_msg = SystemMessage(content="你可以让任务更具体。")
# 这段prompt让我们明白了Task Specifier的原理
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, ChatOpenAI(model_name="gpt-3.t-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]
pecified_task_msg = task_specify_agent.step(task_specifier_msg)print(f"Specified task: {specified_task_msg.content}")specified_task = specified_task_msg.content

CAMEL的核心,原来是Prompt的高级设计!!我们看下步骤

  • 老板的初始任务:整理出干货店重阳节营销活动的策略

  • 生成的更详细的任务Prompt: 为重阳节策划特价活动、制定广告推广方案,组织试吃活动

  • 系统消息

这里定义了系统消息模板,这些模板为AI Assistant和AI proxy 提供了初始的prompt。

# 定义系统消息模板,并创建CAMELAgent实例进行交互
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>。"""

现在我们可以生成system message

# 根据预设的角色和任务提示生成系统消息
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))

# 重置两个agent
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 间的自动生成。
  • 了解了如何开发Agent

如何学习AI大模型?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

  • 24
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值