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

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 OpenAIdef 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 chaindef 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_chaindef get_chat_history(chain_memory):memory_key = chain_memory.memory_keychat_history = chain_memory.load_memory_variables(memory_key)[memory_key]return chat_historydef get_new_instructions(meta_output):delimiter = "Instructions: "new_instructions = meta_output[meta_output.find(delimiter) + len(delimiter) :]return new_instructionsdef 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):breakoutput = chain.predict(human_input=human_input)if success_phrase in human_input.lower():print("You succeeded! Thanks for playing!")returnmeta_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.mzph.cn/web/35450.shtml

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

相关文章

上班族要怎么挑选智能猫砂盆?今年最受欢迎的牌子都在这里了!

对于上班族来说,猫砂盆里的猫屎到底该如何是好,放到下班回来再铲,猫砂的臭味早就飘满屋子,想立刻铲掉吧,班不要上啦?可是不铲就会生细菌,谁也不想花个几千块去给猫咪看病吧,谁不希望…

Linux:进程和计划任务管理

目录 一、程序和进程 1.1、程序 1.2、进程 1.3、线程 1.4、协程 二、查看进程相关命令 2.1、ps命令(查看静态的进程统计信息) 第一行为列表标题,其中各字段的含义描述如下 2.2、top命令(查看进程动态信息) 2…

商城积分系统的设计方案(上)-- 需求分析

一、背景 用户在参与公司的促销活动,比如邀请用户下单支付,可以获得虚拟货币。它可以用于解锁学习课程。 商品在定价的时候,需支持虚拟货币,用户在购买该商品的时候,可使用虚拟货币进行支付。 在电商体系中&#xf…

PID算法介绍以及代码实现过程说明

写在正文之前 在上一篇文章就说会在这两天会基于PID写一个文章,这里的原理部分值得大家都看一下,代码部分的实现是基于python的,但是对于使用其他编程语言的朋友,由于我写的很通俗易懂,所以也值得借鉴。 一、PID算法…

linux基于wifi,Xshell的远程连接

最近有个比赛,要使用ros小车但是系统是ubuntu20.04无桌面系统刚开始接触linux的我啥都不会,就一个简单的连接wifi都搞了3天才搞通。再此进行一个总结。参考博客原文链接:https://blog.csdn.net/qq_51491920/article/details/126221940 一、什…

短说V4.1.5及PC端V3.1.4正式版发布公告

Hi 大家好, 我是给你们带来惊喜的运营小番茄。 本期更新为短说 4.1.5和PC端3.1.4的正式版。 本次修复上个版本中的问题和功能优化,以及新增了如下功能: PC端支持发布秀米帖,可支持部分秀米格式;后台管理类消息新增…

【秋招刷题打卡】Day03-二分系列之-二分答案

Day03-二分系列之-二分答案 给大家推荐一下咱们的 陪伴打卡小屋 知识星球啦&#xff0c;详细介绍 >笔试刷题陪伴小屋-打卡赢价值丰厚奖励 < ⏰小屋将在每日上午发放打卡题目&#xff0c;包括&#xff1a; 一道该算法的模版题 (主要以力扣&#xff0c;牛客&#xff0c;…

43 mysql insert select 的实现

前言 我们这里 来探讨一下 insert into $fields select $fields from $table; 的相关实现, 然后 大致来看一下 为什么 他能这么快 按照 我的思考, 应该里里面有 批量插入才对, 但是 调试结果 发现令我有一些意外 呵呵 果然 只有调试才是唯一的真理 测试数据表如下 CREATE…

数字社交的领航者:解析Facebook的引领作用

在当今数字化社会中&#xff0c;社交网络已经成为了人们日常生活不可或缺的一部分。而在众多社交平台中&#xff0c;Facebook凭借其巨大的用户基础和创新的技术应用&#xff0c;被公认为数字社交领域的领航者之一。本文将深入解析Facebook在数字社交中的引领作用&#xff0c;探…

这三款工具很好用,赶快试试

FileZilla FileZilla是一款免费开源的FTP软件&#xff0c;分为客户端版本和服务器版本&#xff0c;具备所有的FTP软件功能。它是一个快速、可信赖的FTP客户端以及服务器端开放源代码程序&#xff0c;具有多种特色和直觉的界面。FileZilla客户端版是一个方便高效的FTP客户端工具…

