构建LangChain应用程序的示例代码:46、使用 Meta-Prompt 构建自我改进代理的 LangChain 实现

news2024/11/16 4:43:06

Meta-Prompt 实现

摘要:

本文介绍了 Noah Goodman 提出的 Meta-Prompt 方法的 LangChain 实现,该方法用于构建能够自我反思和改进的智能代理。

核心思想:

Meta-Prompt 的核心思想是促使代理反思自己的性能,并修改自己的指令。
在这里插入图片描述

原始博客文章描述:

代理是一个简单的循环,开始时没有任何指令,并遵循以下步骤:

  1. 与用户进行对话,用户可能提供请求、指令或反馈。
  2. 在每个对话周期结束时,使用 Meta-Prompt 生成自我批评和新的指令。

该系统唯一的固定指令(我称之为元提示)是管理代理指令修订的元提示。除了每次为自己修改的指令外,智能体在情节之间没有任何记忆。尽管它很简单,但该代理可以随着时间的推移进行学习,并通过将有用的细节纳入其指令来自我改进。

以下是 Meta-Prompt 的具体实现:

我们定义了两条链。一个充当 Assistant ,另一个是批评 Assistant 性能并修改 Assistant 指令的“元链”。

# 导入必要的 LangChain 和 OpenAI 库
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferWindowMemory
from langchain.prompts import PromptTemplate
from langchain_openai import OpenAI

def initialize_chain(instructions, memory=None):
    if memory is None:
        memory = ConversationBufferWindowMemory()
        memory.ai_prefix = "Assistant"

    template = f"""
    Instructions: {instructions}
    {{{memory.memory_key}}}
    Human: {{human_input}}
    Assistant:"""

    prompt = PromptTemplate(
        input_variables=["history", "human_input"], template=template
    )

    chain = LLMChain(
        llm=OpenAI(temperature=0),
        prompt=prompt,
        verbose=True,
        memory=ConversationBufferWindowMemory(),
    )
    return chain


def initialize_meta_chain():
    meta_template = """
    Assistant has just had the below interactions with a User. Assistant followed their "Instructions" closely. Your job is to critique the Assistant's performance and then revise the Instructions so that Assistant would quickly and correctly respond in the future.

    ####

    {chat_history}

    ####

    Please reflect on these interactions.

    You should first critique Assistant's performance. What could Assistant have done better? What should the Assistant remember about this user? Are there things this user always wants? Indicate this with "Critique: ...".

    You should next revise the Instructions so that Assistant would quickly and correctly respond in the future. Assistant's goal is to satisfy the user in as few interactions as possible. Assistant will only see the new Instructions, not the interaction history, so anything important must be summarized in the Instructions. Don't forget any important details in the current Instructions! Indicate the new Instructions by "Instructions: ...".
    """

    meta_prompt = PromptTemplate(
        input_variables=["chat_history"], template=meta_template
    )

    meta_chain = LLMChain(
        llm=OpenAI(temperature=0),
        prompt=meta_prompt,
        verbose=True,
    )
    return meta_chain


def get_chat_history(chain_memory):
    memory_key = chain_memory.memory_key
    chat_history = chain_memory.load_memory_variables(memory_key)[memory_key]
    return chat_history


def get_new_instructions(meta_output):
    delimiter = "Instructions: "
    new_instructions = meta_output[meta_output.find(delimiter) + len(delimiter) :]
    return new_instructions

def main(task, max_iters=3, max_meta_iters=5):
    failed_phrase = "task failed"
    success_phrase = "task succeeded"
    key_phrases = [success_phrase, failed_phrase]

    instructions = "None"
    for i in range(max_meta_iters):
        print(f"[Episode {i+1}/{max_meta_iters}]")
        chain = initialize_chain(instructions, memory=None)
        output = chain.predict(human_input=task)
        for j in range(max_iters):
            print(f"(Step {j+1}/{max_iters})")
            print(f"Assistant: {output}")
            print("Human: ")
            human_input = input()
            if any(phrase in human_input.lower() for phrase in key_phrases):
                break
            output = chain.predict(human_input=human_input)
        if success_phrase in human_input.lower():
            print("You succeeded! Thanks for playing!")
            return
        meta_chain = initialize_meta_chain()
        meta_output = meta_chain.predict(chat_history=get_chat_history(chain.memory))
        print(f"Feedback: {meta_output}")
        instructions = get_new_instructions(meta_output)
        print(f"New Instructions: {instructions}")
        print("\n" + "#" * 80 + "\n")
    print("You failed! Thanks for playing!")

