返回首目录更多内容

Part 2: Models(模型)

2.1 模型类型概览

LangChain 支持多种类型的模型,它们之间有明确的继承和分类关系:

BaseLanguageModel
(基础语言模型接口)

BaseLLM
(传统语言模型)

BaseChatModel
(聊天模型)

Embeddings
(嵌入模型)

OpenAI
(text-davinci-003)

HuggingFace
Pipeline

ChatOpenAI
(GPT-4o/GPT-4o-mini)

ChatAnthropic
(Claude 3.5)

ChatGoogleGenerativeAI
(Gemini)

ChatOllama
(Llama 3)

OpenAIEmbeddings

HuggingFaceEmbeddings

OllamaEmbeddings

Chat Models vs LLMs 对比
特性 Chat Models(聊天模型) LLMs(传统语言模型)
输入格式 消息列表(System/Human/AI) 纯文本字符串
输出格式 AIMessage 对象 纯文本字符串
适用场景 对话、多轮交互、指令遵循 文本补全、续写
代表模型 GPT-4o, Claude 3.5, Gemini text-davinci-003(已停用)
推荐程度 推荐使用 不推荐(已过时)
上下文管理 内置消息角色区分 需要手动管理

重要建议:在新项目中,始终优先使用 Chat Models。LLMs 接口已基本被淘汰。


2.2 Chat Models(聊天模型)

概念解释

Chat Models 是 LangChain 中最常用的模型类型。它模拟"聊天"的形式,通过不同角色的消息来与 LLM 交互。

类比理解

  • System Message(系统消息)= 老板给的工作指令:“你是一个翻译专家”
  • Human Message(用户消息)= 客户的需求:“请把这段话翻译成英文”
  • AI Message(AI 消息)= 你的回复:“Here is the translation…”
所有初始化参数

ChatOpenAI 为例:

参数名 类型 默认值 说明
model str "gpt-4o-mini" 模型名称
temperature float 0.7 控制随机性。0 = 确定性,2 = 最随机
max_tokens int None 单次回复的最大 Token 数量
timeout float None API 请求超时时间(秒)
max_retries int 2 失败后的最大重试次数
api_key str None OpenAI API 密钥
base_url str None 自定义 API 端点
streaming bool False 是否使用流式传输
seed int None 随机种子(可复现输出)
top_p float 1.0 核采样参数
frequency_penalty float 0.0 频率惩罚(-2.0 到 2.0)
presence_penalty float 0.0 存在惩罚(-2.0 到 2.0)
n int 1 生成回复数量
stop list[str] None 停止序列
所有调用方法
1. invoke – 同步单次调用
# demo_invoke.py
from dotenv import load_dotenv
load_dotenv()

from langchain_openai import ChatOpenAI

model = ChatOpenAI(
    model="gpt-4o-mini",
    temperature=0.7,
    max_tokens=1024,
)

# 方式一:直接传入字符串
result = model.invoke("用一句话解释什么是量子计算")
print(f"结果: {result.content}")
print(f"消息类型: {type(result)}")  # AIMessage

# 方式二:传入消息列表
from langchain_core.messages import HumanMessage, SystemMessage

messages = [
    SystemMessage(content="你是一个物理学教授"),
    HumanMessage(content="用一句话解释什么是量子计算"),
]
result = model.invoke(messages)
print(f"结果: {result.content}")

# AIMessage 对象的常用属性
print(f"content: {result.content}")
print(f"response_metadata: {result.response_metadata}")
print(f"id: {result.id}")
print(f"usage_metadata: {result.usage_metadata}")
2. batch – 同步批量调用
# demo_batch.py
from dotenv import load_dotenv
load_dotenv()

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage

model = ChatOpenAI(model="gpt-4o-mini", temperature=0.7)

requests = [
    "用一句话解释什么是机器学习",
    "用一句话解释什么是深度学习",
    "用一句话解释什么是自然语言处理",
]

results = model.batch(requests)

for i, result in enumerate(results):
    print(f"问题 {i+1}: {requests[i]}")
    print(f"回答: {result.content}\n")
3. stream – 同步流式调用
# demo_stream.py
from dotenv import load_dotenv
load_dotenv()

from langchain_openai import ChatOpenAI

model = ChatOpenAI(model="gpt-4o-mini", temperature=0.7)

print("模型回答(流式输出):")
for chunk in model.stream("请写一首关于春天的四行诗"):
    print(chunk.content, end="", flush=True)
print()
4. ainvoke – 异步单次调用
# demo_ainvoke.py
import asyncio
from dotenv import load_dotenv
load_dotenv()

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage

model = ChatOpenAI(model="gpt-4o-mini", temperature=0.7)

async def main():
    # 并发调用多个请求
    tasks = [
        model.ainvoke("什么是 Python?"),
        model.ainvoke("什么是 JavaScript?"),
        model.ainvoke("什么是 Rust?"),
    ]
    results = await asyncio.gather(*tasks)
    for i, result in enumerate(results):
        print(f"结果 {i+1}: {result.content}\n")

