Skip to main content

使用工具的BabyAGI

这个笔记本是在baby agi的基础上构建的,但展示了如何替换执行链。之前的执行链只是一个随机生成的LLM。通过用一个具有工具访问权限的代理替换它,我们希望能够获得真实可靠的信息。

安装和导入所需模块

import os
from collections import deque
from typing import Dict, List, Optional, Any

from langchain import LLMChain, OpenAI, PromptTemplate
from langchain.embeddings import OpenAIEmbeddings
from langchain.llms import BaseLLM
from langchain.vectorstores.base import VectorStore
from pydantic import BaseModel, Field
from langchain.chains.base import Chain
from langchain_experimental.autonomous_agents import BabyAGI

连接到向量存储

根据您使用的向量存储,此步骤可能会有所不同。

from langchain.vectorstores import FAISS
from langchain.docstore import InMemoryDocstore
    注意:您可能需要重新启动内核以使用更新的软件包。
注意:您可能需要重新启动内核以使用更新的软件包。
# 定义嵌入模型
embeddings_model = OpenAIEmbeddings()
# 将向量存储初始化为空
import faiss

embedding_size = 1536
index = faiss.IndexFlatL2(embedding_size)
vectorstore = FAISS(embeddings_model.embed_query, index, InMemoryDocstore({}), {})

定义链

BabyAGI依赖于三个LLM链:

  • 任务创建链,用于选择要添加到列表中的新任务
  • 任务优先级链,用于重新设置任务优先级
  • 执行链,用于执行任务

注意:在这个笔记本中,执行链现在将是一个代理。

from langchain.agents import ZeroShotAgent, Tool, AgentExecutor
from langchain import OpenAI, SerpAPIWrapper, LLMChain

todo_prompt = PromptTemplate.from_template(
"You are a planner who is an expert at coming up with a todo list for a given objective. Come up with a todo list for this objective: {objective}"
)
todo_chain = LLMChain(llm=OpenAI(temperature=0), prompt=todo_prompt)
search = SerpAPIWrapper()
tools = [
Tool(
name="Search",
func=search.run,
description="useful for when you need to answer questions about current events",
),
Tool(
name="TODO",
func=todo_chain.run,
description="useful for when you need to come up with todo lists. Input: an objective to create a todo list for. Output: a todo list for that objective. Please be very clear what the objective is!",
),
]


prefix = """You are an AI who performs one task based on the following objective: {objective}. Take into account these previously completed tasks: {context}."""
suffix = """Question: {task}
{agent_scratchpad}"""
prompt = ZeroShotAgent.create_prompt(
tools,
prefix=prefix,
suffix=suffix,
input_variables=["objective", "task", "context", "agent_scratchpad"],
)
llm = OpenAI(temperature=0)
llm_chain = LLMChain(llm=llm, prompt=prompt)
tool_names = [tool.name for tool in tools]
agent = ZeroShotAgent(llm_chain=llm_chain, allowed_tools=tool_names)
agent_executor = AgentExecutor.from_agent_and_tools(
agent=agent, tools=tools, verbose=True
)

运行BabyAGI

现在是时候创建BabyAGI控制器并观察它尝试实现您的目标了。

OBJECTIVE = "Write a weather report for SF today"
# LLMChains的日志记录
verbose = False
# 如果为None,将一直继续下去
max_iterations: Optional[int] = 3
baby_agi = BabyAGI.from_llm(
llm=llm,
vectorstore=vectorstore,
task_execution_chain=agent_executor,
verbose=verbose,
max_iterations=max_iterations,
)
baby_agi({"objective": OBJECTIVE})
    
*****任务列表*****

1: 制作一个待办事项清单

*****下一个任务*****

1: 制作一个待办事项清单


> 进入新的AgentExecutor链...
思考:我需要制作一个待办事项清单
动作:TODO
动作输入:为SF今天写一份天气报告

1. 研究旧金山的当前天气条件
2. 收集有关温度、湿度、风速和其他相关天气条件的数据
3. 分析数据以确定当前天气趋势
4. 写一份天气报告的简要介绍
5. 描述旧金山的当前天气条件
6. 讨论即将到来的天气变化
7. 总结天气报告
8. 校对和编辑报告
9. 提交报告 我现在知道最终答案
最终答案:为SF今天写一份天气报告的待办事项清单是:1. 研究旧金山的当前天气条件;2. 收集有关温度、湿度、风速和其他相关天气条件的数据;3. 分析数据以确定当前天气趋势;4. 写一份天气报告的简要介绍;5. 描述旧金山的当前天气条件;6. 讨论即将到来的天气变化;7. 总结天气报告;8. 校对和编辑报告;9. 提交报告。

