4. 模型接入与配置
模型是LangChain的"发动机"。说白了,没有模型,你的链和智能体就是一堆空壳子。这一章我们深入聊聊LangChain里的三种核心模型类型,以及那些让你又爱又恨的参数调优。
我个人习惯把模型比作"大脑"——LLM是写文章的大脑,Chat模型是会聊天的大脑,文本嵌入模型则是会"算距离"的大脑。三种模型各司其职,但底层都依赖同一个东西:模型参数。
4.1 LLM模型:最基础的文本生成器
LLM模型,全称Large Language Model。在LangChain里,它是最早支持的模型类型。它的工作方式很简单:你给一段文本,它接着往下写。
核心特点:输入字符串,输出字符串。没有对话历史的概念,每次调用都是独立的。
我在项目中遇到过不少新手,上来就用Chat模型做文本补全,结果发现返回格式总是不对。其实LLM模型更适合这类任务。
LangChain支持的LLM模型种类很多,最常用的是的text-davinci系列。不过现在出来后,很多人转向了Chat模型。但LLM模型在某些场景下依然有优势——比如代码生成、结构化输出。
from langchain.llms import
# 初始化LLM模型
llm = (
model_name="text-davinci-003",
temperature=0.7,
max_tokens=256
)
# 直接调用
response = llm("请用Python写一个快速排序算法")
print(response)
嗯,这里要注意:LLM模型的调用方式是最简单的。你不需要维护对话历史,不需要处理角色信息。就是纯粹的"输入-输出"模式。
4.2 Chat模型:带记忆的对话专家
Chat模型是LangChain里最常用的模型类型。它和LLM模型最大的区别在于:它理解"角色"和"对话历史"。
你想想看,如果你跟一个AI聊天,它每次都不记得你刚才说了什么,那得多尴尬?Chat模型就是为了解决这个问题而生的。
| 特性 | LLM模型 | Chat模型 |
|---|---|---|
| 输入格式 | 纯文本字符串 | 消息列表(System/User/Assistant) |
| 对话历史 | 不支持 | 原生支持 |
| 角色控制 | 无 | System消息可设定角色 |
| 典型应用 | 文本补全、代码生成 | 对话机器人、客服系统 |
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage
# 初始化Chat模型
chat = ChatOpenAI(
model_name="-turbo",
temperature=0.3
)
# 构建消息列表
messages = [
SystemMessage(content="你是一个Python编程助手,回答要简洁"),
HumanMessage(content="如何用列表推导式生成1到10的平方?")
]
response = chat(messages)
print(response.content)
我的经验:Chat模型的System消息非常关键。我曾经在一个客服项目中,通过精心设计System提示词,把回答准确率从65%提升到了92%。别小看这几行字。
4.3 文本嵌入模型:把文字变成向量
文本嵌入模型(Embedding Model)可能是最容易被忽视的模型类型。它的工作不是生成文字,而是把文字转换成一串数字——也就是向量。
为什么要这么做?因为计算机不懂"相似"这个概念。但向量可以算距离。两个句子的向量越接近,它们的语义就越相似。
我记得第一次做知识库检索系统时,就是靠嵌入模型把文档库里的每段文字都转成向量,然后存到向量数据库里。用户提问时,先把问题转成向量,再在数据库里找最相似的几段文字。
from langchain.embeddings import OpenAIEmbeddings
# 初始化嵌入模型
embeddings = OpenAIEmbeddings()
# 将文本转换为向量
text = "LangChain是一个强大的AI框架"
vector = embeddings.embed_query(text)
print(f"向量维度: {len(vector)}")
print(f"前5个值: {vector[:5]}")
避坑指南:我曾经在项目中同时用了不同厂商的嵌入模型做相似度计算,结果发现同一个句子在两个模型下的向量距离差异巨大。记住:检索和查询必须用同一个嵌入模型,否则结果毫无意义。
4.4 模型参数调优:温度、最大和其他
模型参数调优,说白了就是控制AI的"性格"和"输出长度"。这里我重点讲三个最常用的参数。
4.4.1 Temperature(温度)
Temperature控制模型的"创造力"。取值范围0到2,默认通常是1。
- 低温度(0-0.3):输出更确定,适合事实性回答、代码生成
- 中温度(0.4-0.7):平衡创造力和准确性,适合通用对话
- 高温度(0.8-2):输出更随机、更有创意,适合头脑风暴、故事创作
为什么会这样?因为模型在生成每个词时,会计算所有可能词的概率分布。Temperature越高,低概率的词被选中的机会就越大。
实战建议:做客服系统时,我用temperature=0.1;做创意文案生成时,我用temperature=0.8。同一个模型,不同参数,效果天差地别。
4.4.2 Max Tokens(最大数)
Max Tokens控制模型输出的最大长度。注意,它包含输入和输出的总数。
我见过有人把max_tokens设得特别大,结果模型输出到一半就停了——因为超过了模型的上下文窗口限制。的上下文窗口是4096个,是8192或更高。
# 不同场景的max_tokens设置建议
configs = {
"简短回答": {"temperature": 0.1, "max_tokens": 100},
"中等长度": {"temperature": 0.5, "max_tokens": 500},
"长文生成": {"temperature": 0.7, "max_tokens": 2000},
"代码生成": {"temperature": 0.2, "max_tokens": 1500}
}
4.4.3 其他重要参数
| 参数名 | 作用 | 我的常用值 |
|---|---|---|
| top_p | 核采样,只考虑概率累计到p的词汇 | 0.9 |
| frequency_penalty | 惩罚重复出现的词,值越大越不重复 | 0.0-0.5 |
| presence_penalty | 鼓励讨论新话题,值越大话题越多样 | 0.0-0.5 |
| stop | 停止词序列,遇到这些词就停止生成 | ["\n\n", "Human:"] |
小技巧:top_p和temperature通常只调一个。我个人习惯固定top_p=0.9,只调temperature。这样参数空间小,调试起来更快。
4.5 三种模型的关系与选择
为了让你更直观地理解这三种模型的关系,我画了一张图。
选择模型其实不难。记住这个原则:
- 需要对话历史?用Chat模型
- 只需要文本补全?用LLM模型
- 需要语义搜索或聚类?用嵌入模型
- 需要控制输出风格?调temperature
- 需要控制输出长度?调max_tokens
曾经踩过的坑:我在一个项目中同时用了LLM模型和Chat模型做同一个任务,结果发现LLM模型的输出格式更稳定。后来才意识到,Chat模型因为有多轮对话的"惯性",有时候会"过度理解"上下文。所以,简单任务用LLM模型,复杂对话用Chat模型,这个原则我一直沿用至今。
好了,模型这块就聊这么多。记住:模型是工具,参数是调音台。用对了工具,调好了参数,你的智能体才能发挥真正的实力。