asyncio.run(main())
5. abatch – 异步批量调用
# demo_abatch.py
import asyncio
from dotenv import load_dotenv
load_dotenv()

from langchain_openai import ChatOpenAI

model = ChatOpenAI(model="gpt-4o-mini", temperature=0.7)

async def main():
    requests = [
        "解释什么是 REST API",
        "解释什么是 GraphQL",
        "解释什么是 gRPC",
    ]
    results = await model.abatch(requests)
    for i, result in enumerate(results):
        print(f"问题 {i+1}: {requests[i]}")
        print(f"回答: {result.content}\n")

asyncio.run(main())
6. astream – 异步流式调用
# demo_astream.py
import asyncio
from dotenv import load_dotenv
load_dotenv()

from langchain_openai import ChatOpenAI

model = ChatOpenAI(model="gpt-4o-mini", temperature=0.7)

async def main():
    print("异步流式输出:")
    async for chunk in model.astream("请写一首关于秋天的四行诗"):
        print(chunk.content, end="", flush=True)
    print()

asyncio.run(main())
消息类型详解

BaseMessage
(基础消息)

SystemMessage
系统消息
设定 AI 角色

HumanMessage
用户消息
用户发送的内容

AIMessage
AI 消息
AI 的回复

ToolMessage
工具消息
工具调用结果

# demo_message_types.py
from dotenv import load_dotenv
load_dotenv()

from langchain_openai import ChatOpenAI
from langchain_core.messages import (
    SystemMessage, HumanMessage, AIMessage,
    ToolMessage, AIMessageChunk,
)

model = ChatOpenAI(model="gpt-4o-mini", temperature=0.7)

# SystemMessage:设定 AI 角色
system_msg = SystemMessage(content="你是一位资深 Python 开发工程师。")

# HumanMessage:用户输入
human_msg = HumanMessage(content="请解释装饰器是什么?")

# AIMessage:AI 回复(常用于对话历史)
ai_msg = AIMessage(content="装饰器是 Python 中的一种设计模式...")

# 组合使用:多轮对话
conversation = [
    SystemMessage(content="你是一个翻译助手,只做翻译。"),
    HumanMessage(content="翻译成英文:今天天气真好"),
    AIMessage(content="The weather is really nice today."),
    HumanMessage(content="翻译成英文:我想学习编程"),
]
result = model.invoke(conversation)
print(f"翻译结果: {result.content}")

# ToolMessage:工具调用结果(Agent 场景使用)
tool_msg = ToolMessage(
    content='{"temperature": 25, "weather": "sunny"}',
    tool_call_id="call_abc123",
    name="weather_tool",
)

# AIMessageChunk:流式消息块
chunk1 = AIMessageChunk(content="你好")
chunk2 = AIMessageChunk(content=",")
chunk3 = AIMessageChunk(content="世界!")
full_message = chunk1 + chunk2 + chunk3
print(f"合并后: {full_message.content}")  # "你好,世界!"
多轮对话 Demo
# demo_multi_turn.py
from dotenv import load_dotenv
load_dotenv()

from langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage

model = ChatOpenAI(model="gpt-4o-mini", temperature=0.7)

messages = [SystemMessage(content="你是一个友好的中文老师。")]

# 第一轮
messages.append(HumanMessage(content="你好,我想学中文。"))
response = model.invoke(messages)
print(f"AI: {response.content}")
messages.append(response)

# 第二轮
messages.append(HumanMessage(content="'苹果'用中文怎么说?"))
response = model.invoke(messages)
print(f"AI: {response.content}")
messages.append(response)

# 第三轮(AI 能记住上下文)
messages.append(HumanMessage(content="我刚才问了什么?"))
response = model.invoke(messages)
print(f"AI: {response.content}")
配置运行时参数 Demo
# demo_runtime_config.py
from dotenv import load_dotenv
load_dotenv()

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage

model = ChatOpenAI(model="gpt-4o-mini", temperature=0.7)

# bind:临时绑定参数(不修改原始模型)
creative_model = model.bind(temperature=1.5)
precise_model = model.bind(temperature=0.0)

result1 = model.invoke("描述未来城市")
result2 = creative_model.invoke("描述未来城市")
result3 = precise_model.invoke("描述未来城市")

# bind_tools:绑定工具
tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "获取天气信息",
        "parameters": {
            "type": "object",
            "properties": {"city": {"type": "string", "description": "城市名称"}},
            "required": ["city"],
        },
    },
}]
model_with_tools = model.bind_tools(tools)
result = model_with_tools.invoke("北京今天天气怎么样?")
print(f"工具调用: {result.tool_calls}")

2.3 LLMs(传统语言模型)

重要:LLMs 接口已不再推荐使用。所有新项目请使用 Chat Models。

# 在 LangChain 1.x 中,ChatOpenAI 也能接受字符串输入
from dotenv import load_dotenv
load_dotenv()
from langchain_openai import ChatOpenAI

chat_model = ChatOpenAI(model="gpt-4o-mini")
result = chat_model.invoke("用一句话解释什么是 Python")
print(result.content)

