【LangChain系列二】聊天模型上:两种接入方式与参数调优

【LangChain系列二】聊天模型上:两种接入方式与参数调优

上一篇我们聊了 LangChain 的整体架构,这一篇直接上手------怎么把大模型接进来跑起来。

文章目录

两种方式接入聊天模型

LangChain 里接入聊天模型主要有两种姿势:

方式一:直接用具体模型类

python 复制代码
from langchain_deepseek import ChatDeepSeek

llm = ChatDeepSeek(
    model="deepseek-chat",
    api_key="your-api-key"
)
response = llm.invoke("你好")

简单粗暴,适合快速上手。ChatDeepSeek 的继承链是这样的:

复制代码
BaseChatModel → BaseChatOpenAI → ChatDeepSeek

因为 DeepSeek 的 API 兼容 OpenAI 协议,所以底层走的是 OpenAI 那套。换成 ChatOpenAIChatAnthropic 也差不多,都是 BaseChatModel 的子类。

方式二:用 init_chat_model() 统一初始化

python 复制代码
from langchain.chat_models import init_chat_model

llm = init_chat_model("deepseek:deepseek-chat", api_key="your-api-key")

这个工厂函数的好处是,切换模型供应商时只改字符串参数,代码其他部分不用动。还支持 configurable_model() 做运行时动态切换:

python 复制代码
from langchain.chat_models import init_chat_model, configurable_fields

configurable_llm = init_chat_model(
    "deepseek:deepseek-chat",
    api_key="your-api-key"
).configurable_fields(
    model_name=configurable_fields("model_name")
)

这样可以在调用时动态指定用哪个模型,适合做对比测试或者多模型路由。

参数详解:这些数字到底怎么设

接入模型之后,参数调优是绕不开的话题。下面逐个拆解。

temperature

这个参数控制输出的随机性,范围 0~2:

temperature 适用场景 说明
0 代码生成、数学计算 输出最确定,每次结果基本一样
0~0.5 技术文档、数据提取 有一点变化但大体稳定
0.5~1 创意写作、对话 平衡创意和一致性
1~2 头脑风暴、诗歌 高度随机,容易出"惊喜"

实战建议:写代码设 0,写文档设 0.3,聊天设 0.7,搞创意设 1

max_tokens

控制模型单次生成的最大 token 数。注意这里说的是输出token,不包含输入。

python 复制代码
llm = ChatDeepSeek(model="deepseek-chat", max_tokens=1024)

设太小会截断回答,设太大会浪费钱。根据你的场景来:摘要任务 512 够了,长文生成可以拉到 4096。

top_p

和 temperature 类似但机制不同。temperature 调整概率分布的"平坦度",top_p 是截断概率累积。一般二选一调就行,别同时改两个。

python 复制代码
llm = ChatDeepSeek(model="deepseek-chat", temperature=0.7, top_p=0.9)

frequency_penalty 和 presence_penalty

  • frequency_penalty(-2.0~2.0):惩罚重复出现的词,值越大越不容易重复
  • presence_penalty(-2.0~2.0):惩罚已经出现过的词,鼓励新话题

写小说可以拉高一点避免车轱辘话,写技术文档保持默认就行。

stop

设置停止标记,模型遇到这些字符串就停止生成:

python 复制代码
llm = ChatDeepSeek(model="deepseek-chat", stop=["\n\n", "END"])

timeout 和 max_retries

网络不稳的时候很有用:

python 复制代码
llm = ChatDeepSeek(
    model="deepseek-chat",
    timeout=30,      # 30秒超时
    max_retries=3    # 最多重试3次
)

streaming

开启流式输出,体验上打字机效果:

python 复制代码
llm = ChatDeepSeek(model="deepseek-chat", streaming=True)

for chunk in llm.stream("写一首诗"):
    print(chunk.content, end="", flush=True)

base_url

自定义 API 端点,用代理或者私有部署时会用到:

python 复制代码
llm = ChatDeepSeek(
    model="deepseek-chat",
    base_url="https://your-proxy.com/v1"
)

invoke 方法详解

invoke 是调用模型的核心方法:

python 复制代码
response = llm.invoke(
    input="你好",
    config={
        "run_name": "my_run",
        "tags": ["test"],
        "metadata": {"user_id": "123"}
    }
)
  • input:输入内容,可以是字符串或消息列表
  • config:运行配置,包含 run_nametagsmetadata 等,用于 LangSmith 追踪和调试

configurable 字段配合 configurable_fields 使用,可以在调用时动态替换参数:

python 复制代码
response = llm.invoke(
    "你好",
    config={"configurable": {"model_name": "gpt-4"}}
)

本地部署 LLM 接入

不想用远程 API?本地跑也行。用 Ollama 举例:

python 复制代码
from langchain_ollama import ChatOllama

llm = ChatOllama(model="qwen2.5:7b")
response = llm.invoke("你好")

或者通过 OpenAI 兼容接口接入任何本地服务:

python 复制代码
llm = ChatDeepSeek(
    model="local-model",
    base_url="http://localhost:11434/v1",
    api_key="ollama"
)

小结

方式 优点 缺点
具体模型类 参数丰富,功能完整 换供应商要改代码
init_chat_model 统一接口,切换方便 某些特有参数可能不支持

参数调优没有银弹,多试多调。建议先从 temperature=0 开始,根据效果逐步调整。


下一篇我们聊工具调用(Tool Calling)------让大模型从"只会说"进化到"能干活"。

觉得有帮助的话,点个赞👍收藏⭐支持一下吧!