基于Langchain框架的Agent简单实现

176 阅读3分钟

准备工作

一点不废话,直接开始。

  1. 打开智谱开放平台,获取秘钥
  2. 打开SerpAPI网站,获取谷歌搜索工具密钥SERPAPI_API_KEY
  3. 安装环境:
pip install langchain
pip install langchainhub
pip install langchain-openai
pip install openai
pip install google-search-results

使用配置文件存储密钥

  1. 在项目根目录创建一个 .env 文件并存储所需要使用到的环境变量
OPENAI_API_KEY="填入你的智谱AI秘钥"
SERPAPI_API_KEY="填入谷歌搜索秘钥"
OPENAI_API_BASE="填入智谱的URL"

使用ReAct框架实现简单Agent

ReAct决策流程图

graph TD
A[行动] --> B[观察] -->C[思考] --> D[最终答案]
C --> A

第一步,从 .env 文件中读取环境变量

from dotenv import load_dotenv
load_dotenv()

第二步,从Langchainhub中获取React的Prompt

# 导入LangChain Hub
from langchain import hub
prompt = hub.pull("hwchase17/react")
print(prompt)

输出:

input_variables=['agent_scratchpad', 'input', 'tool_names', 'tools'] template='Answer the following questions as best you can. You have access to the following tools:\n\n{tools}\n\nUse the following format:\n\nQuestion: the input question you must answer\nThought: you should always think about what to do\nAction: the action to take, should be one of [{tool_names}]\nAction Input: the input to the action\nObservation: the result of the action\n... (this Thought/Action/Action Input/Observation can repeat N times)\nThought: I now know the final answer\nFinal Answer: the final answer to the original input question\n\nBegin!\n\nQuestion: {input}\nThought:{agent_scratchpad}'

template中文翻译:

尽你所能回答以下问题。您可以访问以下工具:
{tools}
使用以下格式:
问题:您必须回答的输入问题
思考:您应该始终思考接下来要做什么
行动:要采取的行动,应该是[{tool_names}]之一
行动输入:行动的输入
观察:行动的结果
…(此想法/行动/行动输入-观察可以重复n次)
思考:我现在知道最终答案了
最终答案:原始输入问题的最终答案
开始!
问题:{input}
思考:{agent_scratchpad}

input_variables:变量名列表,列表中的变量名会在prompt中被实际数据替换。 template:定义prompt格式的字符串,其中包含多个占位符,这些占位符会被input_variables中对应的数据替换。

第三步,选择要使用的LLM

# 导入ChatOpenAI
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model='glm-4')

第四步,准备外部调用工具包

# 导入SerpAPIWrapper即工具包
from langchain_community.utilities import SerpAPIWrapper
from langchain.agents.tools import Tool

# 实例化SerpAPIWrapper
search = SerpAPIWrapper()

# 准备工具列表
tools = [
    Tool(
        name="Search",
        func=search.run,
        description="当大模型没有相关知识时,用于搜索知识"
    ),
]

第五步,构建Agent

# 导入create_react_agent功能
from langchain.agents import create_react_agent

# 构建ReAct代理
agent = create_react_agent(llm, tools, prompt)

第六步,调用Agent执行器

# 导入AgentExecutor
from langchain.agents import AgentExecutor

# 创建代理执行器并传入代理和工具
agent_executor=AgentExecutor(agent=agent, tools=tools, verbose=True)

最后一步,调用执行器,输入内容,执行简单任务

# 调用代理执行器,传入输入数据
print("第一次运行的结果:")
agent_executor.invoke({"input": "当前Agent最新研究进展是什么?"})

print("第二次运行的结果:")
agent_executor.invoke({"input": "当前Agent最新研究进展是什么?"})