LangChain入门:24.通过Baby AGI实现自动生成和执行任务

随着 ChatGPT 的崭露头角,我们迎来了一种新型的代理——Autonomous Agents(自治代理或自主代理)。

这些代理的设计初衷就是能够独立地执行任务,并持续地追求长期目标。

在 LangChain 的代理、工具和记忆这些组件的支持下,它们能够在无需外部干预的情况下自主运行,这在真实世界的应用中具有巨大的价值。

目前,GitHub 上已有好几个备受关注的“网红”项目,如 AutoGPT、BabyAGI 和 HuggingGPT,它们都代表了自治代理的初步尝试。尽管这些代理仍处于实验阶段,但潜力十分巨大。它们都是基于 LangChain 框架构建的。

通过 LangChain,你可以在这些开源项目中轻松地切换和测试多种 LLM、使用多种向量存储作为记忆,以及充分利用 LangChain 的丰富工具集。今天我就带着大家尝试通过 LangChain 完成一个 BabyAGI 的实现。

Baby AGI

BabyAGI 是由中岛洋平(Yohei Nakajima)于 2023 年 3 月 28 日开发的自主任务驱动 AI 系统。核心在于,它可以根据设定的目标生成、组织、确定优先级以及执行任务。它也使用 OpenAI 的 GPT-4 语言模型来理解和创建任务,利用 Pinecone 向量搜索来存储和检索特定任务的结果,提供执行任务的上下文,并采用 LangChain 框架进行决策。

BabyAGI 尝试使用预定义的目标进行自我驱动,自动化个人任务管理。它不仅可以自动生成和执行任务,而且还可以根据完成的任务结果生成新任务,并且可以实时确定任务的优先级。

与传统的 AI 工具(如 ChatGPT)不同,BabyAGI 不仅仅是解释查询和提供响应,而且能够根据目标生成任务列表,连续执行它们,并根据先前任务的输出适应性地创建更多任务。

和 Auto-GPT 一样,该系统发布后广受关注,也被某些人誉为完全自主人工智能的起点

在 BabyAGI 中,你向系统提出一个目标之后,它将不断优先考虑需要实现或完成的任务,以实现该目标。具体来说,系统将形成任务列表,从任务列表中拉出优先级最高的第一个任务,使用 OpenAI API 根据上下文将任务发送到执行代理并完成任务,一旦这些任务完成,它们就会被存储在内存(或者 Pinecone 这类向量数据库)中,然后,根据目标和上一个任务的结果创建新任务并确定优先级。

整个过程如下图所示:
在这里插入图片描述
在这个过程中,驱动任务的是三个不同作用的代理。分别是执行代理 execution_agent,任务创建代理 task_creation_agent,以及优先级设置代理 prioritization_agent。

  • 执行代理,是系统的核心,利用 OpenAI 的 API 来处理任务。这个代理的实现函数有两个参数,目标和任务,用于向 OpenAI 的 API 发送提示,并以字符串形式返回任务结果。
  • 任务创建代理,通过 OpenAI 的 API根据当前对象和先前任务的结果创建新任务。这个代理的实现函数有四个参数,目标、上一个任务的结果、任务描述和当前任务列表。这个代理会向 OpenAI 的 API 发送一条提示,该 API将以字符串形式返回新任务列表。然后,该函数将以字典列表的形式返回这些新任务,其中每个字典都包含任务的名称。
  • 优先级设置代理,负责任务列表的排序和优先级,仍然是通过调用 OpenAI 的 API来重新确定任务列表的优先级。这个代理的实现函数有一个参数,即当前任务的 ID。这个代理会向 OpenAI 的 API发送提示,并返回已重新优先排序为编号列表的新任务列表。

接下来,我就用这个 BabyAGI 的框架来开发一个能够根据气候变化自动制定鲜花存储策略的 AI 智能代理。

根据气候变化自动制定鲜花存储策略

下面,我们就解析一下 LangChain 中 BabyAGI 的具体实现。这里的 “BabyAGI” 是一个简化版的实现,其核心功能是自动创建、优先级排序和执行任务。

首先,我们导入相关的库。

# 设置API Key
import os
os.environ["OPENAI_API_KEY"] = 'Your OpenAI API Key# 导入所需的库和模块
from collections import deque
from typing import Dict, List, Optional, Any
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain_openai import OpenAIEmbeddings
from langchain_openai import ChatOpenAI
from langchain.llms import BaseLLM
from langchain.vectorstores.base import VectorStore
from pydantic import BaseModel, Field
from langchain.chains.base import Chain
from langchain_community.vectorstores import FAISS
import faiss
from langchain_community.docstore import InMemoryDocstore

