LangChain 模型模块使用详解

1. 概述

LangChain 的 Models 模块为开发者提供了与各类大型语言模型(LLM) 交互的标准化接口。LLM 能够像人类一样理解和生成文本,其能力不仅限于文本生成,还扩展至内容创作、语言翻译、摘要总结和问答等多种任务,且通常无需为每项任务进行专门训练。现代模型通常还支持以下高级功能:

  • 工具调用:调用外部工具(如数据库查询、API 请求)并在回应中使用其结果。
  • 结构化输出:将模型的输出约束为预定义的格式。
  • 多模态处理:处理和生成除文本外的图像、音频、视频等数据。
  • 推理:模型执行多步推理以得出结论。

本指南将详细阐述如何在 LangChain 中有效地初始化、配置和使用这些模型。

2. 基础用法

模型可通过两种核心方式使用:

  • 与智能体配合:在创建智能体时动态指定模型。
  • 独立使用:直接调用模型执行文本生成、分类或信息抽取等任务,无需完整的智能体框架。

2.1 初始化模型

使用 init_chat_model 函数是初始化独立模型的最简便方式。该函数支持从主流的聊天模型提供商进行初始化,例如 OpenAI、Anthropic、Google Gemini、Azure、AWS Bedrock、HuggingFace 等。

示例:初始化 OpenAI GPT-4.1 模型

python 复制代码
# 1. 安装必要的包(如果尚未安装)
# pip install -U "langchain[openai]"

# 2. 设置环境变量(推荐从安全位置加载密钥)
import os
os.environ["OPENAI_API_KEY"] = "sk-..." # 替换为你的实际 API 密钥

# 3. 导入并初始化模型
from langchain.chat_models import init_chat_model

model = init_chat_model("gpt-4.1") # 指定模型名称

init_chat_model 也支持通过 provider:model 的格式直接指定提供商和模型,例如 openai:o1。更多参数配置细节可查阅其官方文档。

2.2 支持的模型

LangChain 支持所有主流的模型提供商。每个提供商都提供了多种具备不同能力的模型。完整的支持列表请参阅 LangChain 的 Integrations 页面。

2.3 核心方法概览

模型对象主要提供以下三种调用方法,以适应不同的应用场景:

  • invoke:最基础的调用方式,接收输入并返回完整的输出消息。
  • stream:流式调用,在模型生成输出的同时实时逐块返回结果。
  • batch:批处理调用,将多个独立请求打包发送以提高处理效率和降低成本。

除了聊天模型,LangChain 还支持其他相关技术,如嵌入模型向量数据库

3. 模型参数详解

聊天模型的行为可通过一系列参数进行配置。虽然不同模型和提供商支持的参数略有差异,但以下是一些通用且重要的参数:

  • model:指定要使用的具体模型标识符。
  • api_key:提供商认证所需的密钥,通常通过环境变量设置。
  • temperature:控制输出随机性的浮点数(通常 0.0 到 2.0)。值越高,输出越具有创造性和随机性;值越低,输出越确定和一致。
  • max_tokens:限制模型响应中生成的最大令牌(token)数量,从而控制输出长度。
  • timeout:等待模型响应的最长时间(秒),超时则取消请求。
  • max_retries:当请求因网络超时、速率限制等原因失败时,系统重试的最大次数。

这些参数可以在初始化模型时通过关键字参数传入。

示例:初始化时配置参数

python 复制代码
model = init_chat_model(
    "claude-sonnet-4-5-20250929", # 指定 Anthropic 的 Claude Sonnet 模型
    # 传入模型参数
    temperature=0.7,  # 适度的创造性
    timeout=30,       # 30秒超时
    max_tokens=1000,  # 最多生成1000个token
)

注意:每个聊天模型集成可能还有提供商特定的功能参数。请查阅相应提供商的集成文档以获取完整列表。

4. 调用模型

模型必须被调用才能生成输出。针对不同场景,有三种主要的调用方式。

4.1 普通调用(Invoke)