# 指定任务并调用主函数
task = "Provide a systematic argument for why we should always eat pasta with olives."
main(task)

以下是对代码中使用的函数和类进行详细注释:

  • initialize_chain 函数:初始化一个链,可以接收指令和记忆对象作为参数。如果没有提供记忆对象,则创建一个 ConversationBufferWindowMemory 实例,并设置 AI 的前缀为 “Assistant”。

  • initialize_meta_chain 函数:初始化一个元链,用于生成自我批评和新指令。

  • get_chat_history 函数:从链的记忆对象中获取对话历史。

  • get_new_instructions 函数:从元输出中提取新的指令。

  • main 函数:主函数,用于指定任务并与代理进行交互。它定义了任务失败和成功的关键词,并设置了最大迭代次数。

总结

本文详细介绍了 Meta-Prompt 方法在 LangChain 中的实现。Meta-Prompt 是一种自我反思和自我改进的方法,通过在每次交互后生成自我批评和新指令来实现。这种方法使得代理能够在没有外部记忆的情况下,通过不断修改自己的指令来提高性能和满足用户需求。通过定义两个链——一个作为助手,另一个作为元链——以及使用 ConversationBufferWindowMemory 来存储对话历史,代理可以在每次迭代中学习和改进。

扩展知识:

  • LangChain:是一个用于构建和部署机器学习模型的框架,支持多种语言模型和记忆机制。
  • Meta-Prompt:是一种自我反思和自我改进的方法,通过在每次交互后生成自我批评和新指令来实现。
  • ConversationBufferWindowMemory:是一种记忆机制,用于存储对话历史,以便代理能够根据历史进行学习和改进。

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

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

相关文章

Postgresql从小白到高手 九 : psql高级查询及内部视图使用

Postgresql从小白到高手 九:pgsql 复杂查询及内部表高级查询 文章目录 Postgresql从小白到高手 九:pgsql 复杂查询及内部表高级查询一、多表查询二、pgsql内部表1.内部表2.内部表查询应用 一、多表查询 内联 :inner join on 简写 join on 结果集只有符合 筛选条件…

Github 2024-06-21 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-21统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量TypeScript项目3Python项目3Java项目2非开发语言项目2JavaScript项目1Rust项目1Dart项目1HTML项目1Vue项目1C++项目1TensorFlow: 机器学习的开源…

用Python制作一个简单的计算器(加减乘除)

简易计算器 写在前面 小编用python实现了一个简单的计算器,一起来看看吧~ 需要环境: pycharm python 一、需求分析 1.1 功能分析 使用Python的Tkinter界面设计实现一个简单的计算器,主要功能按钮包括数字键、四则运算符、等于号和清除…

fpga bitstream userid

fpga version register # xdc 文件 set_property BITSTREAM.CONFIG.USERID "0xDEADC0DE" [current_design] set_property BITSTREAM.CONFIG.USR_ACCESS 0x66669999 [current_design]ug908 在bit下载之后的property可以看到 ,GUI里面Tools → Edit Devic…

Centos安装redis(附:图形化管理工具)

第一步:下载redis wget http://download.redis.io/releases/redis-6.2.7.tar.gz 第二步:解压 tar zxvf redis-6.2.7.tar.gz 第三步:安装依赖环境 yum -y install gcc-c第四步:安装依赖环境 make install第五步:修…

一种PCB外壳设计方法的尝试

一个异性PCB的板框,外壳,PCB设计: 正常情况下先由机械工程师用CAD设计出板框导出DXF文件,之后基于此DXF文件作为板框进行PCB设计和外壳设计,但对硬件工程师来讲有时候直接在PCB软件上进行简单的板框设计显得更方便&am…

揭秘!这款电路设计工具让学校师生都爱不释手——SmartEDA的魔力何在?

随着科技的飞速发展,电子设计已成为学校师生们不可或缺的技能之一。而在众多的电路设计工具中,有一款名为SmartEDA的工具,凭借其强大的功能和友好的用户体验,迅速赢得了广大师生的青睐。今天,就让我们一起探索SmartEDA…

