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

news2024/11/16 13:40:58

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%免费】🆓

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1884930.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ollama open-webui安装后报错401

查看日志 docker logs open-webui "GET /ollama/api/tags HTTP/1.1" 500 Internal Server Error "GET /ollama/api/version HTTP/1.1" 500 Internal Server Error "GET /openai/api/models HTTP/1.1" 401 Unauthorized 浏览器console报错

提升ChatGLM效能:仅需简单模型调整

本文作者&#xff1a; 赵桢、罗成、李亭骞、邹文艺 引言 自大语言模型 (LLM) 成为热点话题以来&#xff0c;涌现了一大批中文大语言模型并在优化平台中得到了积极部署。ChatGLM 正是广受好评的主流中文大语言模型之一。 然而&#xff0c;由于 ChatGLM 模型尚未成为 Transfo…

Echarts 问题集锦

最近公司集中做统计图表&#xff0c;新手小白&#xff0c;真被Echarts折腾地不轻&#xff0c;怕自己年老记忆衰退&#xff0c;特地做一些记录。以备后面查阅。 1、X轴的 数据显示不全&#xff0c;间或不显示 很奇葩&#xff0c;我发现数据里有一个值为0.0&#xff0c;当这条记…

Windows 解决文件包含病毒或潜在的垃圾软件

注意确保软件没问题&#xff0c;保护个人数据隐私 问题描述 解决步骤

科普文:一文搞懂jvm原理(三)执行引擎之垃圾回收器

概叙 科普文&#xff1a;一文搞懂jvm(一)jvm概叙-CSDN博客 科普文&#xff1a;一文搞懂jvm原理(二)类加载器-CSDN博客 科普文&#xff1a;一文搞懂jvm原理(三)执行引擎-CSDN博客 科普文&#xff1a;一文搞懂jvm原理(四)运行时数据区-CSDN博客 前面我们介绍了jvm&#xff0c…

基于java+springboot+vue实现的电影院购票系统(文末源码+Lw)274

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装电影院购票系统软件来发挥其高效地信息处理的作用&#xf…

Flink 容错机制

一致性检查点&#xff08;checkpoint&#xff09; 什么是 Checkpoint &#xff1f; Flink 故障恢复机制的核心&#xff0c;就就是应用状态的一致性检查点&#xff1b;有状态流应用的一直检查点&#xff0c;其实就是所有任务的状态&#xff0c;在某一时间点的一份拷贝&#xff…

月之暗面kimi底层推理系统原理

太长不看版&#xff08;作者大佬自己的在知乎碎碎念&#xff09;&#xff1a; 本论文与很多 Prefill/Decoding 分离的论文不同的是&#xff0c;这套方案已经在大规模集群上进行几个月的验证并证明了方案的有效性。目前这套系统承载了 Kimi 线上80% 以上的流量&#xff0c; 效果…

(18)GPS/指南针(一)

文章目录 前言 1 GPS/指南针 2 RTK GPS 3 GPS驱动程序选项 4 GPS自动切换 5 高级用途 前言 Copter/Plane/Rover 支持与 GPS、指南针和其他定位技术的整合&#xff1a; 1 GPS/指南针 Avionics Anonymous GNSS CompassAvionics Anonymous CompassBeitain BN-220 GPS / B…

《梦醒蝶飞:释放Excel函数与公式的力量》8.1 COUNT函数

8.1 COUNT函数 在Excel中&#xff0c;COUNT函数及其相关变体用于统计单元格中的数据量。它们能够帮助我们快速统计数据的数量&#xff0c;常用于数据分析和报表制作。 8.1.1 函数简介 COUNT函数用于统计指定区域内的数值单元格数量。它只统计数值&#xff0c;不包括文本或空…

XD3C03P1G、XD3C01N3F比例方向控制阀放大板

XD3A01N2G、XD3A03N2G、XD3C03N1F、XD3C03P1G、XD3C01N3F、XD3C03N2F、XD3C01P4G、XD3C03P3G、XD3C03N2F、XD3C03N2G、XDP3A01P1F、XDP3C03N2G、XDP3A03P3G、XDP3C01NAF、XDP3C03P6G、XDP3A03PAG、XDP3A03N3F液压比例方向阀是液压系统中的关键元件&#xff0c;用于实现对流量、…

二叉树的右视图-二叉树

199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 层序遍历&#xff0c;广度优先 queue先进后出&#xff0c;每层从左往右进树&#xff0c;最后一个就是最右边的数&#xff1b;pop掉这层的。push下一层&#xff1b; class Solution { public:vector<int> r…

考研生活day2--王道课后习题2.3.1、2.3.2、2.3.3

2.3.1 题目描述&#xff1a; 这题和曾经做过的LeetCode203.移除元素一模一样&#xff0c;所以我们就使用LeetCode进行书写&#xff0c;题目链接203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 解题思路 大家的第一反应肯定是根据书上所学的书写方法一样书写&…

【linux网络(七)】数据链路层详解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux网络 1. 前言2. 认识MAC…

C++视觉开发 三.缺陷检测

一.距离变换 1.概念和功能 距离变换是一种图像处理技术&#xff0c;用于计算图像中每个像素到最近的零像素&#xff08;背景像素&#xff09;的距离。它常用于图像分割、形态学操作和形状分析等领域。它计算图像中每个像素到最近的零像素&#xff08;背景像素&#xff09;的距…

CAM350删除铺铜?

CAM350删除铺铜&#xff1f; 1、选择菜单栏Add 2、选择Polygon Void→Line... 3、然点击需要操作的铜箔&#xff0c;使其高亮 4、用鼠标框选需要删除的部分&#xff0c;然后右击 5、删除后如下图所示 The Layer Bar controls are part of the new Navigation Pane and can also…

dledger原理源码分析系列(一)-架构,核心组件和rpc组件

简介 dledger是openmessaging的一个组件&#xff0c; raft算法实现&#xff0c;用于分布式日志&#xff0c;本系列分析dledger如何实现raft概念&#xff0c;以及dledger在rocketmq的应用 本系列使用dledger v0.40 本文分析dledger的架构&#xff0c;核心组件&#xff1b;rpc组…

MySQL 9.0创新版发布!功能又进化了!

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复&#xff0c; 安装迁移&#xff0c;性能优化、故障…

Runway:Gen-3 Alpha 文生视频现已开放

Runway 自 6 月 17 号公布 Gen-3 Alpha 快半个月了, 现在终于对所有人开放了&#xff0c;当然前提是你至少订阅了标准版&#xff08;12 美刀/月), 传送门&#xff1a;runwayml.com

【CSS in Depth 2 精译】2.3 告别像素思维

当前内容所在位置 第一章 层叠、优先级与继承第二章 相对单位 2.1 相对单位的威力 2.1.1 响应式设计的兴起 2.2 em 与 rem 2.2.1 使用 em 定义字号2.2.2 使用 rem 设置字号 2.3 告别像素思维 ✔️2.4 视口的相对单位2.5 无单位的数值与行高2.6 自定义属性2.7 本章小结 2.3 告别…