然后,我们初始化 OpenAIEmbedding 作为嵌入模型,并使用 Faiss 作为向量数据库存储任务信息。

# 定义嵌入模型
embeddings_model = OpenAIEmbeddings(openai_api_key='你的api key',base_url="https://api.chatanywhere.tech/v1",)
# 初始化向量存储
embedding_size = 1536
index = faiss.IndexFlatL2(embedding_size)
vectorstore = FAISS(embeddings_model.embed_query, index, InMemoryDocstore({}), {})

下面是定义任务生成链,基于给定的条件,这个链可以创建新任务。例如,它可以根据最后一个完成的任务的结果来生成新任务。

# 任务生成链
class TaskCreationChain(LLMChain):"""负责生成任务的链"""@classmethoddef from_llm(cls, llm: BaseLLM, verbose: bool = True) -> LLMChain:"""从LLM获取响应解析器"""task_creation_template = ("You are a task creation AI that uses the result of an execution agent"" to create new tasks with the following objective: {objective},"" The last completed task has the result: {result}."" This result was based on this task description: {task_description}."" These are incomplete tasks: {incomplete_tasks}."" Based on the result, create new tasks to be completed"" by the AI system that do not overlap with incomplete tasks."" Return the tasks as an array.")prompt = PromptTemplate(template=task_creation_template,input_variables=["result","task_description","incomplete_tasks","objective",],)return cls(prompt=prompt, llm=llm, verbose=verbose)

下面是定义任务优先级链,这个链负责重新排序任务的优先级。给定一个任务列表,它会返回一个新的按优先级排序的任务列表。

# 任务优先级链
class TaskPrioritizationChain(LLMChain):"""负责任务优先级排序的链"""@classmethoddef from_llm(cls, llm: BaseLLM, verbose: bool = True) -> LLMChain:"""从LLM获取响应解析器"""task_prioritization_template = ("You are a task prioritization AI tasked with cleaning the formatting of and reprioritizing"" the following tasks: {task_names}."" Consider the ultimate objective of your team: {objective}."" Do not remove any tasks. Return the result as a numbered list, like:"" #. First task"" #. Second task"" Start the task list with number {next_task_id}.")prompt = PromptTemplate(template=task_prioritization_template,input_variables=["task_names", "next_task_id", "objective"],)return cls(prompt=prompt, llm=llm, verbose=verbose)

下面是定义任务执行链,这个链负责执行具体的任务,并返回结果。

