Agent 的核心思想是使用 LLM 来选择要采取的一系列动作。在前面学习过的 Chain 中,一系列操作是硬编码的,
而 Agent 使用 LLM 作为推理引擎来确定采取哪些操作以及采取的顺序。
实例
下面的例子中,我们询问了 LLM 一个问题:“今天广州适合穿什么?”。
LLM 因为无法知道当前广州的天气情况,所以它会调用一个函数 query_web
来获取广州的天气情况。
from langchain.agents import initialize_agent, AgentType from langchain_community.utilities import GoogleSerperAPIWrapper from langchain_core.tools import Tool from langchain_openai import ChatOpenAI import os # https://serper.dev os.environ['SERPER_API_KEY'] = 'your serper api key' llm = ChatOpenAI( model_name="yi-large", temperature=0.3, api_key='your key', base_url="https://api.lingyiwanwu.com/v1", ) def query_web(question: str): search = GoogleSerperAPIWrapper() return search.run(question) tools = [ Tool( name="query_web", description="""当你需要回答关于当前信息的问题时调用。返回的是搜索引擎的搜索结果。参数为问题""", func=query_web ) ] agent = initialize_agent(tools, llm, agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION, verbose=True) print(agent.run('今天广州适合穿什么?给我返回中文的输出'))
输出:
> Entering new AgentExecutor chain... Thought: To determine what to wear in Guangzhou today, I need to check the current weather conditions. I'll use the query_web tool to find the latest weather information. Action: ``` { "action": "query_web", "action_input": "广州今天天气" } ``` Observation: 83°F Thought:Thought: The temperature in Guangzhou is 83°F, which indicates a warm day. I should recommend light clothing suitable for such weather. Final Answer: 今天广州的天气适合穿轻薄的衣服,比如短袖衬衫、短裤或者连衣裙。记得涂抹防晒霜,戴上太阳帽和太阳镜来保护自己免受阳光直射。 > Finished chain. 今天广州的天气适合穿轻薄的衣服,比如短袖衬衫、短裤或者连衣裙。记得涂抹防晒霜,戴上太阳帽和太阳镜来保护自己免受阳光直射。
从上面的输出中,我们可以完整地看到 LLM 推理以及调用 tool
的过程:
- LLM 首先思考了一下,需要查询广州的天气情况。
- 然后 LLM 选择了调用
query_web
这个工具,传递了参数广州今天天气
。 query_web
返回了广州今天的天气情况,LLM 根据这个情况给出了回答。- 最终我们得到了广州今天适合穿什么的回答。
定义多个工具函数
在上面的例子中,我们只给 agent
指定了一个工具函数,在实际使用中,我们可以定义多个工具函数,让 LLM 在推理的过程中选择合适的工具函数。
from langchain.agents import initialize_agent, AgentType from langchain_community.utilities import GoogleSerperAPIWrapper from langchain_core.tools import Tool from langchain_openai import ChatOpenAI import os # https://serper.dev os.environ['SERPER_API_KEY'] = 'your serper api key' llm = ChatOpenAI( model_name="yi-large", temperature=0.3, api_key='your key', base_url="https://api.lingyiwanwu.com/v1", ) def query_web(question: str): search = GoogleSerperAPIWrapper() return search.run(question) def translate(text: str): yi_large_llm = ChatOpenAI( model_name="yi-large", temperature=0.3, api_key='your key', base_url="https://api.lingyiwanwu.com/v1", ) return yi_large_llm.invoke(f'please translate "{text}" to Chinese') tools = [ Tool( name="query_web", description="""当你需要回答关于当前信息的问题时调用。返回的是搜索引擎的搜索结果。参数为问题""", func=query_web ), Tool( name="translate", description="""当你需要将英文翻译成中文时调用。返回的是翻译结果。参数为英文文本""", func=translate ) ] agent = initialize_agent(tools, llm, agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION, verbose=True) print(agent.run('translate "hello" to Chinese'))
输出:
> Entering new AgentExecutor chain... Thought: To translate "hello" to Chinese, I should use the 'translate' tool. Action: ``` { "action": "translate", "action_input": "hello" } ``` Observation: content='"hello" 翻译成中文是 "你好"。' response_metadata={'token_usage': {'completion_tokens': 14, 'prompt_tokens': 19, 'total_tokens': 33}, 'model_name': 'yi-large', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None} id='run-9ef86681-7d64-44b6-876c-951c54686ef1-0' usage_metadata={'input_tokens': 19, 'output_tokens': 14, 'total_tokens': 33} Thought:I now know the final answer Final Answer: "hello" 翻译成中文是 "你好"。 > Finished chain. "hello" 翻译成中文是 "你好"。
在这个例子中,我们可以看到 agent
正确地选择了 translate
这个工具函数,并且返回了正确的翻译结果。
总结
Agent 是一个强大的工具,可以让我们使用 LLM 来去使用一系列工具函数,从而完成一系列复杂的任务。
比如 LLM 无法获取我们服务器地集群信息,但是我们可以定义一个工具函数来获取这些信息,然后让 LLM 来调用这个函数。