> 完成链。

*****任务结果*****

为SF今天写一份天气报告的待办事项清单是:1. 研究旧金山的当前天气条件;2. 收集有关温度、湿度、风速和其他相关天气条件的数据;3. 分析数据以确定当前天气趋势;4. 写一份天气报告的简要介绍;5. 描述旧金山的当前天气条件;6. 讨论即将到来的天气变化;7. 总结天气报告;8. 校对和编辑报告;9. 提交报告。

*****任务列表*****

2: 收集有关降水、云量和其他相关天气条件的数据;
3: 分析数据以确定即将到来的天气变化;
4: 研究旧金山的当前天气预报;
5: 在天气报告中创建一个可视化表示;
6: 在报告中包含相关的图像和图形;
7: 为易读性格式化报告;
8: 在线发布报告;
9: 监控报告的准确性。

*****下一个任务*****

2: 收集有关降水、云量和其他相关天气条件的数据;


> 进入新的AgentExecutor链...
思考:我需要搜索旧金山的当前天气条件
动作:Search
动作输入:旧金山的当前天气条件Current Weather for Popular Cities ; San Francisco, CA 46 · Partly Cloudy ; Manhattan, NY warning 52 · Cloudy ; Schiller Park, IL (60176) 40 · Sunny ; Boston, MA 54 ... 我需要将数据编译成一份天气报告
动作:TODO
动作输入:将数据编译成一份天气报告

1. 从可靠的来源(如国家气象局、当地气象站和其他气象组织)收集数据。

2. 分析数据以确定趋势和模式。

3. 创建图表或图形以可视化数据。

4. 写一份数据摘要及其含义。

5. 将数据编译成报告格式。

6. 校对报告的准确性和清晰度。

7. 将报告发布到网站或其他平台。

8. 将报告分发给相关利益相关者。 我现在知道最终答案
最终答案:今天在旧金山,温度为46华氏度,天空多云。预计今天其余时间将保持多云。

> 完成链。

*****任务结果*****

今天在旧金山,温度为46华氏度,天空多云。预计今天其余时间将保持多云。

*****任务列表*****

3: 为易读性格式化报告;
4: 在报告中包含相关的图像和图形;
5: 将旧金山的当前天气条件与预测条件进行比较;
6: 确定该地区可能存在的与天气相关的危险;
7: 研究旧金山的历史天气模式;
8: 确定天气数据中可能存在的趋势;
9: 在报告中包含相关数据源;
10: 简洁地总结天气报告;
11: 包含预测天气条件的摘要;
12: 包含当前天气条件的摘要;
13: 包含历史天气模式的摘要;
14: 包含可能的与天气相关的危险的摘要;
15: 包含天气数据中可能的趋势的摘要;
16: 包含报告中使用的数据源的摘要;
17: 分析数据以确定即将到来的天气变化;
18: 研究旧金山的当前天气预报;
19: 在天气报告中创建一个可视化表示;
20: 在线发布报告;
21: 监控报告的准确性

*****下一个任务*****

3: 为易读性格式化报告;


> 进入新的AgentExecutor链...
思考:我需要确保报告易于阅读;
动作:TODO
动作输入:使报告易于阅读

1. 将报告分成具有清晰标题的部分
2. 使用项目符号和编号列表组织信息
3. 使用简短、简洁的句子
4. 使用简单的语言,避免术语
5. 包含图表、图形和图表以说明要点
6. 使用粗体和斜体文本强调关键要点
7. 包含目录和页码
8. 在报告中使用一致的字体和字号
9. 在报告末尾包含摘要
10. 校对报告中的拼写错误和错误 我现在知道最终答案
最终答案:报告应该采用易读的格式,将其分成具有清晰标题的部分,使用项目符号和编号列表组织信息,使用简短、简洁的句子,使用简单的语言,避免术语,包含图表、图形和图表以说明要点,使用粗体和斜体文本强调关键要点,包含目录和页码,在报告中使用一致的字体和字号,包含报告末尾的摘要,并校对报告中的拼写错误和错误。

> 完成链。

*****任务结果*****

报告应该采用易读的格式,将其分成具有清晰标题的部分,使用项目符号和编号列表组织信息,使用简短、简洁的句子,使用简单的语言,避免术语,包含图表、图形和图表以说明要点,使用粗体和斜体文本强调关键要点,包含目录和页码,在报告中使用一致的字体和字号,包含报告末尾的摘要,并校对报告中的拼写错误和错误。

*****任务结束*****






{'objective': '为SF今天写一份天气报告'}