agent工作流程:
模型判断需要调用某个工具 → 执行工具并拿到结果 → 模型根据结果继续思考 → 可能再调用工具 → 直到得出最终答案。
Agent创建流程:
1. 定义工具函数
@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()
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)
Agent执行流程

小结:
- 用 @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 )
方式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)
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 等) )

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)

ChatDeepSeek vs init_chat_model创建mode对比

优劣分析
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 间接传,类型不安全)
- 运行时才发现错误 :如未装对应集成包,运行到这一行才报错
- 抽象层有损耗 :少数高级特性可能未暴露

LangChain Chat Model常用参数
1. temperature --控制输出稳定性与随机性
取值范围0~2,控制模型输出的随机程度;temperature=0输出非常确定,几乎每次输出结果一样,temperature>=1.5每次输出结果基本都不一样

2. max_tokens -- 控制输出长度与成本
max_tokens限制模型输出的最大token数
3. timeout 与max_retries -- 网络可靠性
timeout:单次请求最大等待时间,None表示不限制
max_retries:失败后的重试次数,0表示不重试

LangChain Chat Model高级用法
1. bind_tools() 为模型绑定工具
2. with_structed_output() 让模型返回结构化数据
浙公网安备 33010602011771号