# 任务执行链
class ExecutionChain(LLMChain):"""负责执行任务的链"""@classmethoddef from_llm(cls, llm: BaseLLM, verbose: bool = True) -> LLMChain:"""从LLM获取响应解析器"""execution_template = ("You are an AI who performs one task based on the following objective: {objective}."

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

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

相关文章

冯唐成事心法笔记 —— 知己

系列文章目录 冯唐成事心法笔记 —— 知己 冯唐成事心法笔记 —— 知人 冯唐成事心法笔记 —— 知世 冯唐成事心法笔记 —— 知智慧 文章目录 系列文章目录卷首语 管理是一生的日常,成事是一生的修行PART 1 知己 用好自己的天赋如何管理自我第一,如何…

C++学习随笔(12)—— list

本章我们来了解一下list 目录 1. list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 1.2.6 list的迭代器失效 1. list的介绍及使用 1.1 list的介绍…

【Unity常用插件】Dotween插件API详解【一】

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:UI_…

10万字208道Java经典面试题总结(2024修订版)- JavaWeb篇

🍅 作者简介:哪吒,CSDN2021博客之星亚军🏆、新星计划导师✌、博客专家💪 🍅 哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师 🍅 技术交流:定期更新…

LabVIEW飞机机电系统综合测试平台

LabVIEW飞机机电系统综合测试平台 在现代航空领域,机电系统的准确性与可靠性对飞行安全至关重要。针对飞机机电管理计算机(UMC)复杂度增加、测试覆盖率低、效率不高等问题,开发了一套基于LabVIEW的机电系统综合测试平台。平台通过…

常用设计模式简介

设计模式是在软件设计中常见问题的通用可重用解决方案。它们分为三大类:创建型模式、结构型模式和行为型模式。下面是这三类中一些常用设计模式的概述: 创建型模式 单例模式(Singleton) 保证一个类只有一个实例,并提供…

内网穿透及公网解析说明

内网穿透释义: 自己在本地搭建服务器时,本地网络有多种环境,如没有公网IP、没有路由映射权限、网络被NAT转发等情况。在需要外网访问内网服务器资源时,就需要用到内网穿透。内网穿透,即内网映射,内网IP地址…

PotatoPie 4.0 实验教程(21) —— FPGA实现摄像头图像二值化(RGB2Gray2Bin)

PotatoPie 4.0开发板教程目录(2024/04/21) 为什么要进行图像的二值化? 当我们处理图像时,常常需要将其转换为二值图像。这是因为在很多应用中,我们只对图像中的某些特定部分感兴趣,而不需要考虑所有像素的…

PostgreSQL的扩展(extensions)-常用的扩展之pgAudit

PostgreSQL的扩展(extensions)-常用的扩展之pgAudit pgAudit 是一个 PostgreSQL 的扩展,它提供了一种方式来生成详尽的审计日志。这对于需要遵守特定监管要求的企业来说是非常重要的,比如那些必须符合 HIPAA、SOX、PCI DSS 等标准…

如何进行域名解析?如何清理DNS缓存?(附源码)

目录 1、什么是域名? 2、为什么使用域名? 3、域名解析的完整流程 4、调用gethostbyname系统接口将域名解析成IP地址 5、为什么需要清理系统DNS缓存? 6、使用cmd命令清理DNS缓存 7、通过代码去清除系统DNS缓存 C软件异常排查从入门到精…

PeLK: 大卷积核强势回归,高达101 × 101,提出了外围卷积

paper:https://arxiv.org/pdf/2403.07589 code:暂无 目录 0. 摘要 1. 引言 2. 相关工作 2.1. Large Kernel Convolutional Networks 2.2. Peripheral Vision for Machine Learning 3. 密集卷积优于条纹卷积 4. 参数高效的大核卷积神经网络 4.1. …

粒子群算法与优化储能策略python实践

粒子群优化算法(Particle Swarm Optimization,简称PSO), 是1995年J. Kennedy博士和R. C. Eberhart博士一起提出的,它是源于对鸟群捕食行为的研究。粒子群优化算法的基本核心是利用群体中的个体对信息的共享从而使得整个群体的运动…

基于 Redis 发布订阅实现服务注册与发现

写在前面 其实很少有公司会使用 Redis 来实现服务注册与发现,通常是ETCD、NACOS、ZOOKEEPER等等,但是也不妨碍我们了解。本文会先介绍 Redis 的发布/订阅模式,接着基于这个模式实现服务注册与发现。 Redis发布订阅流程图: Red…

云备份项目->配置环境

升级gcc到7.3版本 sudo yum install centos-release-scl-rh centos-release-scl sudo yum install devtoolset-7-gcc devtoolset-7-gcc-c source /opt/rh/devtoolset-7/enable echo "source /opt/rh/devtoolset-7/enable" >> ~/.bashrc 安装Jsoncpp库 sud…

CORBA须知(Common Object Request Broker Architecture,通用对象请求代理架构)

1. 定义: CORBA(Common Object Request Broker Architecture,通用对象请求代理架构),是由OMG(Object Management Group,對象管理組) 制定和控制的软件构建标准。 这个架构使得不同…

MyBatis面试题总结,详细(2024最新)

面试必须要看看 1、MyBatis 中的一级缓存和二级缓存是什么?它们的区别是什么? MyBatis 中的一级缓存是指 SqlSession 对象内部的缓存,它是默认开启的。一级缓存的生命周期是与 SqlSession 对象绑定的,当 SqlSession 关闭时&#…

OpenMesh 网格主曲率计算

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 OpenMesh中并没有为我们提供网格主曲率的相关计算接口,但其提供了平均曲率与高斯曲率的计算,我们都知道平均曲率: H = K 1 + K 2 H = K_1+K2 H

【uni-app】uni-app官方自带图标的使用方法

1、图标地址&#xff1a; https://hellouniapp.dcloud.net.cn/pages/extUI/icons/icons 2、图标用法 icon | uni-app官网 3、实例 <uni-icons type"left" color"white" :size"23" /> <view class"topBar"><view s…

Linux--进程控制(2)--进程的程序替换(夺舍)

目录 进程的程序替换 0.相关函数 1.先看现象 2.解释原理 3.将代码改成多进程版 4.使用其它的替换函数&#xff0c;并且认识函数参数的含义 5.其它 进程的程序替换 0.相关函数 关于进程替换我们需要了解的6个函数&#xff1a; 函数解释&#xff1a; 这些函数如果调用成功则…

react脚手架创建项目,配置别名(alias)

React脚手架项目使用 react-scripts 封装了webpack配置&#xff0c;所以我们需要通过 config-overrides 或者 eject 的方式来修改webpack配置 可以的话 &#xff0c;创建项目的时候可以使用vite &#xff0c;我这是老项目屎山 懒得迁移 &#xff0c;但还得改呀 ## 1. 安装依…