Linux 交叉编译工具链格式 sqlite3编译示例

1、交叉编译工具链 1.1 定义 交叉编译工具链是一个由编译器、连接器和解释器组成的综合开发工具集,它允许开发者在一个平台上(例如高性能的PC或服务器)编译生成另一个平台(例如嵌入式系统或不同的操作系统和硬件架构&#xff09…

【教程】DPW 325T FPGA板卡程序下载与固化全攻略

到底什么是固化??? 在开发板领域,"固化"通常指的是将软件或操作系统的镜像文件烧录(Flash)到开发板的存储介质上,使其成为开发板启动时加载的系统。这个过程可以确保开发板在启动时能…

2024年8月 PMP认证考试 7月9日正式开始报考

尊敬的各位考生: 经PMI和中国国际人才交流基金会研究决定,中国大陆地区2024年第三期PMI认证考试定于8月31日举办。 7月9日正式开始中文报考,在此之前需要完成英文资料注册,如果您想参加8月考试,还有最后10天报名即截止…

鸿蒙智慧监控解决方案:由Al视觉盒、网络摄像头、管理后台、手机端、NVR等组成

方案架构 整体技术架构由Al视觉盒、网络摄像头、管理后台、手机端、NVR等组成,提供从前端智能监控到后端数据处理的完整闭环。 方案价值 01/节约人力成本 ①AI算法对监控内容进行实时的智能检测,准确率高,有效减少错漏,无需多个…

免费可视化工具为何成为数据分析新宠?

免费可视化工具为何越来越受欢迎?在当今数据驱动的时代,数据分析和展示已成为各行各业不可或缺的核心能力。然而,传统的数据处理和可视化工具往往价格昂贵,且使用门槛较高,这为许多中小企业和个人用户带来了不小的困扰…

java 简单零钱通

目标 面向过程版 代码 package new_pluse;import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner;public class change_common{public static void main(String arg[]){//定义相关变量Scanner scanner new Scanner(System.in);String key&qu…

智能巡检平台建设,减轻一线巡检员负担

智能巡检系统平台的建设,通过技术手段减轻一线巡检员的工作负担,提高巡检工作的效率和质量。以下是该平台建设的几个关键点和效果归纳: 一、自动化规划与分配 智能巡检系统能够自动规划巡检路线、分配巡检任务,从而减少了巡检员在…

@城规人快来抄作业!转GIS开发月薪12000+

从性价比极低的时薪,到相对稳定的月薪过万,我做对了哪些事情? 今天分享的是城乡规划专业的L拿到GIS开发高薪offer的故事。 初识新中地 该同学是城乡规划专业本科,下面称他为L同学。 L同学是今年夏天在网络上了解了GIS开发和新…

小程序发布必须进行软件测试吗?测试内容有哪些?

在如今移动互联网时代,小程序已成为许多企业广泛采用的一种营销手段,然而,发布小程序之前进行充分的软件测试是至关重要的,因为它不仅可以确保小程序的质量,还可以避免潜在的风险和损失。 在进行小程序发布前进行软件…

ELK日志集成

https://www.bilibili.com/video/BV1x94y1674x/?buvidXY705117E90F73A790429C9CFBD5F70F22168&vd_source939ea718db29535a3847d861e5fe37ef

SKYDROID-C12—— 让美景近在眼前

C12是一款小型高清双光吊舱,使用新一代影像芯片,搭配高清无畸变摄像头,有效像素达到500万,拥有强悍的2K视频录制和拍照能力,支持数字变倍,随时随地捕捉清晰的图像,让远处美景近在眼前。

UI(三)布局

文章目录 1、Colum和Row——垂直方向容器和水平方向容器2、ColumnSplit和RowSplit——子组件之间插入一条分割线3、Flex——弹性布局子组件的容器4、Grid和GridItem——网格容器和网格容器单元格5、GridRow和GridCol——栅格容器组件和栅格子组件6、List、ListItem、ListItemGr…

“一站式企业服务平台”全景解析

在当今市场竞争日益激烈、商业环境瞬息万变的大经济环境下,企业在经营过程中常常面临政策不知道摸不清、资源获取困难、融资渠道狭窄、市场开拓不畅、政务办理繁琐等诸多问题,为了解决这些问题,帮扶企业发展,同时优化区域营商环境…