03 Model组件及其使用技巧
一、Model 组件概述
1.1 什么是 Model 组件?
在 LangChain 中,Model 是一个核心抽象概念,代表语言模型(Language Model)或聊天模型(Chat Model)的接口。它是与底层大语言模型进行交互的关键组件,负责接收输入并返回模型生成的结果。
通过 Model,LangChain 实现了对多种类型语言模型的统一调用方式,包括:
- 远程 API 提供的语言模型(如 OpenAI GPT 系列、Anthropic Claude、Google Gemini 等)
- 本地部署的开源模型(如 Hugging Face Transformers 支持的各种 LLM)
- 自定义模型(通过继承 LangChain 的基类实现)
📌 本质作用:在 LangChain 中,无论是 LLM 亦或者 Chat Model 都可以接受 PromptValue/字符串/消息列表 作为参数,内部会根据模型的类型自动转换成字符串亦或者消息列表,屏蔽了不同模型的差异。
1.2 Model 在 LangChain 架构中的位置
LangChain 的核心架构由多个组件构成,分别是:
| 组件 | 功能 |
|---|---|
| Prompt | 负责构建和格式化提示词 |
| Model | 负责实际调用语言模型处理提示 |
| Chain | 将多个组件组合成可复用的功能流程 |
| Agent | 控制模型如何选择工具来完成任务 |
| Memory | 存储对话历史,支持上下文连续性 |
| Callback | 监听模型调用过程,用于日志、监控等 |
其中,Model 是整个流程中执行语言理解与生成的核心环节,其他组件围绕其构建逻辑流。
1.3 Model 的主要分类
LangChain 中将 Model 分为两大类:
✅ 1. LLM(Language Language Model)
- 适用场景:单轮文本生成,如问答、摘要、翻译。
- 输入输出形式:
- 输入:字符串文本
- 输出:字符串文本
- 常见实现类:
OpenAIHuggingFaceHubGooglePaLM
from langchain_community.llms import OpenAIllm = OpenAI(model="gpt-3.5-turbo-instruct")
response = llm.invoke("请解释什么是人工智能?")
print(response)
✅ 2. ChatModel(聊天模型)
- 适用场景:多轮对话系统、需要消息结构的应用。
- 输入输出形式:
- 输入:包含角色的消息对象(如 HumanMessage、AIMessage、SystemMessage)
- 输出:包含角色的消息对象
- 常见实现类:
ChatOpenAIChatAnthropicChatHuggingFace
from langchain_community.chat_models import ChatOpenAI
from langchain_core.messages import HumanMessagechat_model = ChatOpenAI(model="gpt-4o")
messages = [HumanMessage(content="今天天气怎么样?")]
response = chat_model.invoke(messages)
print(response)
1.4 Model 的基本功能特性
| 特性 | 描述 |
|---|---|
| 标准化接口 | 所有 Model 都实现了统一的方法(如 invoke, stream, batch),便于切换模型 |
| 参数控制 | 可设置温度(temperature)、最大输出长度(max_tokens)等生成参数 |
| 异步支持 | 支持异步调用(ainvoke, astream)以提高性能 |
| 回调机制 | 支持注册回调函数,用于记录日志、分析性能等 |
| 缓存支持 | 可启用缓存机制,避免重复调用相同输入 |
1.5 Model 的使用流程简述
一个典型的 Model 使用流程如下:
-
加载模型
根据需求选择合适的 Model 类,并传入必要的参数(如 API Key、模型名称等)。 -
准备输入数据
对于 LLM,准备一段文本;对于 ChatModel,则构造包含角色的消息列表。 -
调用模型生成响应
使用invoke()方法同步调用,或stream()获取流式结果。 -
处理输出结果
解析模型返回的内容,用于后续业务逻辑(如展示给用户、写入数据库等)。 -
(可选)注册回调函数
如需监控调用过程或记录日志,可通过回调机制扩展行为。
当然可以!以下是 LangChain 中 Model 组件学习大纲 的 第二章:Model 的类型与加载 的完整补充内容,旨在帮助你全面掌握 LangChain 中模型的分类、加载方式以及如何选择合适的模型。
二、Model 的类型与加载
在 LangChain 中,Model 是一个抽象接口,它支持多种语言模型的接入。根据模型来源和使用方式,LangChain 将 Model 分为几大类,并提供了统一的加载方式,便于开发者灵活使用。
本章将详细介绍:
- LLM 与 ChatModel 的区别
- 模型的三种主要加载方式(远程 API、本地模型、自定义封装)
- 如何选择合适的模型
- 常见模型库及示例代码
2.1 LLM 与 ChatModel 的对比
| 特性 | LLM(Language Language Model) | ChatModel(聊天模型) |
|---|---|---|
| 输入格式 | 字符串文本 | 消息对象列表(如 HumanMessage, AIMessage) |
| 输出格式 | 字符串文本 | 消息对象(含角色信息) |
| 适用场景 | 单轮生成任务(如摘要、翻译、问答) | 多轮对话系统(如客服机器人、助手) |
| 示例模型 | GPT-3.5 Turbo Instruct, Google PaLM, HuggingFace Hub | GPT-4o, Anthropic Claude, Gemini Pro |
| 主要类名 | OpenAI, HuggingFaceHub, GooglePaLM | ChatOpenAI, ChatAnthropic, ChatGoogleGenerativeAI |
📌 总结建议:
- 如果你的应用是单轮输入输出,例如基于 Prompt 的内容生成,使用 LLM。
- 如果你需要处理多轮对话或需要结构化消息(System/Human/AI),使用 ChatModel。
2.2 模型加载方式详解
✅ 1. 加载远程 API 模型(推荐用于快速开发)
这是最常用的方式,适用于 OpenAI、Anthropic、Google 等平台提供的 API 接口模型。
使用方法:
- 安装对应 provider 的集成包(如
langchain-openai、langchain-google-genai) - 实例化对应的 Model 类并传入参数(如 API Key、模型名称等)
示例代码(ChatOpenAI):
from langchain_community.chat_models import ChatOpenAIchat_model = ChatOpenAI(model="gpt-4o",temperature=0.7,api_key="your_openai_api_key"
)
示例代码(ChatGoogleGenerativeAI):
from langchain_google_genai import ChatGoogleGenerativeAIchat_model = ChatGoogleGenerativeAI(model="gemini-pro",google_api_key="your_gemini_api_key"
)
✅ 2. 加载本地部署模型(适合隐私/定制需求)
适用于企业内部部署、开源社区模型(如 LLaMA、Falcon、ChatGLM 等),可通过 Hugging Face Transformers 或本地服务调用。
使用方法:
- 使用
HuggingFacePipeline或HuggingFaceHub - 可通过
transformers直接加载本地模型 - 支持
text-generation,fill-mask,summarization等任务
示例代码(HuggingFaceHub):
from langchain_community.llms import HuggingFaceHubllm = HuggingFaceHub(repo_id="google/flan-t5-xl",huggingfacehub_api_token="your_hf_api_key"
)
示例代码(本地加载):
from transformers import AutoTokenizer, AutoModelForCausalLM
from langchain_huggingface import HuggingFacePipeline
import torch# 加载本地模型
model_name_or_path = "path/to/your/local/model"
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path)
model = AutoModelForCausalLM.from_pretrained(model_name_or_path)# 构建 pipeline
pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, max_new_tokens=100)
llm = HuggingFacePipeline(pipeline=pipe)
✅ 3. 自定义模型封装(适合高级用户)
如果你有私有模型或第三方模型,可以通过继承 LangChain 的基类来自定义 Model。
实现步骤:
- 继承
BaseLanguageModel或BaseChatModel - 实现核心方法
generate()和agenerate() - 注册模型并用于 Chain 或 Agent 流程中
示例代码(简化版):
from langchain_core.language_models import BaseLanguageModelclass MyCustomLLM(BaseLanguageModel):def _call(self, prompt: str, **kwargs) -> str:# 模拟调用自定义模型return f"这是对 '{prompt}' 的回应"@propertydef _llm_type(self) -> str:return "custom_llm"
2.3 如何选择合适的模型?
选择合适的模型应考虑以下因素:
| 因素 | 描述 |
|---|---|
| 性能需求 | 是否需要高并发?是否需要流式输出? |
| 成本控制 | API 调用是否有预算限制?是否允许本地部署? |
| 数据隐私 | 数据是否敏感?是否允许上传到云端? |
| 功能需求 | 是否需要多模态?是否需要特定领域微调? |
| 部署难度 | 是否具备部署本地模型的技术能力? |
📌 建议:
- 快速验证原型 → 使用远程 API 模型(如 GPT)
- 需要定制化或降低成本 → 使用本地开源模型(如 LLaMA、ChatGLM)
- 特殊业务逻辑 → 自定义封装模型
2.4 常见模型库与推荐
| 模型类型 | 推荐模型 | 说明 |
|---|---|---|
| 远程模型 | GPT-4o、Claude 3、Gemini Pro | 强大的通用模型,适合复杂任务 |
| 开源模型 | LLaMA 3、Mistral、Phi-3、ChatGLM | 可本地部署,适合定制化 |
| 小型模型 | TinyLlama、DistilGPT2 | 轻量级,适合边缘设备或测试 |
| 多模态模型 | LLaVA、BLIP、Kosmos-2 | 支持图像理解与生成 |
| 专业领域模型 | BioGPT、ClinicalBERT | 医疗、金融等垂直领域专用 |
当然可以!以下是 LangChain 中 Model 组件学习大纲 的 第三章:Model 的调用与参数 的完整补充内容,帮助你深入理解如何在 LangChain 中正确使用模型的调用方法以及关键生成参数。
三、Model 的调用与参数
在 LangChain 中,Model 是负责执行语言理解和生成的核心组件。掌握其调用方式和生成参数是构建高质量 AI 应用的关键。本章将详细介绍:
- 同步调用(
invoke) - 流式输出(
stream) - 批量处理(
batch) - 异步调用(
ainvoke,astream) - 关键生成参数(temperature、max_tokens 等)
3.1 基础调用方法
✅ 1. invoke():同步调用模型
这是最基础的调用方式,用于单次输入并获取一次输出结果。
示例(LLM):
from langchain_community.llms import OpenAIllm = OpenAI(model="gpt-3.5-turbo-instruct", temperature=0.7)
response = llm.invoke("请解释什么是机器学习?")
print(response)
示例(ChatModel):
from langchain_community.chat_models import ChatOpenAI
from langchain_core.messages import HumanMessagechat_model = ChatOpenAI(model="gpt-4o")
messages = [HumanMessage(content="今天天气怎么样?")]
response = chat_model.invoke(messages)
print(response.content)
📌 说明:
invoke()方法适用于大多数简单的任务,如问答、摘要、翻译等。
✅ 2. stream():流式输出模型响应
对于需要逐步显示结果的场景(如聊天界面),可以使用流式输出。
示例(ChatModel):
from langchain_community.chat_models import ChatOpenAI
from langchain_core.messages import HumanMessagechat_model = ChatOpenAI(model="gpt-4o")for chunk in chat_model.stream([HumanMessage(content="写一篇关于气候变化的短文")]):print(chunk.content, end="", flush=True)
📌 优势:用户体验更流畅,尤其适合 Web 或移动端应用。
✅ 3. batch():批量处理多个输入
当你有多个输入需要同时处理时,可使用 batch() 提高效率。
示例:
from langchain_community.llms import OpenAIllm = OpenAI(model="gpt-3.5-turbo-instruct")
inputs = ["中国四大发明有哪些?", "请介绍量子计算的基本原理", "简述太阳系的结构"]responses = llm.batch(inputs)
for i, response in enumerate(responses):print(f"输入 {i+1} 的结果:{response}")
📌 适用场景:数据预处理、批量生成内容、测试集评估等。
3.2 异步调用方法(推荐用于高并发)
为了支持异步编程,LangChain 提供了以下异步方法:
✅ 1. ainvoke():异步单次调用
import asyncio
from langchain_community.chat_models i