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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于机器学习的零售商品销售数据预测系统

1 项目介绍 1.1 研究目的和意义 在电子商务日益繁荣的今天&#xff0c;精准预测商品销售数据成为商家提升运营效率、优化库存管理以及制定营销策略的关键。为此&#xff0c;开发了一个基于深度学习的商品销售数据预测系统&#xff0c;该系统利用Python编程语言与Django框架&a…

Java服务器代码远程调试(IDEA版)

Java服务器代码远程调试 配置启动脚本参数配置IDEA远程调试工具操作步骤 注意&#xff1a;远程调试的代码需要与本地代码一致&#xff0c;远程调试目的是解决本地环境无法支持调试的情况下&#xff0c;解决线上&#xff08;测试&#xff09;环境调试问题。 配置启动脚本参数 n…

昇思25天学习打卡营第10天|linchenfengxue

基于MobileNetv2的垃圾分类 通过读取本地图像数据作为输入&#xff0c;对图像中的垃圾物体进行检测&#xff0c;并且将检测结果图片保存到文件中。 MobileNetv2模型原理介绍 MobileNet网络是由Google团队于2017年提出的专注于移动端、嵌入式或IoT设备的轻量级CNN网络&#x…

TikTok直播限流与网络的关系及解决方法

TikTok作为一款热门的社交平台&#xff0c;其直播功能吸引了大量用户。然而&#xff0c;一些用户可能会遇到TikTok直播限流的问题&#xff0c;例如直播过程中出现播放量低、直播画面质量差等情况。那么&#xff0c;TikTok直播限流与所使用的网络线路是否有关系&#xff1f;是否…

TypeScript Project References npm 包构建小实践

npm 包输出 es/cjs 产物 在开发一个 npm 包时&#xff0c;通常需要同时输出 ES 模块和 CommonJS 模块的产物供不同的构建进行使用。在只使用tsc进行产物编译的情况下&#xff0c;我们通常可以通过配置两个独立的 tsconfig.json 配置文件&#xff0c;并在一个 npm script 中 执…

typescript学习回顾(五)

今天来分享一下ts的泛型&#xff0c;最后来做一个练习 泛型 有时候&#xff0c;我们在书写某些函数的时候&#xff0c;会丢失一些类型信息&#xff0c;比如我下面有一个例子&#xff0c;我想提取一个数组的某个索引之前的所有数据 function getArraySomeData(newArr, n:numb…

Mouse Prealbumin ELISA Kit小鼠前白蛋白ELISA试剂盒

前白蛋白&#xff08;PRE&#xff09;是一种由4条相同的多肽链组成的四聚体蛋白。电泳时&#xff0c;它比血清白蛋白的迁移速度更快&#xff0c;PRE可以作为多种疾病患者营养评价的标志物。ICL的Mouse Prealbumin ELISA Kit应用双抗体夹心法测定小鼠样本中前白蛋白水平&#xf…

CentOS7源码安装nginx并编写服务脚本

华子目录 准备下载nginx源码包关闭防火墙关闭selinux安装依赖环境 解压编译安装测试编写服务脚本&#xff0c;通过systemctl实现服务启动与关闭测试 准备 下载nginx源码包 在源码安装前&#xff0c;我们得先下载nginx源码包https://nginx.org/download/这里我下载的是nginx-1…

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

8.2 COUNTA函数 COUNTA函数是Excel中用于统计指定区域内所有非空单元格数量的函数。它能够统计数值、文本、错误值以及公式返回的结果&#xff0c;是数据分析中常用的统计工具。 8.2.1 函数简介 COUNTA函数用于统计指定区域中所有非空单元格的数量。它与COUNT函数不同&#…

transformer——多变量预测PyTorch搭建Transformer实现多变量多步长时间序列预测(负荷预测)——transformer多变量预测

写在最前&#xff1a; 在系统地学习了Transformer结构后&#xff0c;尝试使用Transformer模型对DNA序列数据实现二分类&#xff0c;好久前就完成了这个实验&#xff0c;一直拖着没有整理&#xff0c;今天系统的记录一下&#xff0c;顺便记录一下自己踩过的坑 &#xff08;需要…

OpenHarmony开发实战:GPIO控制器接口

功能简介 GPIO&#xff08;General-purpose input/output&#xff09;即通用型输入输出。通常&#xff0c;GPIO控制器通过分组的方式管理所有GPIO管脚&#xff0c;每组GPIO有一个或多个寄存器与之关联&#xff0c;通过读写寄存器完成对GPIO管脚的操作。 GPIO接口定义了操作GP…

Echarts 问题集锦

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

液压件工厂的MES解决方案:智能生产,高效未来

一、引言 虽然我国液压件行业发展迅速&#xff0c;但是大多数液压件生产企业规模小、自主创新能力不足&#xff0c;大部分液压产品处于价值链中低端。且由于技术、工艺、设备及管理等多方面的限制&#xff0c;高端液压件产品研发生产水平不足&#xff0c;无法形成有效的供给&a…

【linux】虚拟机安装 BCLinux-R8-U4-Server-x86_64

目录 一、概述 1.1移动云Linux系统订阅服务 CLS 1.2 大云天元操作系统BC-Linux 二、安装 一、概述 1.1移动云Linux系统订阅服务 CLS 移动云Linux系统订阅服务 CLS &#xff08;Cloud Linux Service&#xff09;为使用BC-Linux操作系统的用户提供标准维保服务以及高级技术支…

生物墨水的重要特性

生物打印技术正以前所未有的速度发展&#xff0c;为组织工程和再生医学领域带来了革命性的变革。然而&#xff0c;成功打印出功能性的三维结构&#xff0c;并将其应用于人体&#xff0c;离不开生物墨水这一关键材料。主要特性包括&#xff1a; 物理性质 表面张力: 表面张力影…

基于java+springboot+vue实现的社团管理系统(文末源码+Lw)270

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#…

Linux4(Docker)

目录 一、Docker介绍 二、Docker结构 三、Docker安装 四、Docker 镜像 五、Docker 容器 六、Docker 安装nginx 七、Docker 中的MySQL部署 一、Docker介绍 Docker&#xff1a;是给予Go语言实现的开源项目。 Docker的主要目标是“Build,Ship and Run Any App,Anywhere” 也…

LangChain入门学习笔记(七)—— 使用检索提高生成内容质量

大模型训练使用的数据是开放的、广泛的&#xff0c;因此它显得更加的通用。然而在有些应用场景下&#xff0c;用户需要使用自己的数据使得大模型生成的内容更加贴切&#xff0c;也有时候用户的数据是敏感的&#xff0c;无法提供出来给大模型进行通用性的训练。RAG技术就是一种解…

HarmonyOS APP应用开发项目- MCA助手(Day02持续更新中~)

简言&#xff1a; gitee地址&#xff1a;https://gitee.com/whltaoin_admin/money-controller-app.git端云一体化开发在线文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/agc-harmonyos-clouddev-view-0000001700053733-V5注&#xff1a;…

Java Lambda语法介绍

目录 一、概述 二、Lambda语法的历史 2.1 Lambda名字的含义 2.2 Lambda的历史 三、Lambda语法的核心接口 3.1 Lambda的四大核心接口 3.1.1 概述 3.1.2 Consumer 接口 3.1.3 Supplier 接口 3.1.4 Function 接口,> 3.1.5 Predicate 接口 四、Lambda的引用 4.1 概…