2.4 多模型支持

init_chat_model 统一接口
# demo_init_chat_model.py
from dotenv import load_dotenv
load_dotenv()

from langchain.chat_models import init_chat_model

# 通过字符串指定模型提供商和名称
model = init_chat_model("gpt-4o-mini", model_provider="openai", temperature=0.7)
result = model.invoke("你好")
print(f"OpenAI: {result.content}")

# 动态切换模型
import os
provider = os.getenv("MODEL_PROVIDER", "openai")
model_name = os.getenv("MODEL_NAME", "gpt-4o-mini")
model = init_chat_model(model_name, model_provider=provider, temperature=0.7)
各提供商对比表格
提供商 模型名称 安装命令 特点
OpenAI GPT-4o, GPT-4o-mini pip install langchain-openai 最成熟,生态最好
Anthropic Claude 3.5 Sonnet pip install langchain-anthropic 安全性好,长文本能力强
Google Gemini Pro pip install langchain-google-genai 多模态,Google 生态
Ollama Llama 3, Mistral pip install langchain-ollama 本地运行,免费,隐私

2.5 嵌入模型(Embeddings)

概念解释

嵌入(Embedding)是将文本转换为高维向量的技术。语义相似的文本,其向量也相似。

类比:想象一个"语义地图","猫"和"狗"距离很近(都是宠物),"猫"和"汽车"距离很远。

# demo_embeddings.py
from dotenv import load_dotenv
load_dotenv()

from langchain_openai import OpenAIEmbeddings
import numpy as np

embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

# 嵌入单个文本
vector = embeddings.embed_query("LangChain 是一个强大的 AI 框架")
print(f"向量维度: {len(vector)}")  # 1536
print(f"前5个值: {vector[:5]}")

# 嵌入多个文本
vectors = embeddings.embed_documents(["我喜欢吃苹果", "今天天气很好"])
print(f"嵌入了 {len(vectors)} 个文本")

# 计算文本相似度
def cosine_similarity(vec1, vec2):
    return np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))

vec_a = embeddings.embed_query("猫是一种可爱的宠物")
vec_b = embeddings.embed_query("狗是人类的好朋友")
vec_c = embeddings.embed_query("量子力学是物理学分支")

print(f"猫 vs 狗: {cosine_similarity(vec_a, vec_b):.4f}")  # 较高
print(f"猫 vs 量子: {cosine_similarity(vec_a, vec_c):.4f}")  # 较低

# 自定义维度(text-embedding-3 系列支持)
small_emb = OpenAIEmbeddings(model="text-embedding-3-small", dimensions=512)
vec = small_emb.embed_query("测试")
print(f"自定义维度: {len(vec)}")  # 512
嵌入使用场景
场景 说明
语义搜索 根据含义搜索,非关键词匹配
文档问答(RAG) 找到最相关的文档片段
文本聚类 将语义相似的文本分组
推荐系统 推荐与用户兴趣相似的内容

2.6 模型最佳实践

模型选择建议
场景 推荐模型 原因
简单对话/分类 GPT-4o-mini 便宜、快速
复杂推理/分析 GPT-4o / Claude 3.5 推理能力强
长文本处理 Claude 3.5 200K 上下文
代码生成 GPT-4o 代码能力最强
本地部署/隐私 Ollama (Llama 3) 免费、不出本地
成本控制
# best_practices_cost_control.py
from dotenv import load_dotenv
load_dotenv()
from langchain_openai import ChatOpenAI
from langchain_core.caches import InMemoryCache
from langchain.globals import set_llm_cache

# 策略一:使用更便宜的模型
cheap_model = ChatOpenAI(model="gpt-4o-mini")

# 策略二:限制输出长度
model = ChatOpenAI(model="gpt-4o-mini", max_tokens=500)

# 策略三:缓存重复请求
set_llm_cache(InMemoryCache())
model = ChatOpenAI(model="gpt-4o-mini")
result1 = model.invoke("什么是 Python?")  # 调用 API
result2 = model.invoke("什么是 Python?")  # 从缓存读取

# 策略四:监控 Token 用量
result = model.invoke("写一首短诗")
if hasattr(result, "usage_metadata"):
    usage = result.usage_metadata
    print(f"输入 Tokens: {usage.get('input_tokens')}")
    print(f"输出 Tokens: {usage.get('output_tokens')}")
错误处理
# best_practices_error_handling.py
import time
from dotenv import load_dotenv
load_dotenv()
from langchain_openai import ChatOpenAI

def safe_invoke(model, prompt: str, max_retries: int = 3) -> str:
    for attempt in range(max_retries):
        try:
            result = model.invoke(prompt)
            return result.content
        except Exception as e:
            print(f"第 {attempt + 1} 次失败: {e}")
            if attempt < max_retries - 1:
                time.sleep(2 ** attempt)  # 指数退避
            else:
                raise
    return ""

model = ChatOpenAI(model="gpt-4o-mini", max_retries=3, timeout=30)
result = safe_invoke(model, "你好")
print(result)


---





## 
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