Jean's Blog

一个专注软件测试开发技术的个人博客

0%

LangChain组件Agent

注意:LangChain中agent现在已经不在进行维护了,了解即可,用来编写智能体重点使用LangGraph,之后智能体会详细学习LangGraph

智能体开发流程

graph LR
    A["初始化工具"] --> B["初始化大模型"]
    B --> C["创建智能体"]
    C --> D["调用智能体"]

根据以上流程,示例代码如下:

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
46
47
48
49
50
51
52
53
54
55
56
57
# @Time:2025/9/16 09:23
# @Author:jinglv
from langchain.agents import initialize_agent, AgentType
from langchain_core.tools import tool
from pydantic import BaseModel, Field


# 第一步:初始化工具
class AddInputArgs(BaseModel):
a: int = Field(description="first number")
b: int = Field(description="second number")


@tool(
description="add two numbers",
args_schema=AddInputArgs,
return_direct=True,
)
def add(a, b):
"""add two numbers"""
return a + b


def create_calc_tools():
return [add]


calc_tools = create_calc_tools()

# 第二步:初始化大模型
import os
from dotenv import load_dotenv

# 加载 .env 文件中的变量
load_dotenv()

from langchain_openai import ChatOpenAI

qv_llm = ChatOpenAI(
model=os.getenv("LLM_MODEL"),
base_url=os.getenv("LLM_BASE_URL"),
api_key=os.getenv("LLM_API_KEY"),
streaming=True,
)

# 第三步:创建智能体(智能体初始化)
agent = initialize_agent(
tools=calc_tools,
llm=qv_llm,
agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True, # 打开调试模式
)

# 第四步:调用智能体
response = agent.invoke("100+100=?")
print(response)

打开了调试模式,可以看到执行的内部流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
> Entering new AgentExecutor chain...
Thought: I can use the add tool to calculate the sum of 100 and 100.
Action:
```
{
"action": "add",
"action_input": {
"a": 100,
"b": 100
}
}
```
Observation
Observation: 200


> Finished chain.
{'input': '100+100=?', 'output': 200}

AgentType

LangChain提供多种Agent类型,每种类型适用于不同的场景和需求。以下是几种主要Agent类型及其特点:

AgentType 核心机制 适用场景 优点 缺点
ZERO_SHOT_REACTDESCRIPTION ReAct + 工具描述 简单任务、工具组合 快速集成、无需训练数据 输出格式自由,可控性较低
STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION 结构化输出 + ReAct 结构化工具调用 高可控性、格式严格 依赖工具描述清晰度
OPENAI_FUNCTIONS OpenAI 函数调用 OpenAI 模型场景 高效、强耦合 OpenAI 仅限 OpenAI 模型
CONVERSATIONAL_REACT_DESCRIPTION 多轮对话 + ReAct 多轮交互任务 上下文感知、灵活性高 需配置记忆模块
AUTO_GPT 自主代理循环 复杂任务自动化 自主决策、长期目标 实验性、稳定性待验证
STRUCTURED_CHAT 严格结构化输出 数据提取、表单填写 格式标准化、可控性强 灵活性低

智能体开发返回体结构化

直接看代码示例

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# @Time:2025/9/16 10:12
# @Author:jinglv
from langchain.agents import initialize_agent, AgentType
from langchain_core.tools import tool
from pydantic import BaseModel, Field


# 第一步:初始化工具
class AddInputArgs(BaseModel):
a: int = Field(description="first number")
b: int = Field(description="second number")


@tool(
description="add two numbers",
args_schema=AddInputArgs,
return_direct=False, # 默认为 False 表示返回的是一个字符串
)
def add(a, b):
"""add two numbers"""
return a + b


def create_calc_tools():
return [add]


calc_tools = create_calc_tools()

# 第二步:初始化大模型
import os
from dotenv import load_dotenv

# 加载 .env 文件中的变量
load_dotenv()

from langchain_openai import ChatOpenAI

qv_llm = ChatOpenAI(
model=os.getenv("LLM_MODEL"),
base_url=os.getenv("LLM_BASE_URL"),
api_key=os.getenv("LLM_API_KEY"),
streaming=True,
)


# 结果格式化输出
# 定义输出的结构化数据
class Output(BaseModel):
args: str = Field(description="工具的入参")
result: str = Field(description="计算的结果")


from langchain_core.output_parsers import JsonOutputParser

# 定义解析器
parser = JsonOutputParser(pydantic_object=Output)
# 格式化
format_instruction = parser.get_format_instructions()
print('--------------------------格式化输出的内容-----------------------')
print(format_instruction)

# 第三步:创建智能体(智能体初始化)
agent = initialize_agent(
tools=calc_tools,
llm=qv_llm,
agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True, # 打开调试模式
)

# 定义提示词
from langchain_core.prompts import ChatPromptTemplate, ChatMessagePromptTemplate

system_message_template = ChatMessagePromptTemplate.from_template(
template="你是一位{role}专家,擅长回答{domain}领域的问题",
role="system",
)

human_message_template = ChatMessagePromptTemplate.from_template(
template="用户问题:{question}",
role="user",
)

# 创建提示词模板
chat_prompt_template = ChatPromptTemplate.from_messages([
system_message_template,
human_message_template,
])

prompt = chat_prompt_template.format_messages(
role="计算",
domain="使用工具进行数学计算",
question=f"""
请阅读下面的问题,并返回一个严格的 JSON 对象,不要使用 Markdown 代码块包裹!
格式要求:
{format_instruction}

问题:
100+100=?
"""
)
# 第四步:调用智能体
response = agent.invoke(prompt)
print("--------------------------智能体输出-----------------------")
print(response)
print("--------------------------output内容-----------------------")
print(response['output'])

注意,要将工具return_direct=False