LangChain学习笔记day03
LangChain学习笔记day03
1. Agent
引言:什么是Agent
在传统 LangChain 中,流程由开发者预先定义(如:用户 → Prompt → LLM → 输出),而 Agent 可以根据用户输入,动态决定下一步应该调用什么工具或执行什么操作,不断循环调用工具直到任务完成。如:
用户 → LLM →(决定下一步做什么)
↓
Tool / Function / Search / DB
↓
返回结果
↓
循环直到完成
① Agent = 模型(model) + 执行框架(harness)
执行框架(harness)的作用:在正确的时间,为当前任务向模型提供正确的上下文。
这个执行框架包含模型本身、提示词、工具,以及任何用于塑造其行为的中间层。
② Agent ≠ LLM
LLM 负责思考和决策,Agent 负责组织 LLM、工具、记忆、上下文等组件完成任务。
(1) 配置环境
安装langchain langchain-openai langchain-tavily依赖
uv add langchain langchain-openai langchain-tavily tavily-python
- Tavily:为大模型和 AI 智能体提供实时 Web 搜索能力,通过统一的 API 提供搜索、内容抽取和网页爬取等功能。
- langchain-tavily:LangChain 提供的 Tavily 搜索工具的封装接口
- tavily-python:原始 tavily sdk
(2) 导入组件
from dotenv import load_dotenv
load_dotenv()
from langchain.agents import create_agent
from langchain.tools import tool
from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI
- langchain.agents.create_agent:用于把「模型 + 工具 + 规则」组装成可以自动决策的 Agent
- langchain.tools.tool:用于把 Python 函数变成 LLM 可以调用的 API
- langchain_core.messages.HumanMessage:用于将自然语言封装为模型可理解的结构,即“来自用户的消息”,以此构造聊天上下文
(3) 实现一个简单Agent
@tool
def search(query: str) -> str:
"""
Tool that searches over internet
Args:
query: The query to search for
Returns:
The search result
"""
print(f"Searching for {query}")
return "北京现在是雨天"
apiLLM = ChatOpenAI(
# model="deepseek-v4-flash",
model="deepseek-v4-pro",
temperature=0,
max_tokens=None,
timeout=None,
max_retries=2,
base_url="https://api.deepseek.com",
# api_key="...",
# organization="...",
# other params...
)
tools = [search]
agent = create_agent(model=apiLLM, tools=tools)
def main():
print("Here is Lesson02_ReActAgent")
result = agent.invoke({"messages": HumanMessage(content="北京天气怎么样?")})
print(result)
- @tool :把“普通 Python 函数”转换成“LLM 可以调用的工具”。
⭐tool的编写规范
1). 必须是“清晰函数签名”
- 参数必须有类型标注(str / int 等)
- 返回值要清晰(一般 str 或 dict)
- 参数越少越好(更容易被 LLM 调用)
示例
@tool
def search(query: str) -> str:
2). 必须写“易于理解的description”
description 是 LLM “理解”工具用途的核心依据
LLM 实际上是通过:
- 函数名
- description
- 参数描述
来判断“什么时候该用这个工具”
示例
"""
Tool that searches over internet
Args:
query: The query to search for
Returns:
The search result
"""
3). 工具应尽量遵循单一职责原则(Single Responsibility Principle),具有明确输入、明确输出和良好的可预测性。
4). tool创建后需要传递给agent才会被agent使用
示例
tools = [tool1, tool2, tool3]
agent = create_agent(model=apiLLM, tools=tools)
⭐LangChain使用tool的流程
1). 读取函数结构(反射)
LangChain 会获取:
函数名:search
参数:query: str
返回:str
描述:description
等信息
2). 封装 Tool 对象
内部会变成类似:
Tool(
name="search",
description="Tool that searches over internet",
args_schema={"query": "string"},
...
)
3). 注册进 Agent
tools = [search]
Agent 会维护一个 tool registry:
Agent可用工具列表:
- search
4). LLM 调用决策
当用户输入:
北京天气怎么样?
LLM 会判断:
“这个问题需要 search 工具”
然后输出类似结构:
{
"tool": "search",
"input": "北京天气"
}
5). 执行工具
LangChain runtime:
search("北京天气")
6). Tool 执行结果被包装为 ToolMessage
ToolMessage(
content="北京现在是雨天"
...
)
随后 ToolMessage 会加入上下文,再交由 LLM 继续推理。
⭐Agent层面的工作流程
1). 初始输入
用户输入 → 传入 LLM
2). 判断是否需要工具
LLM 根据用户问题、预设prompt、tools 描述等信息,判断是否需要调用工具
3). 调用工具(Tool Call)
如果需要,LLM 将生成 tool call
例如:
{
"tool": "search",
"args": {
"query": "北京天气"
}
}
4). 执行工具
Agent runtime 执行 Python 函数:
search("北京天气")
返回结果:
北京:晴,28℃
5). 将工具结果追加进上下文
工具返回结果不会直接输出,而是加入“对话历史”
User Input
Tool Call
Tool Result
6). LLM 基于新增上下文再次决策
LLM 基于用户问题、工具调用结果等上下文信息,再次判断是否需要继续调用工具
7). 重复 Agent Loop
LLM重复“思考 → 调工具 → 获取结果 → 再思考”,直到认为任务完成。
8). 输出最终结果
(4) 实现一个能真实查询天气的Agent
1). 导入tavily组件
from tavily import TavilyClient
tavily = TavilyClient()
注意:需要在.env中配置TAVILY_API_KEY
2). 修改search函数逻辑
@tool
def search(query: str) -> dict:
"""
Tool that searches over internet
Args:
query: The query to search for
Returns:
The search result
"""
print(f"Searching for {query}")
return tavily.search(query=query, limit=3)
其中,limit=3 的意思是只返回前3条搜索结果
3). 配置日期获取工具
from datetime import date
@tool
def getDateToday() -> str:
"""
Tool that gets the real current date
Returns:
The current date
"""
print("Getting the current date")
return "今天是" + date.today().strftime("%Y年%m月%d日")
LLM 缺乏实时世界状态信息,因此无法可靠地知道运行程序时的当前日期;若任务依赖真实日期,应通过工具获取。
注意:Python函数命名规范为 snake_case 而非驼峰,get_current_date() 更符合规范
4). 在 print(result) 处添加断点,运行程序
主要代码
tavily = TavilyClient()
@tool
def search(query: str) -> dict:
"""
Tool that searches over internet
Args:
query: The query to search for
Returns:
The search result
"""
print(f"Searching for {query}")
return tavily.search(query=query, limit=3)
@tool
def getDateToday() -> str:
"""
Tool that gets the real current date
Returns:
The current date
"""
print("Getting the current date")
return "今天是" + date.today().strftime("%Y年%m月%d日")
apiLLM = ChatOpenAI(
# model="deepseek-v4-flash",
model="deepseek-v4-pro",
temperature=0,
max_tokens=None,
timeout=None,
max_retries=2,
base_url="https://api.deepseek.com",
# api_key="...",
# organization="...",
# other params...
)
tools = [search, getDateToday]
agent = create_agent(model=apiLLM, tools=tools)
def main():
print("Here is Lesson02_ReActAgent")
result = agent.invoke({"messages": HumanMessage(content="北京今天天气怎么样?")})
print(result)
LangSmith链路追踪结果




result具体内容

可见 type(result) 为一个字典,其中包括 HumanMessage、AIMessage 和 ToolMessage,也就是说:
Agent 的最终结果并不是单个 AIMessage,而是一整个消息历史。
5). LLM 最终输出
根据搜索到的气象信息,今天是 2026年6月24日(周三),北京天气情况如下:
🌤️ 北京今日天气概览
| 项目 | 详情 |
|---|---|
| 温度 | 21°C ~ 30°C |
| 天气 | 多云为主,可能有雷阵雨 ⚡🌧️ |
| 风向风力 | 西南风 2级 |
| 空气质量 | 良 |
📝 补充说明
- 中国天气网6月22日发布的预报提到:「6月24日北京有雷雨」,提醒中考考生和家长关注天气变化。
- 百度天气7日预报显示24日为多云,气温在21°C到30°C之间,体感较为舒适。
- 整体来看,今天北京不排除有雷阵雨的可能,建议出门携带雨具,以防不时之需。
如果需要了解更详细的逐小时预报或未来几天的天气趋势,可以随时再问我!
posted on 2026-06-24 01:59 AQHuiguang 阅读(4) 评论(0) 收藏 举报
浙公网安备 33010602011771号