langchain 入门指南 - 使用 Agent

Agent 的核心思想是使用 LLM 来选择要采取的一系列动作。在前面学习过的 Chain 中,一系列操作是硬编码的, 而 Agent 使用 LLM 作为推理引擎来确定采取哪些操作以及采取的顺序。

实例

下面的例子中,我们询问了 LLM 一个问题:“今天广州适合穿什么?”。

LLM 因为无法知道当前广州的天气情况,所以它会调用一个函数 query_web 来获取广州的天气情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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('今天广州适合穿什么?给我返回中文的输出'))

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
> 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 在推理的过程中选择合适的工具函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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'))

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
> 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 来调用这个函数。