agent工作流程:

模型判断需要调用某个工具  执行工具并拿到结果  模型根据结果继续思考  可能再调用工具  直到得出最终答案。

Agent创建流程:
1. 定义工具函数

                   image   

@tool工具函数中文档字符串(函数的 """...""" 部分)非常重要。模型会读取工具的描述来决定是否调用这个工具以及传什么参数。描述越清晰,模型就越不容易用错

from dotenv import load_dotenv
load_dotenv()

from langchain.tools import tool

# @tool装饰器定义一个工具函数,函数的文档字符串就是工具的描述;模型会根据描述来判断何时调用这个工具
@tool
def get_weather(city:str)->str:
    #如下文档字符串(函数的 """...""" 部分)非常重要。模型会读取工具的描述来决定是否调用这个工具以及传什么参数。描述越清晰,模型就越不容易用错
    """查询指定城市的天气情况。
    Args:
        city:城市名称,如"杭州"、"北京"、"上海"
    """
    weather_data={
        "杭州": "晴,25°C,湿度 60%",
        "北京": "多云,18°C,湿度 45%",
        "上海": "小雨,22°C,湿度 80%",
    }
    return weather_data.get(city,f"未找到{city}的天气数据")

@tool
def calculate(expression:str)->str:
    """执行数学计算,支持加减乘除等基本运算
    Args:
        expression:数学表达式,如3+2*6/3
    """
    result = eval(expression, {"__builtins__": {}}, {})
    return f"计算结果:{expression}={result}"
@tool
def travel()
View Code

2. 创建agent并执行agent

from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
import os
from langchain_deepseek import ChatDeepSeek
from dotenv import load_dotenv

from demo.agent1.agent_tool1 import get_weather, calculate
from langchain.messages import HumanMessage

load_dotenv()

# 获取 API KEY
api_key = os.getenv("DEEPSEEK_API_KEY")
llm = ChatDeepSeek(
    api_key=api_key,
    model="deepseek-v4-flash",
    temperature=0,
    max_tokens=None,
    timeout=None,
    max_retries=2
)
agent=create_agent(
          model=llm,
          tools=[get_weather,calculate],
          system_prompt="你是一个回答很让人意外的助手,会使用工具来回答问题。",
                   )
inputs = {"messages": [HumanMessage(content="杭州今天天气怎么样?")]}
result=agent.invoke(inputs)
print("===========")
for msg in result["messages"]:
    print(f"[{msg.type}] {msg.content[:100]}")  # 截取前 100 字符

print("\n=== 最终回复 ===")
# 最后一条 AI 消息就是最终答案
print(result["messages"][-1].content)
View Code
Agent执行流程 

image

小结:

  • @tool 装饰器把 Python 函数变成工具
  • create_agent() 创建能自动调用工具的 Agent
  • agent.invoke() 运行 Agent 并获得结果

 LangChain模型调用方式

方式1:直接实例化ChatDeepSeek

from langchain_deepseek import ChatDeepSeek
from dotenv import load_dotenv

load_dotenv()

# 获取 API KEY
api_key = os.getenv("DEEPSEEK_API_KEY")
llm = ChatDeepSeek(
    api_key=api_key,
    model="deepseek-v4-flash",
    temperature=0,
    max_tokens=None,
    timeout=None,
    max_retries=2
)
View Code

 

方式2:工厂函数init_chat_model

from http.client import responses

from langchain.chat_models import init_chat_model
from dotenv import load_dotenv

# 加载当前目录 .env 文件
load_dotenv()
model=init_chat_model("deepseek:deepseek-v4-flash",temperature=0.7)
responses=model.invoke("写一首诗")
print(responses.content)
View Code

 

init_chat_model提供统一的方式连接20多种模型提供商,不需要记忆每个提供商的类名和参数差异

init_chat_model()函数语法:

from langchain.chat_models import init_chat_model

# 完整语法
model = init_chat_model(
    model,                    # str | None:模型名称(provider:model 格式)
    *,
    model_provider=None,      # str | None:单独的模型提供商
    configurable_fields=None, # None | "any" | list[str]:可运行时修改的字段
    config_prefix=None,       # str | None:配置键前缀
    **kwargs,                 # 模型特定参数(temperature、max_tokens 等)
)
View Code