invoke() 方法是调用模型最直接的方式,可以接收单个消息或消息列表作为输入。消息列表用于表示对话历史,每条消息都有一个 role 属性来标识对话中的发送者。

示例:使用不同的输入格式

python 复制代码
# 1. 传入单个字符串(系统会自动包装为 HumanMessage)
response = model.invoke("为什么鹦鹉的羽毛如此多彩?")
print(response)

# 2. 传入字典格式的消息列表
conversation_dict = [
    {"role": "system", "content": "你是一个将英文翻译成中文的助手。"},
    {"role": "user", "content": "Translate: I love programming."},
    {"role": "assistant", "content": "我喜欢编程。"},
    {"role": "user", "content": "Translate: Artificial Intelligence."}
]
response = model.invoke(conversation_dict)
print(response)  # 输出: AIMessage(content="人工智能。")

# 3. 传入消息对象(更规范,推荐用于复杂场景)
from langchain.messages import HumanMessage, AIMessage, SystemMessage

conversation_objects = [
    SystemMessage("你是一个将英文翻译成中文的助手。"),
    HumanMessage("Translate: I love programming."),
    AIMessage("我喜欢编程。"),
    HumanMessage("Translate: Artificial Intelligence.")
]
response = model.invoke(conversation_objects)
print(response)

重要提示 :聊天模型(如 ChatOpenAI)的 invoke() 返回的是 AIMessage 对象。请确保你使用的是聊天模型,而非传统的文本补全 LLM。

4.2 流式调用(Stream)

大多数模型支持流式输出,即在生成内容的同时逐步返回。这能显著提升长文本响应的用户体验。

基础流式调用示例

python 复制代码
# 逐块打印输出
for chunk in model.stream("为什么鹦鹉会模仿人说话?"):
    print(chunk.text, end="", flush=True) # 实时输出,不换行
  • invoke 的区别stream() 返回一个迭代器,产出多个 AIMessageChunk 对象,每个包含输出文本的一部分。
  • 组装完整消息:可以通过累加这些块来重建完整的消息。
python 复制代码
full_message = None
for chunk in model.stream("天空是什么颜色的?"):
    full_message = chunk if full_message is None else full_message + chunk
    # 可以在此处实时查看构建过程
    print(full_message.text)
# 最终,full_message 等同于 invoke 返回的结果

高级:事件流(astream_events)

astream_events() 方法可以流式传输语义事件,便于基于事件类型和元数据进行过滤,并会在后台自动聚合完整消息。

python 复制代码
import asyncio

async def track_events():
    async for event in model.astream_events("你好"):
        if event["event"] == "on_chat_model_start":
            print(f"输入内容: {event['data']['input']}")
        elif event["event"] == "on_chat_model_stream":
            print(f"生成词元: {event['data']['chunk'].text}")
        elif event["event"] == "on_chat_model_end":
            print(f"完整消息: {event['data']['output'].text}")

asyncio.run(track_events())

"自动流式"模式

在某些场景下(例如在 LangGraph 智能体的流式应用中),即使你调用了 model.invoke(),LangChain 也会自动切换到内部的流式模式,以确保整个应用的流式输出能包含模型的中间生成过程。

4.3 批量调用(Batch)

对于大量独立的请求,使用 batch() 方法进行批处理可以提升性能并降低成本。

基础批处理

python 复制代码
questions = [
    "为什么鹦鹉的羽毛色彩鲜艳?",
    "飞机是如何飞行的?",
    "什么是量子计算?"
]
responses = model.batch(questions)
for response in responses:
    print(response.content)

按完成顺序返回的批处理

batch_as_completed() 方法会在每个请求完成后立即返回结果,而不是等待整批完成。结果可能以乱序到达。

python 复制代码
for response in model.batch_as_completed(questions):
    print(response) # 每个 response 包含输入索引等信息

控制并发度

处理大量输入时,可以通过 RunnableConfig 控制最大并行调用数。

python 复制代码
model.batch(
    questions,
    config={'max_concurrency': 5} # 限制最多5个并发请求
)

