【LangChain】langchain_core.language_models 模块:定义和管理语言模型(Language Models, LLMs)的接口和行为的抽象基类

在 LangChain 中,langchain_core.language_models 模块是核心模块之一,用于定义和管理语言模型(Language Models, LLMs)的接口和行为。它提供了语言模型的抽象基类,包括 BaseLanguageModelBaseChatModelBaseLLM,为聊天模型(如 ChatOpenAI)和生成模型(如 OpenAI)提供了统一的基础架构。这个模块的目标是标准化语言模型的交互方式,确保不同提供商的模型能够无缝集成到 LangChain 的链、代理、工具和其他组件中。

以下是对 langchain_core.language_models 模块的详细介绍,涵盖其定义、核心类、功能、使用方式、代码示例、应用场景、优化建议、注意事项以及与 LangChain 生态的结合。


1. 什么是 langchain_core.language_models

langchain_core.language_models 模块是 LangChain 核心库的一部分,提供了语言模型的抽象接口和实现,用于处理文本生成、对话、工具调用等任务。它包含以下主要内容:

  • 抽象基类:定义了 BaseLanguageModelBaseChatModelBaseLLM,为所有语言模型提供通用接口。
  • 具体实现:子类(如 ChatOpenAIChatAnthropic)继承这些基类,适配特定提供商的模型。
  • 辅助工具:支持工具调用、结构化输出、流式生成等功能。

核心目标

  • 提供统一的 API,屏蔽不同模型提供商的实现细节。
  • 支持多样化的交互模式,如对话、生成、工具调用和多模态输入。
  • 确保与 LangChain 生态(提示模板、代理、记忆等)的无缝集成。

主要用途

  • 初始化和管理语言模型。
  • 处理消息或文本输入,生成响应。
  • 支持复杂工作流,如代理驱动的工具调用或 RAG(检索增强生成)。

2. 核心类与功能

langchain_core.language_models 模块包含以下核心类,每个类都有特定的功能和用途:

(1) BaseLanguageModel

  • 定义:所有语言模型的顶级抽象基类,定义了通用接口。
  • 功能
    • 提供同步和异步调用方法(invokeainvoke)。
    • 支持流式生成(streamastream)。
    • 支持批量处理(batchabatch)。
    • 定义了生成和解析输出的基本逻辑。
  • 主要方法
    方法描述输入输出
    invoke同步调用模型Any, RunnableConfigAny
    ainvoke异步调用Any, RunnableConfigAwaitable[Any]
    stream同步流式生成Any, RunnableConfigIterator[Any]
    astream异步流式生成Any, RunnableConfigAsyncIterator[Any]
    batch批量处理List[Any], RunnableConfigList[Any]
    abatch异步批量处理List[Any], RunnableConfigAwaitable[List[Any]]
  • 子类BaseChatModelBaseLLM

(2) BaseChatModel

  • 定义:专门为聊天模型设计的抽象基类,继承自 BaseLanguageModel
  • 功能
    • 处理基于消息的交互(List[BaseMessage],如 HumanMessageAIMessage)。
    • 支持工具调用(bind_toolstool_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
  • 功能
    • 处理纯文本输入和输出(strstr)。
    • 适合简单生成任务,不支持消息或工具调用。
    • 提供基本的生成逻辑,较少用于现代对话场景。
  • 主要方法:与 BaseLanguageModel 类似,但输入输出为字符串。
  • 子类示例
    • OpenAI(OpenAI 的旧版模型,如 text-davinci-003
    • HuggingFaceHub(HuggingFace 模型)
  • 适用场景:文本生成、摘要、翻译(较老旧的模型)。

(4) 其他类

  • SimpleChatModel
    • 一个轻量级基类,继承自 BaseChatModel,用于快速实现简单的聊天模型(常用于测试或自定义模型)。
    • 开发者只需实现 _call 方法。
  • ChatGenerationChatGenerationChunk
    • 用于表示模型生成的完整响应或流式生成的分块。
    • 包含 message(如 AIMessage)和元数据。
  • ChatResult
    • 封装模型的生成结果,包含 generationsList[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 模块适用于以下场景:

  1. 多轮对话
    • 构建聊天机器人,处理连续对话。
    • 示例:回答“量子计算是什么?”和“它有什么应用?”。
  2. 工具调用
    • 实现代理或链的工具交互。
    • 示例:代理调用搜索或计算工具。
  3. 结构化输出
    • 生成 JSON 或 Pydantic 模型格式的数据。
    • 示例:从文本提取实体或分类结果。
  4. RAG 应用
    • 结合检索器提供上下文,生成准确回答。
    • 示例:结合 Tavily 搜索回答最新问题。
  5. 多模态交互
    • 处理文本+图像的对话。
    • 示例:描述图片中的量子计算机。
  6. 流式应用
    • 实时显示生成内容,适合交互式 UI。
    • 示例:逐字显示长回答。
  7. 文本生成
    • 使用 BaseLLM 进行摘要、翻译等任务。
    • 示例:生成文章摘要。

6. 优化建议

(1) 提高性能

  • 缓存结果
    • 使用 LangChain 的缓存机制存储常见查询。
    from langchain.globals import set_llm_cache
    from langchain.cache import SQLiteCache
    set_llm_cache(SQLiteCache(database_path="cache.db"))
    
  • 异步调用
    • 使用 ainvokeastream 支持高并发。
    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. 注意事项

  • 抽象基类
    • BaseLanguageModelBaseChatModelBaseLLM 不可直接实例化,需使用子类。
  • 模型支持
    • 工具调用和多模态功能依赖具体模型实现。
    • 示例: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. 学习资源


11. 总结

  • 定义langchain_core.language_models 模块提供语言模型的抽象基类和实现,标准化模型交互。
  • 核心类
    • BaseLanguageModel:顶级基类。
    • BaseChatModel:聊天模型,支持消息和工具调用。
    • BaseLLM:生成模型,处理纯文本。
    • SimpleChatModel:轻量级自定义模型。
  • 功能:消息处理、工具调用、流式生成、异步支持、结构化输出、多模态。
  • 应用场景:多轮对话、工具调用、结构化输出、RAG、多模态、流式应用、文本生成。
  • 优化点:性能、可靠性、监控、配置、模型选择。
  • 注意事项:抽象基类、模型支持、密钥安全、token 限制、性能、成本、版本兼容性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬彬侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值