【LangChain系列二】聊天模型上:两种接入方式与参数调优
【LangChain系列二】聊天模型上:两种接入方式与参数调优
上一篇我们聊了 LangChain 的整体架构,这一篇直接上手——怎么把大模型接进来跑起来。
文章目录
- 【LangChain系列二】聊天模型上:两种接入方式与参数调优
- 两种方式接入聊天模型
- 参数详解:这些数字到底怎么设
- temperature
- max_tokens
- top_p
- frequency_penalty 和 presence_penalty
- stop
- timeout 和 max_retries
- streaming
- base_url
- invoke 方法详解
- 本地部署 LLM 接入
- 小结
两种方式接入聊天模型
LangChain 里接入聊天模型主要有两种姿势:
方式一:直接用具体模型类
fromlangchain_deepseekimportChatDeepSeek llm=ChatDeepSeek(model="deepseek-chat",api_key="your-api-key")response=llm.invoke("你好")简单粗暴,适合快速上手。ChatDeepSeek的继承链是这样的:
BaseChatModel → BaseChatOpenAI → ChatDeepSeek因为 DeepSeek 的 API 兼容 OpenAI 协议,所以底层走的是 OpenAI 那套。换成ChatOpenAI、ChatAnthropic也差不多,都是BaseChatModel的子类。
方式二:用init_chat_model()统一初始化
fromlangchain.chat_modelsimportinit_chat_model llm=init_chat_model("deepseek:deepseek-chat",api_key="your-api-key")这个工厂函数的好处是,切换模型供应商时只改字符串参数,代码其他部分不用动。还支持configurable_model()做运行时动态切换:
fromlangchain.chat_modelsimportinit_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,不包含输入。
llm=ChatDeepSeek(model="deepseek-chat",max_tokens=1024)设太小会截断回答,设太大会浪费钱。根据你的场景来:摘要任务 512 够了,长文生成可以拉到 4096。
top_p
和 temperature 类似但机制不同。temperature 调整概率分布的"平坦度",top_p 是截断概率累积。一般二选一调就行,别同时改两个。
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
设置停止标记,模型遇到这些字符串就停止生成:
llm=ChatDeepSeek(model="deepseek-chat",stop=["\n\n","END"])timeout 和 max_retries
网络不稳的时候很有用:
llm=ChatDeepSeek(model="deepseek-chat",timeout=30,# 30秒超时max_retries=3# 最多重试3次)streaming
开启流式输出,体验上打字机效果:
llm=ChatDeepSeek(model="deepseek-chat",streaming=True)forchunkinllm.stream("写一首诗"):print(chunk.content,end="",flush=True)base_url
自定义 API 端点,用代理或者私有部署时会用到:
llm=ChatDeepSeek(model="deepseek-chat",base_url="https://your-proxy.com/v1")invoke 方法详解
invoke是调用模型的核心方法:
response=llm.invoke(input="你好",config={"run_name":"my_run","tags":["test"],"metadata":{"user_id":"123"}})input:输入内容,可以是字符串或消息列表config:运行配置,包含run_name、tags、metadata等,用于 LangSmith 追踪和调试
configurable字段配合configurable_fields使用,可以在调用时动态替换参数:
response=llm.invoke("你好",config={"configurable":{"model_name":"gpt-4"}})本地部署 LLM 接入
不想用远程 API?本地跑也行。用 Ollama 举例:
fromlangchain_ollamaimportChatOllama llm=ChatOllama(model="qwen2.5:7b")response=llm.invoke("你好")或者通过 OpenAI 兼容接口接入任何本地服务:
llm=ChatDeepSeek(model="local-model",base_url="http://localhost:11434/v1",api_key="ollama")小结
| 方式 | 优点 | 缺点 |
|---|---|---|
| 具体模型类 | 参数丰富,功能完整 | 换供应商要改代码 |
| init_chat_model | 统一接口,切换方便 | 某些特有参数可能不支持 |
参数调优没有银弹,多试多调。建议先从temperature=0开始,根据效果逐步调整。
下一篇我们聊工具调用(Tool Calling)——让大模型从"只会说"进化到"能干活"。
觉得有帮助的话,点个赞👍收藏⭐支持一下吧!
