在 LangChain 中,langchain_core.language_models
模块是核心模块之一,用于定义和管理语言模型(Language Models, LLMs)的接口和行为。它提供了语言模型的抽象基类,包括 BaseLanguageModel
、BaseChatModel
和 BaseLLM
,为聊天模型(如 ChatOpenAI
)和生成模型(如 OpenAI
)提供了统一的基础架构。这个模块的目标是标准化语言模型的交互方式,确保不同提供商的模型能够无缝集成到 LangChain 的链、代理、工具和其他组件中。
以下是对 langchain_core.language_models
模块的详细介绍,涵盖其定义、核心类、功能、使用方式、代码示例、应用场景、优化建议、注意事项以及与 LangChain 生态的结合。
1. 什么是 langchain_core.language_models
?
langchain_core.language_models
模块是 LangChain 核心库的一部分,提供了语言模型的抽象接口和实现,用于处理文本生成、对话、工具调用等任务。它包含以下主要内容:
- 抽象基类:定义了
BaseLanguageModel
、BaseChatModel
和BaseLLM
,为所有语言模型提供通用接口。 - 具体实现:子类(如
ChatOpenAI
、ChatAnthropic
)继承这些基类,适配特定提供商的模型。 - 辅助工具:支持工具调用、结构化输出、流式生成等功能。
核心目标:
- 提供统一的 API,屏蔽不同模型提供商的实现细节。
- 支持多样化的交互模式,如对话、生成、工具调用和多模态输入。
- 确保与 LangChain 生态(提示模板、代理、记忆等)的无缝集成。
主要用途:
- 初始化和管理语言模型。
- 处理消息或文本输入,生成响应。
- 支持复杂工作流,如代理驱动的工具调用或 RAG(检索增强生成)。
2. 核心类与功能
langchain_core.language_models
模块包含以下核心类,每个类都有特定的功能和用途:
(1) BaseLanguageModel
- 定义:所有语言模型的顶级抽象基类,定义了通用接口。
- 功能:
- 提供同步和异步调用方法(
invoke
、ainvoke
)。 - 支持流式生成(
stream
、astream
)。 - 支持批量处理(
batch
、abatch
)。 - 定义了生成和解析输出的基本逻辑。
- 提供同步和异步调用方法(
- 主要方法:
方法 描述 输入 输出 invoke
同步调用模型 Any
,RunnableConfig
Any
ainvoke
异步调用 Any
,RunnableConfig
Awaitable[Any]
stream
同步流式生成 Any
,RunnableConfig
Iterator[Any]
astream
异步流式生成 Any
,RunnableConfig
AsyncIterator[Any]
batch
批量处理 List[Any]
,RunnableConfig
List[Any]
abatch
异步批量处理 List[Any]
,RunnableConfig
Awaitable[List[Any]]
- 子类:
BaseChatModel
和BaseLLM
。
(2) BaseChatModel
- 定义:专门为聊天模型设计的抽象基类,继承自
BaseLanguageModel
。 - 功能:
- 处理基于消息的交互(
List[BaseMessage]
,如HumanMessage
、AIMessage
)。 - 支持工具调用(
bind_tools
、tool_calls
)。 - 支持结构化输出(
with_structured_output
)。 - 支持多模态输入(文本+图像,取决于模型实现)。
- 处理基于消息的交互(
- 主要方法(扩展自
BaseLanguageModel
):方法 描述 输入 输出 bind_tools
绑定工具到模型 List[Union[Tool, dict]]
BaseChatModel
with_structured_output
配置结构化输出 Union[Type, dict]
BaseChatModel
- 子类示例:
ChatOpenAI
(OpenAI,e.g., GPT-4o)ChatAnthropic
(Anthropic,e.g., Claude)ChatMistralAI
(Mistral,e.g., Mixtral)
- 适用场景:多轮对话、工具调用、聊天机器人、RAG。
(3) BaseLLM
- 定义:为传统生成模型(非聊天模型)设计的抽象基类,继承自
BaseLanguageModel
。 - 功能:
- 处理纯文本输入和输出(
str
→str
)。 - 适合简单生成任务,不支持消息或工具调用。
- 提供基本的生成逻辑,较少用于现代对话场景。
- 处理纯文本输入和输出(
- 主要方法:与
BaseLanguageModel
类似,但输入输出为字符串。 - 子类示例:
OpenAI
(OpenAI 的旧版模型,如text-davinci-003
)HuggingFaceHub
(HuggingFace 模型)
- 适用场景:文本生成、摘要、翻译(较老旧的模型)。
(4) 其他类
SimpleChatModel
:- 一个轻量级基类,继承自
BaseChatModel
,用于快速实现简单的聊天模型(常用于测试或自定义模型)。 - 开发者只需实现
_call
方法。
- 一个轻量级基类,继承自
ChatGeneration
和ChatGenerationChunk
:- 用于表示模型生成的完整响应或流式生成的分块。
- 包含
message
(如AIMessage
)和元数据。
ChatResult
:- 封装模型的生成结果,包含
generations
(List[ChatGeneration]
)和其他信息。
- 封装模型的生成结果,包含
功能总结
- 消息处理:
BaseChatModel
处理结构化消息,支持多轮对话。 - 工具调用:支持模型生成工具调用请求并解析结果。
- 流式生成:支持实时输出,适合交互式应用。
- 异步支持:提供异步方法,优化高并发场景。
- 结构化输出:生成 JSON 或 Pydantic 模型格式的输出。
- 多模态:支持文本+图像输入(依赖模型实现)。
- 可扩展性:允许开发者继承基类实现自定义模型。
4. 使用方式与代码示例
(1) 使用 BaseChatModel
(以 ChatOpenAI
为例)
基本对话示例:
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
# 初始化聊天模型
llm = ChatOpenAI(model="gpt-4o", api_key="your-openai-key", temperature=0.7)
# 创建消息
messages = [
SystemMessage(content="你是一个量子计算专家,回答要简洁。"),
HumanMessage(content="量子计算是什么?")
]
# 调用模型
response = llm.invoke(messages)
print(response.content)
输出:
量子计算是一种基于量子力学原理的计算范式,使用量子比特进行计算。
(2) 工具调用
绑定工具并处理工具调用:
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain_core.messages import HumanMessage, AIMessage, ToolMessage
# 定义工具
@tool
def calculator(expression: str) -> str:
"""执行数学计算"""
return str(eval(expression))
# 初始化模型并绑定工具
llm = ChatOpenAI(model="gpt-4o", api_key="your-openai-key").bind_tools([calculator])
# 创建消息
messages = [HumanMessage(content="计算 5 + 3")]
# 调用模型
response = llm.invoke(messages)
# 处理工具调用
if response.tool_calls:
tool_call = response.tool_calls[0]
tool_result = calculator.invoke(tool_call["args"])
messages.extend([
AIMessage(content="", tool_calls=[tool_call]),
ToolMessage(content=tool_result, tool_call_id=tool_call["id"])
])
# 继续对话
final_response = llm.invoke(messages)
print(final_response.content)
输出:
计算结果为 8。
(3) 流式生成
实时显示生成内容:
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
# 初始化模型
llm = ChatOpenAI(model="gpt-4o", api_key="your-openai-key", streaming=True)
# 创建消息
messages = [HumanMessage(content="解释量子计算")]
# 流式输出
for chunk in llm.stream(messages):
print(chunk.content, end="", flush=True)
输出(逐块显示):
量子计算是一种基于量子力学原理的计算范式,使用量子比特(qubits)进行计算...
(4) 异步调用
处理高并发:
import asyncio
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
# 初始化模型
llm = ChatOpenAI(model="gpt-4o", api_key="your-openai-key")
# 创建消息
messages = [HumanMessage(content="量子计算是什么?")]
# 异步调用
async def main():
response = await llm.ainvoke(messages)
print(response.content)
asyncio.run(main())
输出:
量子计算是一种基于量子力学原理的计算范式。
(5) 结构化输出
生成 JSON 格式输出:
from langchain_openai import ChatOpenAI
from pydantic import BaseModel
from langchain_core.messages import HumanMessage
# 定义输出结构
class Answer(BaseModel):
question: str
answer: str
confidence: float
# 初始化模型
llm = ChatOpenAI(model="gpt-4o", api_key="your-openai-key")
# 配置结构化输出
structured_llm = llm.with_structured_output(Answer)
# 创建消息
messages = [HumanMessage(content="量子计算是什么?")]
# 调用模型
response = structured_llm.invoke(messages)
print(response)
输出:
Answer(question="量子计算是什么?", answer="量子计算是一种基于量子力学原理的计算范式。", confidence=0.95)
(6) 使用 BaseLLM
(以 OpenAI
为例)
处理纯文本生成:
from langchain_openai import OpenAI
# 初始化生成模型
llm = OpenAI(model="text-davinci-003", api_key="your-openai-key", temperature=0.7)
# 调用模型
response = llm.invoke("量子计算是什么?")
print(response)
输出:
量子计算是一种利用量子力学原理进行信息处理的计算方式。
(7) 自定义聊天模型
继承 SimpleChatModel
实现简单模型:
from langchain_core.language_models import SimpleChatModel
from langchain_core.messages import HumanMessage, AIMessage
# 自定义聊天模型
class MyChatModel(SimpleChatModel):
def _call(self, messages, **kwargs):
return f"收到消息:{messages[-1].content}"
# 初始化模型
llm = MyChatModel()
# 调用模型
response = llm.invoke([HumanMessage(content="量子计算是什么?")])
print(response.content)
输出:
收到消息:量子计算是什么?
5. 应用场景
langchain_core.language_models
模块适用于以下场景:
- 多轮对话:
- 构建聊天机器人,处理连续对话。
- 示例:回答“量子计算是什么?”和“它有什么应用?”。
- 工具调用:
- 实现代理或链的工具交互。
- 示例:代理调用搜索或计算工具。
- 结构化输出:
- 生成 JSON 或 Pydantic 模型格式的数据。
- 示例:从文本提取实体或分类结果。
- RAG 应用:
- 结合检索器提供上下文,生成准确回答。
- 示例:结合 Tavily 搜索回答最新问题。
- 多模态交互:
- 处理文本+图像的对话。
- 示例:描述图片中的量子计算机。
- 流式应用:
- 实时显示生成内容,适合交互式 UI。
- 示例:逐字显示长回答。
- 文本生成:
- 使用
BaseLLM
进行摘要、翻译等任务。 - 示例:生成文章摘要。
- 使用
6. 优化建议
(1) 提高性能
- 缓存结果:
- 使用 LangChain 的缓存机制存储常见查询。
from langchain.globals import set_llm_cache from langchain.cache import SQLiteCache set_llm_cache(SQLiteCache(database_path="cache.db"))
- 异步调用:
- 使用
ainvoke
或astream
支持高并发。
response = await llm.ainvoke(messages)
- 使用
- 批量处理:
- 批量执行多组输入。
results = llm.batch([messages1, messages2])
(2) 提高可靠性
- 工具调用验证:
- 检查
tool_calls
是否有效。
if not response.tool_calls: print("无工具调用") return response.content
- 检查
- 结构化输出验证:
- 使用 Pydantic 确保输出格式正确。
structured_llm = llm.with_structured_output(Answer)
- 错误处理:
- 捕获 API 错误或超时。
try: response = llm.invoke(messages) except Exception as e: print(f"模型调用失败:{e}")
(3) 监控与调试
- 回调:
- 使用回调记录模型调用。
from langchain_core.callbacks import BaseCallbackHandler class ModelCallback(BaseCallbackHandler): def on_chat_model_start(self, serialized, messages, **kwargs): print(f"输入消息:{messages}") config = {"callbacks": [ModelCallback()]}
- LangSmith:
- 分析模型性能和调用轨迹。
from langsmith import Client config = {"callbacks": [Client(api_key="your-langsmith-key")]}
(4) 配置优化
- 动态配置:
- 使用
RunnableConfig
传递参数。
config = {"max_tokens": 500, "temperature": 0.5} response = llm.invoke(messages, config=config)
- 使用
- 环境变量:
- 使用环境变量管理 API 密钥。
from dotenv import load_dotenv load_dotenv()
(5) 模型选择
- 选择合适模型:
- 根据任务选择支持工具调用或多模态的模型(如 GPT-4o)。
- 示例:Claude 适合长上下文,Mistral 适合成本敏感任务。
- 回退机制:
- 配置回退模型。
from langchain_core.runnables import RunnableWithFallbacks llm_with_fallback = llm.with_fallbacks([ChatMistralAI(model="mistral-large-latest")])
7. 注意事项
- 抽象基类:
BaseLanguageModel
、BaseChatModel
和BaseLLM
不可直接实例化,需使用子类。
- 模型支持:
- 工具调用和多模态功能依赖具体模型实现。
- 示例:GPT-4o 支持工具调用,某些开源模型可能不支持。
- API 密钥安全:
- 使用环境 variables 存储密钥,避免硬编码。
os.environ["OPENAI_API_KEY"] = "your-key"
- Token 限制:
- 长消息或对话历史可能超过模型的 token 限制。
- 使用
ConversationSummaryMemory
压缩历史。
- 性能:
- 流式生成和异步调用可降低延迟。
- 批量处理适合高吞吐量场景.
- 成本:
- 不同模型的 token 费用差异大,监控 API 使用量。
- 示例:Mistral 模型通常比 GPT-4 便宜。
- 版本兼容性:
- 确保使用最新版本的 LangChain(>=0.3.x),以支持最新功能。
8. 与 LangChain 生态的结合
- 消息(Messages):
- 使用
langchain_core.messages
的消息类(如HumanMessage
)。
messages = [HumanMessage(content="Hi")]
- 使用
- 提示模板(Prompt Templates):
- 结合
ChatPromptTemplate
管理对话。
from langchain_core.prompts import ChatPromptTemplate prompt = ChatPromptTemplate.from_messages([("human", "{input}")]) chain = prompt | llm
- 结合
- 代理(Agents):
- 使用
BaseChatModel
驱动代理。
from langchain.agents import create_openai_tools_agent agent = create_openai_tools_agent(llm, tools, prompt)
- 使用
- 工具(Tools):
- 绑定工具到模型。
llm = llm.bind_tools([tool])
- 记忆(Memory):
- 结合
ConversationBufferMemory
管理对话历史。
from langchain.memory import ConversationBufferMemory memory = ConversationBufferMemory(return_messages=True)
- 结合
- 回调(Callbacks):
- 使用
RunnableConfig
配置回调。
config = {"callbacks": [StdOutCallbackHandler()]}
- 使用
9. 综合示例:智能代理
以下是一个结合 BaseChatModel
、工具调用和代理的完整示例:
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.agents import create_openai_tools_agent, AgentExecutor
from langchain_core.tools import Tool
from langchain_core.callbacks import StdOutCallbackHandler
from langchain_core.runnables import RunnableConfig
from langchain_core.messages import HumanMessage
import os
import getpass
# 配置 API 密钥
if not os.environ.get("OPENAI_API_KEY"):
os.environ["OPENAI_API_KEY"] = getpass.getpass("请输入 OpenAI API 密钥:")
# 定义工具
def search_web(query: str) -> str:
return f"搜索结果:{query} 的最新信息..."
search_tool = Tool(name="SearchWeb", func=search_web, description="搜索网络信息")
# 初始化模型
llm = ChatOpenAI(model="gpt-4o", temperature=0)
# 设置提示模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个研究助手,擅长搜索和总结信息。"),
MessagesPlaceholder(variable_name="messages"),
MessagesPlaceholder(variable_name="agent_scratchpad")
])
# 创建代理
agent = create_openai_tools_agent(llm, [search_tool], prompt)
agent_executor = AgentExecutor(agent=agent, tools=[search_tool], verbose=True)
# 配置 RunnableConfig
config = RunnableConfig(
callbacks=[StdOutCallbackHandler()],
max_iterations=3,
metadata={"request_id": "req_001"}
)
# 执行任务
response = agent_executor.invoke({
"messages": [HumanMessage(content="量子计算的最新进展是什么?")]
}, config=config)
print(response["output"])
输出:
[AgentExecutor] 正在执行...
[Tool: SearchWeb] 输入:量子计算的最新进展
[Tool Output] 搜索结果:量子计算的最新信息...
[Final Answer] 量子计算的最新进展包括超导量子比特的突破...
10. 学习资源
- 官方文档:https://python.langchain.com/docs/modules/model_io/language_models
- GitHub 源码:https://github.com/langchain-ai/langchain/tree/master/libs/core/langchain_core/language_models
- LangSmith:用于调试模型调用(https://smith.langchain.com)。
- 社区教程:LangChain 官方博客、YouTube 视频。
11. 总结
- 定义:
langchain_core.language_models
模块提供语言模型的抽象基类和实现,标准化模型交互。 - 核心类:
BaseLanguageModel
:顶级基类。BaseChatModel
:聊天模型,支持消息和工具调用。BaseLLM
:生成模型,处理纯文本。SimpleChatModel
:轻量级自定义模型。
- 功能:消息处理、工具调用、流式生成、异步支持、结构化输出、多模态。
- 应用场景:多轮对话、工具调用、结构化输出、RAG、多模态、流式应用、文本生成。
- 优化点:性能、可靠性、监控、配置、模型选择。
- 注意事项:抽象基类、模型支持、密钥安全、token 限制、性能、成本、版本兼容性。