第一后裔The First Descendant开服时间、配置要求一览

第一后裔是一款采用虚幻5引擎打造的第三人称合作射击动作RPG&#xff0c;玩家将化身为一名继承者&#xff0c;通过各种任务和故事不断成长&#xff0c;为守护人类与对抗侵略者战斗。该作即将上线&#xff0c;为了不让玩家们错过这款精彩的游戏&#xff0c;本文整理了第一后裔上…

测评:【AI办公】版本更迭与AI加持下的最新ONLYOFFICE桌面编辑器8.1

你是否还在为没有一款合适的在线桌面编辑器而苦恼&#xff1f;你是否还在因为办公软件的选择过少而只能使用WPS或者office&#xff1f;随着办公需求的不断变化和发展&#xff0c;办公软件也在不断更新和改进。ONLYOFFICE 作为一款全功能办公软件&#xff0c;一直致力于为用户提…

2024年全国青少年信息素养大赛图形化编程复赛样题_6547网

第 1 题 问答题 【编程实现】 按空格键随机切换背景&#xff0c;让背景对应的角色造型显示在舞台上。 【具体要求】 对角色编程&#xff0c;当按下空格键时&#xff0c;背景随机切换&#xff1b; 角色切换成对应的造型显示在舞台上&#xff1b; 角色说“我是”和它的造…

帮助你简易起步一个BLOG(博客搭建)项目

Blog项目 后端项目结构1. 项目初始化2. 详细步骤3.postman测试 前端1. 项目初始化2. 详细步骤 本章节是为了帮助你起步一个完整的前后端分离项目。 前端技术栈&#xff1a; react、vite、mantine、tailwind CSS、zustand、rxjs、threejs 后端技术栈&#xff1a;nodemon、nodej…

Transformer教程之神经网络和深度学习基础

在当今的人工智能领域&#xff0c;Transformer已经成为了一个热门的词汇。它不仅在自然语言处理&#xff08;NLP&#xff09;领域取得了巨大的成功&#xff0c;还在计算机视觉等其他领域展现出了强大的潜力。然而&#xff0c;要真正理解Transformer&#xff0c;我们首先需要扎实…

gdb用法

创建文件 // main.cpp文件 // 稳态误差 void pid_test_wentaiwucha() {float p 1.5;int t 1; // t 1s;int target 5; // 5m/sfloat output 0;float radis 3; // 稳态误差std::cout << "output: " << std::endl;fo…

并发 多线程

目录 thread thread 类总览 构造函数 join joinable ​编辑 detach swap yield swap 成员函数的调用 namespace::this_thread 线程同步--锁 互斥锁mutex 递归锁recursive_mutex 定时锁 Lock 锁辅助类 lock_guard​编辑 unique_lock std::lock 解决死锁问题 消息…

浅谈逻辑控制器之随机顺序控制器

浅谈逻辑控制器之随机顺序控制器 随机顺序控制器&#xff08;Random Order Controller&#xff09;作为一个独特的逻辑控制器&#xff0c;为测试脚本的执行增添了一层随机性&#xff0c;特别适用于模拟用户行为中不确定的访问模式。 随机顺序控制器概述 随机顺序控制器&…

代码随想录算法训练营第三十六天|62.不同路径、 63. 不同路径 II、343.整数拆分(可跳过)、96.不同的二叉搜索树(可跳过)

62.不同路径 题目链接&#xff1a;62.不同路径 文档讲解&#xff1a;代码随想录 状态&#xff1a;还行 思路&#xff1a;当前状态的只有可能是从上面或者左边过来的&#xff0c;所以 dp[i][j] dp[i-1] dp[j-1] 题解&#xff1a; public int uniquePaths(int m, int n) {if (…

Docker 安装Nginx部署网站 防火墙端口 数据卷挂载

拉取镜像 docker pull nginx#不写版本号 表示最新版本查看是否拉取成功 docker images#成功 nginx latest 605c77e624dd 2 years ago 141MB mysql 8.0 3218b38490ce 2 years ago 516MB mysql latest 3218b38490ce 2 years ago 5…