本节摘要:LangChain 把大模型封装成三类标准接口——补全型、对话型、嵌入型,统一的调用协议让换型号只改一行。本节拆解模型参数仪表盘、流式与批量两种供电方式,并给出按产线需求选型的对照表。
装配线的第一个铁律:动力单元必须可替换。2023 年到 2025 年间,主流模型换了三四代,接口规范也各家不同——如果产线代码里到处散落着某家的私有调用写法,每次换代都是一场全文搜索式的手术。LangChain 的解法是把模型抽象成三类标准件:
三类件的调用协议完全一致:单个用 invoke,一批用 batch,边生成边交付用 stream。先看对话型这个主力:
from langchain_openai import ChatOpenAI # 对话型动力单元:型号与参数在这里声明 llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0) # 单件生产:invoke 吃一条消息 result = llm.invoke("把这句话改写成客服口吻:退货要七天之内") print(result.content) # 输出示例:您好,若您需要办理退货,请务必在签收后七日内提出申请哦~ # 批量生产:batch 吃一个列表,返回顺序与输入一致 outs = llm.batch(["写一个五字标题", "再写一个"]) print([o.content for o in outs]) # 输出示例:['晨光微语集', '夜色温柔记']
嵌入型长得像同一类零件,只是输出变成了向量:
from langchain_openai import OpenAIEmbeddings embedder = OpenAIEmbeddings(model="text-embedding-ada-002") # 单文本嵌入:返回一个高维向量(这里只看前三维) vec = embedder.embed_query("彩色袜子") print(len(vec), vec[:3]) # 输出示例:1536 [0.0123, -0.0456, 0.0789] # 批量嵌入:检索产线建库时用,价格按条计费 vecs = embedder.embed_documents(["红色围巾", "蓝色手套"]) print(len(vecs)) # 输出:2
参数不是玄学旋钮,每个都对应一种产线行为。四个最常用的:
| 参数 | 控制什么 | 调高的效果 | 调低的效果 |
|---|---|---|---|
| temperature | 采样随机度 | 输出多样,适合创意工位 | 输出稳定,适合质检工位 |
| max_tokens | 单次输出上限 | 允许长文,费用上限变高 | 强制简短,防跑题 |
| top_p | 候选词池宽度 | 与升温类似,影响更柔和 | 更保守 |
| timeout | 等待上限 | 容忍慢响应 | 快速失败好重试 |
经验值一句话:写代码、抽取、分类用低温;起名、写文案、头脑风暴用高温;两者都先锁输出长度再谈质量。 看一个对照实验:
creative = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.9) stable = ChatOpenAI(model="gpt-3.5-turbo", temperature=0) # 同一张工艺单,两种供电状态 q = "给彩色袜子品牌起一个名字" print("高温:", creative.invoke(q).content) # 每次跑都不同,可能蹦出怪名字 print("低温:", stable.invoke(q).content) # 基本稳定,安全但平庸 # 高温输出示例:Bubble Toes 气泡脚趾 # 低温输出示例:彩织坊
流式供电是交互产线的刚需——用户盯着空白等待三秒就会怀疑卡死:
# 边生成边交付:产线一有产出就往下游送 for chunk in llm.stream("用两段话介绍向量数据库"): print(chunk.content, end="", flush=True) # 输出示例(逐字出现):向量数据库是一种……
⚠️ 参数只在实例化时生效一次,很多初学者在调用后再改温度,以为会生效。需要同一产线两种温度时,就装配两个模型实例,各管一段工序。
💡 关键直觉:把模型实例当成"定了规格的发动机",而不是"随叫随改的函数"。规格在装配时锁定,运行期只喂输入。
选动力单元先看工序性质,再看预算,最后看部署约束:
| 产线类型 | 推荐配置 | 理由 |
|---|---|---|
| 客服问答 | 对话型 + 低温 + 长超时 | 稳定压倒一切,偶发慢响应可接受 |
| 营销文案 | 对话型 + 高温 + 限长 | 要多样性,但要防跑飞 |
| 文档检索 | 嵌入型 + 批量接口 | 建库一次算好,查询时单条嵌入 |
| 离线批处理 | 任意型号 + batch | 吞吐优先,可等夜间低价时段 |
| 内网敏感数据 | 本地开源模型 | 数据不出内网,牺牲部分质量 |
换发动机的实操在 1.3 节演示过:把 ChatOpenAI 换成 ChatOllama,产线其余部分一字不改。再补一个换到 Hugging Face 托管模型的例子,体会"适配包"的含义:
# pip install langchain-huggingface 后可用 from langchain_huggingface import HuggingFaceEndpoint # 同样是三行:声明动力单元 → 组装 → 调用 llm = HuggingFaceEndpoint(repo_id="mistralai/Mistral-7B-Instruct-v0.2", temperature=0.3) print(llm.invoke("用一句话解释装配线")) # 输出示例:装配线是把工序拆分并按序固定下来的生产组织方式。
问:对话型和补全型能混用吗? 能,但不建议在一条链里混。两者消息格式不同,混用要加转换层,徒增故障点。新项目直接选对话型。
问:模型输出的额外信息去哪了? 消息对象上除了正文还有 token 用量、结束原因等字段,回调与计费会用到,2.9 节细讲。
下一节看给发动机喂料的工艺单:提示词模板怎么把"写死的话术"变成"带占位器的图纸"。