5. 工具调用(Tool Calling)

工具调用功能允许模型请求执行外部工具(如查询数据库、搜索网络或运行代码),并将结果整合到其响应中。工具由两部分组成:

  1. 模式定义:包含工具名称、描述和参数定义(通常为 JSON 模式)。
  2. 执行函数:实际执行任务的函数或可调用对象。

工具调用流程

  1. 用户向模型提问。
  2. 模型判断是否需要调用工具,并生成工具调用请求。
  3. 系统执行工具。
  4. 将工具执行结果返回给模型。
  5. 模型结合结果生成最终回答。

5.1 基础使用

首先需要将用户定义的工具"绑定"到模型上,模型才能在后续调用中根据需要选择使用它们。

python 复制代码
from langchain.tools import tool

# 1. 定义一个工具(使用装饰器)
@tool
def get_weather(location: str) -> str:
    """获取指定地点的天气情况。"""
    # 这里应该是真实的 API 调用,此处为示例
    return f"{location} 的天气是晴朗的,22°C。"

# 2. 将工具绑定到模型
model_with_tools = model.bind_tools([get_weather])

# 3. 调用模型
response = model_with_tools.invoke("波士顿天气怎么样?")

# 4. 查看模型是否请求调用工具
if response.tool_calls:
    for tool_call in response.tool_calls:
        print(f"请求调用工具: {tool_call['name']}")
        print(f"传入参数: {tool_call['args']}")

注意 :某些模型提供商支持强制工具调用模式,可以通过模型或调用参数启用。

5.2 工具执行循环

当模型返回工具调用请求时,你需要手动执行工具并将结果传回模型,形成一个完整的对话循环。LangChain 的智能体抽象层会自动处理这个流程,但在独立使用模型时,可以按以下方式操作:

python 复制代码
# 绑定工具
model_with_tools = model.bind_tools([get_weather])

# 初始化对话历史
messages = [{"role": "user", "content": "波士顿和纽约的天气分别怎么样?"}]

# 第一步:模型生成请求,其中可能包含工具调用
ai_msg = model_with_tools.invoke(messages)
messages.append(ai_msg)

# 第二步:执行所有被请求的工具,并收集结果
for tool_call in ai_msg.tool_calls:
    # 根据 tool_call 中的信息执行对应工具
    tool_result = get_weather.invoke(tool_call["args"])
    # 将结果作为 ToolMessage 加入历史
    messages.append(tool_result)

# 第三步:将工具执行结果传回模型,生成最终响应
final_response = model_with_tools.invoke(messages)
print(final_response.text)

每个 ToolMessage 都包含一个 tool_call_id,用于与原始的调用请求匹配,帮助模型关联结果。

通过掌握上述内容,你应该能够在 LangChain 框架中有效地集成和利用各类大型语言模型,构建功能丰富的 AI 应用。对于更高级的主题(如结构化输出、多模态处理)和特定提供商的细节,建议深入查阅 LangChain 官方文档和相应的集成页面。

相关推荐
屋檐上的大修勾17 小时前
AI算力开放-yolov8适配 mmyolo大疆无人机
开发语言·python
郑州光合科技余经理17 小时前
开发实战:海外版同城o2o生活服务平台核心模块设计
开发语言·git·python·架构·uni-app·生活·智慧城市
Kratzdisteln17 小时前
【Python】Flask 2
开发语言·python·flask
Psycho_MrZhang17 小时前
Django/Flask/FastAPI简要对比分析
django·flask·fastapi
程序员三藏17 小时前
单元测试详解
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·测试用例
田井中律.17 小时前
AI大模型之Agent,RAG,LangChain(二)
langchain
540_54017 小时前
ADVANCE Day44
人工智能·python·深度学习
好好学操作系统17 小时前
flash_attn ImportError undefined symbol:
开发语言·python
CCPC不拿奖不改名17 小时前
面向对象编程:继承与多态+面试习题
开发语言·数据结构·python·学习·面试·职场和发展