Langchain构建Agent
语言模型只能输出文本,无法执行 操作。Agent是使用LLM作为推理引擎来确定要执行的操作以及这些操作的输入应该是什么。然后根据结果,Agent进行执行。
创建Agent的API
pip install langgraph
初始化
import osfrom langchain_community.tools.tavily_search import TavilySearchResults from langchain_core.messages import HumanMessage from langchain_openai import ChatOpenAI, OpenAIEmbeddings from langgraph.prebuilt import chat_agent_executor from langserve import add_routesos.environ['http_proxy'] = '127.0.0.1:7890' os.environ['https_proxy'] = '127.0.0.1:7890'os.environ["LANGCHAIN_TRACING_V2"] = "true" os.environ["LANGCHAIN_PROJECT"] = "LangchainDemo" os.environ["LANGCHAIN_API_KEY"] = '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' os.environ["TAVILY_API_KEY"] = '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'# 聊天机器人案例 # 创建模型 model = ChatOpenAI(model='gpt-4-turbo')# 没有任何代理的情况下 # result = model.invoke([HumanMessage(content='北京天气怎么样?')])
#无代理情况
Tavily搜索引擎
#from langchain_community.tools.tavily_search import TavilySearchResults
TavilySearchResults:Langchain的内置搜索引擎工具;
其内部包含多个元数据,包含大量常用公共网站,而后逐个搜索。
返回也是个Runnable对象(即可以调用invoke)。需要 API_Key初始化os.environ["TAVILY_API_KEY"] 。
# LangChain内置了一个工具,可以轻松地使用Tavily搜索引擎作为工具。 # max_results: 只返回两个结果 search = TavilySearchResults(max_results=2) # print(search.invoke('北京的天气怎么样?'))
search.invoke('北京的天气怎么样?')返回:
{网站1url,content},{网站2url,content}....
模型绑定工具
上面的,只是创建了个search对象,并没有和Model进绑定。但创建代理,不需要绑定操作
model.bind_tools( [工具对象] ) :模型绑定工具。
绑定后,模型自动推理,是否需要调用工具。
# 让模型绑定工具 tools = [search] model_with_tools = model.bind_tools(tools)# 模型可以自动推理:是否需要调用工具去完成用户的答案 resp = model_with_tools.invoke([HumanMessage(content='中国的首都是哪个城市?')]) # print(f'Model_Result_Content: {resp.content}') print(f'Tools_Result_Content: {resp.tool_calls}') # resp2 = model_with_tools.invoke([HumanMessage(content='北京天气怎么样?')])print(f'Model_Result_Content: {resp2.content}') print(f'Tools_Result_Content: {resp2.tool_calls}')
Q1不需要调用 search工具。因此tool_calls为空.
Q2 模型回答不了,因此 Model的content为空。
创建代理
chat_agent_executor.create_tool_calling_executor( 模型 , [工具]):创建工具调用器。返回 代理执行器(Runnable)
# 创建代理agent_executor = chat_agent_executor.create_tool_calling_executor(model, tools)resp = agent_executor.invoke({'messages': [HumanMessage(content='中国的首都是哪个城市?')]}) print(resp['messages'])resp2 = agent_executor.invoke({'messages': [HumanMessage(content='北京天气怎么样?')]}) print(resp2['messages'])
Q1:模型能回答,因此就返回AIMessage
Q2:模型无法回答,因此AIMessage是空的,但ToolMessage是有的。