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链路追踪结果

day03_000

day03_001

day03_002

day03_003


result具体内容

day03_004

可见 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)    收藏  举报

导航