目录
前言
在人工智能的领域中,Langchain框架以其独特的Agent模块引起了广泛的关注。该模块作为智能化任务执行的核心,不仅体现了智能代理的强大能力,还展示了其在处理复杂任务中的高效性和精准度。本文将深入探讨Langchain框架的Agent模块,对其核心原理、机制流程进行详细解析;同时对常用的几种Agent类型进行代码演示。
一、概述
Agent是一个“智能代理”,是LangChain的核心组件;它可以组合多个Chain链来完成用户需求;针对用户提出的问题和需求,利用ReAct原理,分析理解用户输入的上下文和具体的应用场景,然后从工具箱中选择合适的工具来执行操作(这个过程Agent会使用LLM的能力来理解和生成语言,以及其他工具来执行具体的任务),比如搜索google,查询数据库等来完成任务,最后输出结果给到用户。
二、Agent核心原理(ReAct)
1) 推理(Reason):根据用户输入,利用LLM能力进行逻辑推理,判断应该执行什么操作来完成任务
2) 执行(Action):确定用户要执行的动作后,调用相应的工具来完成任务;工具包括内置工具(谷歌搜索)和外部工具(数据库查询)等。
三、ReAct的机制流程(推理+行动)
1)接收输入:用户或者系统向ReAct提出需求或者问题;
2)分析推理:ReAct对输入进行分析推理,确定需要执行的操作步骤;
3)执行操作:根据推理出来的操作,调用外部或者内部的API完成任务;
4)输出结果:操作执行完成后,以人类可以理解的形式返回给用户;
四、Self-ask with search
Self-ask with search是Agent的一种重要功能。通过自我提问并搜索相关信息,Agent能够更好地理解用户需求,从而提供更准确的服务。下面样例中展示,Agent通过自我询问的方式查询互联网API获取答案。
准备工作:
1.下面使用到了搜索引擎Tavily,需要到Tavily官网申请的API KEY
2.下面使用到了Fireworks的模型需要到Fireworks.ai申请API KEY 配置到环境变量
代码样例:
1)导入依赖、选择大模型
选择大模型 需要申请Fireworks.ai的API KEY (Fireworks.ai 是一家提供开源模型API服务)
import os
from langchain import hub
from langchain.agents import AgentExecutor, create_self_ask_with_search_agent
from langchain_community.llms import Fireworks
from langchain_community.tools.tavily_search import TavilyAnswer
# 配置模型
llm = Fireworks(fireworks_api_key=os.environ['FIREWORKS_API_KEY'])
2)配置搜索工具
需要申请搜索引擎Tavily的API KEY (Tavily 专门为人工智能体设计了一款搜索 API)
tools = [TavilyAnswer(max_results=1, name="Intermediate Answer",tavily_api_key='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')]
3)选择prompt提示词
#获取prompt
prompt = hub.pull("hwchase17/self-ask-with-search")
4)构建Agent代理
agent = create_self_ask_with_search_agent(llm, tools, prompt)
5)创建代理执行器、调用
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)agent_executor.invoke( {"input": "上个赛季的NBA总冠军是哪支球队?"})
#执行过程:
Entering new AgentExecutor chain... Yes.Follow up: Which NBA team won the championship last season?According to the data provided, the Denver Nuggets won the NBA championship last season in 2022.So the final answer is: Denver Nuggets
#输出结果:
{'input': '上个赛季的NBA总冠军是哪支球队?', 'output': 'Denver Nuggets'}
五、OpenAI functions agent
OpenAI functions agent是另一种重要的Agent类型。它利用OpenAI的先进技术,能够执行更复杂的任务,并提供更高级的服务。
1)导入依赖、设置模型
from langchain import hub
from langchain.agents import AgentExecutor, create_openai_functions_agent
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_openai import ChatOpenAI
#选择OpenAI的模型驱动代理
llm = ChatOpenAI(model="gpt-3.5-turbo-1106")
2)配置搜索工具
tools = [TavilySearchResults(max_results=1)]
3)提示词选择
#拉取提示词
prompt = hub.pull("hwchase17/openai-functions-agent")
4)构建OpenAI Functions代理
#构造 OpenAI Functions agent
agent = create_openai_functions_agent(llm, tools, prompt)
5)创建代理执行器、调用
#创建代理执行器
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
agent_executor.invoke({"input": "what is LangChain?"})
输出结果:
{'input': 'what is LangChain?',
'output': "LangChain is a platform that offers a complete set of powerful building blocks for building context-aware, reasoning applications using flexible abstractions and an AI-first toolkit. It enables developers to leverage new cognitive architectures and battle-tested orchestration to harness the power of non-deterministic models, particularly Large Language Models (LLMs). LangChain provides tools for chatbots, Q&A over docs, summarization, copilots, workflow automation, document analysis, and custom search. It is used by global corporations, startups, and developers to build advanced applications with LLMs. If you'd like to learn more, you can visit their website [here](https://www.langchain.com/)."}
6)使用聊天历史
from langchain_core.messages import AIMessage, HumanMessage
agent_executor.invoke({
"input": "what's my name?",
"chat_history": [
HumanMessage(content="hi! my name is bob"),
AIMessage(content="Hello Bob! How can I assist you today?"),
],
})
#输出
{'input': "what's my name?", 'chat_history': [HumanMessage(content='hi! my name is bob'), AIMessage(content='Hello Bob! How can I assist you today?')], 'output': 'Your name is Bob.'}
六、自定义Agent
Langchain框架允许用户自定义Agent,以满足特定的需求。用户可以根据自己的需求,选择不同的工具和策略,创建出符合自己需求的Agent。
1)导入依赖包、选择模型、定义LLM
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
2)自定义处理的工具函数
from langchain.agents import tool
@tool
def get_word_length(word: str) -> int:
"""Returns the length of a word."""
return len(word)
get_word_length.invoke("abc")
3)函数绑定工具
tools = [get_word_length]
4)创建prompt,提示模板格式化
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
prompt = ChatPromptTemplate.from_messages(
[
("system", "You are very powerful assistant, but don't know current events", ),
("user", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
]
)
5)LLM绑定工具
llm_with_tools = llm.bind_tools(tools)
6)创建Agent(将提示、模型、输出链起来)
from langchain.agents.format_scratchpad.openai_tools import (
format_to_openai_tool_messages,
)
from langchain.agents.output_parsers.openai_tools import OpenAIToolsAgentOutputParser
agent = (
{
"input": lambda x: x["input"],
"agent_scratchpad": lambda x: format_to_openai_tool_messages(
x["intermediate_steps"]
),
}
| prompt
| llm_with_tools
| OpenAIToolsAgentOutputParser()
)
7)构建AgentExecutor 再调用执行,查看执行过程和输出结果
from langchain.agents import AgentExecutor
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
list(agent_executor.stream({"input": "How many letters in the word eudca"}))
[{'actions': [OpenAIToolAgentAction(tool='get_word_length', tool_input={'word': 'eudca'}, log="\nInvoking: `get_word_length` with `{'word': 'eudca'}`\n\n\n", message_log=[AIMessageChunk(content='', additional_kwargs={'tool_calls': [{'index': 0, 'id': 'call_AzluXlWFt8xvgOAZRuHJ3Vwq', 'function': {'arguments': '{"word":"eudca"}', 'name': 'get_word_length'}, 'type': 'function'}]}, response_metadata={'finish_reason': 'tool_calls'})], tool_call_id='call_AzluXlWFt8xvgOAZRuHJ3Vwq')],
'messages': [AIMessageChunk(content='', additional_kwargs={'tool_calls': [{'index': 0, 'id': 'call_AzluXlWFt8xvgOAZRuHJ3Vwq', 'function': {'arguments': '{"word":"eudca"}', 'name': 'get_word_length'}, 'type': 'function'}]}, response_metadata={'finish_reason': 'tool_calls'})]},
{'steps': [AgentStep(action=OpenAIToolAgentAction(tool='get_word_length', tool_input={'word': 'eudca'}, log="\nInvoking: `get_word_length` with `{'word': 'eudca'}`\n\n\n", message_log=[AIMessageChunk(content='', additional_kwargs={'tool_calls': [{'index': 0, 'id': 'call_AzluXlWFt8xvgOAZRuHJ3Vwq', 'function': {'arguments': '{"word":"eudca"}', 'name': 'get_word_length'}, 'type': 'function'}]}, response_metadata={'finish_reason': 'tool_calls'})], tool_call_id='call_AzluXlWFt8xvgOAZRuHJ3Vwq'), observation=5)],
'messages': [FunctionMessage(content='5', name='get_word_length')]},
{'output': 'The word "eudca" has 5 letters.',
'messages': [AIMessage(content='The word "eudca" has 5 letters.')]}]
总结
Langchain框架的Agent模块以其强大的功能和灵活的设计,为用户提供了高效的服务。无论是通过ReAct原理的推理和行动,还是通过Self-ask with search和OpenAI functions agent的功能,或是通过自定义Agent的灵活性,Agent模块都展现了其在处理复杂任务中的优势。也许不久之后就可以看到更多基于Langchain框架的创新应用,为人工智能领域带来更多的可能性。
探索未知,分享所知;点击关注,码路同行,寻道人生!