大型语言模型(LLM)是一种强大的 AI 工具,能够像人类一样理解与生成文本。它们具有高度通用性,可以用于写作、翻译、摘要和问答等任务,而无需针对每个任务进行额外的专业训练。
除了文本生成之外,许多模型还支持:
工具调用(Tool Calling) —— 能调用外部工具(例如数据库查询或 API 调用),并将结果用于生成回答。
结构化输出(Structured Output) —— 限制模型输出遵循预定义格式。
多模态能力(Multimodality) —— 处理并返回非文本数据,例如图像、音频和视频。
推理能力(Reasoning) —— 执行多步骤推理以获得结论。
模型是 Agent 的推理引擎,它驱动 Agent 的决策流程,包括决定调用哪些工具、如何解释结果,以及何时输出最终答案。
你选择的模型的质量与能力,会直接影响 Agent 的基础可靠性与性能表现。不同模型擅长不同类型的任务——有些擅长遵循复杂指令,有些擅长结构化推理,还有一些支持更大的上下文窗口以处理更多信息。
我习惯于以与 OpenAI API 兼容的形式初始化模型:
这里的几个参数为:
model:要使用的模型名称,比如 qwen3-max
temperature:控制模型输出多样性,取值范围为0-1,数值越高,模型输出越多样
base_url:模型提供商的 API 地址
api_key:访问密钥,本地部署的模型不需要这个参数
使用方式
模型可以通过两种方式使用:
独立调用 —— 直接调用模型(不通过 Agent 循环)用于文本生成、分类或信息抽取等任务,而无需 Agent 框架。
与 Agent 配合 —— 在创建 Agent 时动态指定模型。
独立调用模型非常简单,传入一个字符串即可:
我们已经知道如何将模型传入 create_agent 方法在创建Agent 时指定模型。但是我们可以在 Agent 运行时根据当前状态与上下文动态进行模型选择。这使得复杂的路由逻辑与成本优化成为可能。
若要使用动态模型,可以通过 @wrap_model_call 装饰器创建中间件,从而在请求过程中动态修改模型:
@wrap_model_call 是 LangChain 中用于定义模型调用中间件(middleware) 的装饰器,它让你能在 LLM 实际调用前后拦截并修改请求(如动态切换模型、记录日志、限流等),通过接收 ModelRequest 和 handler 参数实现灵活控制。
dynamic_model_selection 函数接收两个参数:
request: ModelRequest
ModelRequest 是一个封装了当前 LLM 调用上下文的对象。它包含了:
request.override(model=model):创建一个新请求,把模型换成 basic_model 或 advanced_model。
当前要发送给 LLM 的消息(messages)
当前使用的模型(model)
其他调用参数(如 temperature, max_tokens 等)
Agent 的当前状态(state)
handler
handler 是一个可调用对象(callable),代表 “继续执行原计划的模型调用”。handler(request.override(model=model)):用这个新请求去调用 LLM,并返回结果(ModelResponse)。
工具调用(Tool Calling)
模型可以请求调用工具,以执行例如从数据库获取数据、进行网页搜索或运行代码等任务。工具由以下两部分组成:
工具的模式定义(schema),包括工具名称、描述、参数定义(通常是 JSON Schema)
执行该工具的函数或协程(coroutine)
函数调用(function calling)与工具调用(tool calling)视为等价概念,可以互换使用。
我们可以使用 bind_tools 将工具绑定到模型。在之后的调用过程中,模型可以在需要时自行选择调用任何已绑定的工具。
值得注意的是,模型仅提出要执行某个工具,模型本身并不执行工具,工具是由应用程序执行的。
结构化输出(Structured Output)
模型可以以指定模式(schema)的格式返回结果。这对于确保输出能够被轻松解析和用于后续处理非常有用。LangChain 支持多种 schema 类型(Pydantic、TypedDict 与 JSON)与多种方式来强制或引导模型生成结构化输出。
Pydantic 模型不仅支持字段描述和嵌套结构,还具备自动数据校验能力;相比之下,TypedDict 与 JSON Schema 则需要手动进行数据验证。所以我以 Pydantic 模式为例说明。
这里我多输入了“以 JSON 格式”,那是因为以 OpenAI API 兼容形式调用阿里云提供的千问模型时,如果不在提示词中写明 JSON,那么就会产生 400 错误。