image

 init_chat_model使用模式:

固定模式:

指定model,返回固定模型

from langchain.chat_models import init_chat_model

# 指定了 model,返回固定模型

model = init_chat_model("deepseek:deepseek-v4-flash", temperature=0.7)
response = model.invoke("介绍菜鸟教程 RUNOOB")
print(response.content)

 

配置模式-configurable_model:

不指定model,创建可在运行时动态切换模型

from langchain.chat_models import init_chat_model

#不指定model,返回可配置模型
#可以固定一些参数(如temperature=0.7),其余运行时指定
configurable_model=init_chat_model(temperature=0.7)

#运行时通过config指定模型
response=configurable_model.invoke(
    "写一首诗",
    config={"configurable":{"model":"deepseek-v4-flash"}}
print(response.content)
# 同一个模型实例,可以用不同的模型来执行
response = configurable_model.invoke(
    "介绍菜鸟教程 RUNOOB",
    config={"configurable": {"model": "claude-sonnet-4-5"}}
)
print(response.content)

 

可配置模型在 A/B 测试和成本优化中非常有用。你可以在不重启服务的情况下,通过修改配置来切换模型或调整参数。

常用 kwargs 参数

kwargs 参数会直接传递给底层模型类,常用的包括:

from langchain.chat_models import init_chat_model

model = init_chat_model(
    "deepseek:deepseek-v4-flash",

    # 控制输出随机性(0~2),值越小输出越稳定
    temperature=0.3,

    # 限制输出最大 token 数(控制成本)
    max_tokens=200,

    # 请求超时时间(秒)
    timeout=30,

    # 失败重试次数
    max_retries=2,

    # 自定义 API 地址(代理/中转场景)
    # base_url="https://your-proxy.com/v1",

    # 速率限制器(控制请求频率)
    # rate_limiter=MyRateLimiter(requests_per_second=5),
)

response = model.invoke("菜鸟教程 RUNOOB 是什么?")
print(response.content)
View Code

 

image

ChatDeepSeek vs init_chat_model创建mode对比

image

 

 优劣分析

ChatDeepSeek 直接实例化优势:

- 参数最全 : api_key 、 timeout 、 max_retries 、 streaming 、自定义 base_url 等供应商特有参数都能传
- 类型明确 :IDE 自动补全、类型检查友好
- 错误前置 :import 阶段就能发现依赖缺失,而非运行时

劣势

- 供应商强耦合 :换模型需改代码(import + 类名 + 参数)
- 不利于配置驱动 :模型类型硬编码在代码里

 

init_chat_model 工厂函数优势

- 供应商解耦 :模型名从配置文件/环境变量读取即可切换,如

llm = init_chat_model(os.getenv("LLM_MODEL"))

- 多供应商统一接口 :代码逻辑不变,只换字符串前缀
- 便于原型试验 :快速对比 DeepSeek / OpenAI / Anthropic 效果

劣势

- 参数受限 :只能传 LangChain 通用参数,供应商特有配置难注入(需通过 model_kwargs 或 **kwargs 间接传,类型不安全)
- 运行时才发现错误 :如未装对应集成包,运行到这一行才报错
- 抽象层有损耗 :少数高级特性可能未暴露

image

 

LangChain Chat Model常用参数

1. temperature --控制输出稳定性与随机性

取值范围0~2,控制模型输出的随机程度;temperature=0输出非常确定,几乎每次输出结果一样,temperature>=1.5每次输出结果基本都不一样

image

2. max_tokens -- 控制输出长度与成本

max_tokens限制模型输出的最大token数

3. timeout 与max_retries -- 网络可靠性

timeout:单次请求最大等待时间,None表示不限制

max_retries:失败后的重试次数,0表示不重试

image

 

LangChain Chat Model高级用法

1. bind_tools() 为模型绑定工具

 

 

2. with_structed_output() 让模型返回结构化数据

 

posted on 2026-07-21 19:10  colorfulworld  阅读(15)  评论(0)    收藏  举报