news 2026/8/4 6:05:32

Langchain的models学习与实践(国内大模型)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Langchain的models学习与实践(国内大模型)

整体步骤

1.导入兼容 OpenAI 接口的国内模型和设置环境变量
​​

from langchain_openai import ChatOpenAI

许多国内大模型平台(如阿里云通义千问、智谱 AI、DeepSeek 等)在设计 API 时,采用了与 OpenAI 官方 API 高度相似的接口规范,如使用相同的 HTTP 方法(POST)和路径结构(如 /v1/chat/completions);请求体和响应体的 JSON 格式与 OpenAI 保持一致(例如 messages 数组、model 字段、choices 等);认证方式通常也是通过 HTTP 头部 Authorization: Bearer <API_KEY> 实现。
所以我们可以直接使用 ChatOpenAI 来调用这些国内模型,只需更换 base_url(基础地址)和 api_key 即可,这大大简化了多模型集成的代码复杂度。

import os os.environ['OPENAI_API_KEY'] = "你的API-KEY" # 注意"你的API-KEY"改成你申请的api key os.environ['OPENAI_API_BASE'] = "https://open.bigmodel.cn/api/paas/v4/" # 兼容端点,即base url。


通过环境变量设置 API 密钥和基础 URL,本篇文章用的智谱。

2.使用 ChatOpenAI 类实例化模型


类名是 ChatOpenAI,因为它兼容 OpenAI 的接口规范。
ChatOpenAI 是 LangChain 中用于调用兼容 OpenAI 接口的聊天模型的类,继承自 BaseChatModel,常用参数如下(按功能分类):

参数名类型说明
核心参数
modelstr必填,指定要使用的模型名称。对于国内模型,填写平台支持的模型 ID,如"qwen-plus""glm-4-flash""deepseek-chat"等。
temperaturefloat采样温度,控制生成结果的随机性。取值范围 0~2,默认 0.7。值越低越确定,越高越多样。
max_tokensint生成的最大 token 数,用于限制回复长度。可选。
API 连接参数
openai_api_keystrAPI 密钥。如果不传入,会从环境变量OPENAI_API_KEY读取。
openai_api_basestr基础 URL。如果不传入,会从环境变量OPENAI_API_BASE读取;若环境变量也未设置,则使用默认的 OpenAI 地址。
openai_proxystr代理服务器地址(如http://proxy.example.com:8080),可选。
request_timeoutfloattuple请求超时时间(秒),例如30(5, 30)
max_retriesint请求失败时的最大重试次数,默认 2。
headersdict自定义 HTTP 请求头。
生成控制参数
top_pfloat核采样参数,通常与 temperature 二选一调整。默认 1。
frequency_penaltyfloat频率惩罚,避免重复词汇,范围 -2.0~2.0。
presence_penaltyfloat存在惩罚,鼓励谈论新话题,范围 -2.0~2.0。
stopstrList[str]停止词,当模型生成这些词时停止。
nint每个输入消息生成多少个候选回复,默认 1。
streamingbool是否以流式方式返回结果,默认False
model_kwargsdict其他传递给底层 API 的额外参数,例如logit_bias
调试参数
verbosebool是否输出详细调试信息,默认False
callback_managerBaseCallbackManager回调管理器,用于处理回调事件(较新版本中可能已变更)。
llm = ChatOpenAI( model="glm-4-flash", #指定国内模型的名字,如 qwen-plus, qwen-max, deepseek-chat 等 temperature=0, # 也可以在这里直接传入 openai_api_key 和 openai_api_base # openai_api_key="你的API-KEY", # openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1", # max_tokens=512, # 可选,根据需要设置 )

调用模型


直接输出结果

response = llm.invoke("你叫什么名字?") print(response.content)


invoke 是 LangChain 中所有可运行组件(Runnable)的核心方法,用于同步调用语言模型。invoke 会将输入的消息发送给模型,等待模型生成回复后返回结果。
invoke 返回一个 AIMessage 对象(在较新版本中,返回类型为 BaseMessage 的子类,其 type 为 "ai")。该对象包含模型生成的回复内容及可能的其他元数据。

常用属性和方法:

.content:获取生成的文本内容(字符串)

.response_metadata:获取 API 返回的元数据,如 token 用量、模型名称等(可能因平台而异)

.type:消息类型,通常为 "ai"。


流式打印每个块

for chunk in llm.stream("你叫什么名字?"): print(chunk.content, end="", flush=True)

.stream(...)返回一个迭代器,每次迭代生成一个AIMessageChunk对象,chunk 是 AIMessageChunk 对象,其 content 属性包含文本片段。在打印时设置flush=True可以强制立即输出,避免缓冲,从而实现实时的流式效果。

questions = [ "什么是langchain?", "什么是langgraph?", ] print("使用batch()") responses = llm.batch(questions) # 返回一个列表,顺序与输入一致 for i, response in enumerate(responses): print(f"Q{i+1}: {questions[i]}") print(f"A: {response.content}\n") print("使用batch_as_completed()") # batch_as_completed 返回一个迭代器,每个元素是 (index, response) 元组 for idx, response in llm.batch_as_completed(questions): print(f"Q{idx+1}: {questions[idx]}") print(f"A: {response.content}\n")

输入格式:两个方法都接受一个列表,列表元素可以是字符串(代表用户消息),也可以是更复杂的消息格式(如 HumanMessage 对象),这里直接使用字符串即可。
返回类型:batch() 返回 List[AIMessage];batch_as_completed() 返回迭代器,元素为 (int, AIMessage),其中 int 是原始输入列表中的索引。


方法一:使用 batch() 一次性获取所有结果(按输入顺序返回)


batch() 方法可以并行发送多个请求,等待所有请求完成后,按输入顺序返回一个包含所有 AIMessage 对象的列表。
结果顺序与输入严格一致,便于处理;必须等待最慢的那个请求完成后才能得到所有结果(整体延迟取决于最慢的请求)。


方法二:使用 batch_as_completed() 按完成顺序实时获取结果(可能乱序)


batch_as_completed() 方法则同样并行发送多个请求,但一旦某个请求完成,就立即通过迭代器返回 (index, response) 对,不保证返回顺序(先完成的先返回)。
batch_as_completed() 方法可以实时处理先返回的结果,提升用户体验(尤其当请求处理时间差异较大时);需要额外处理 index 来匹配原始输入,因为返回顺序可能乱序。


整体代码

from langchain_openai import ChatOpenAI import os os.environ['OPENAI_API_KEY'] = "" os.environ['OPENAI_API_BASE'] = "https://open.bigmodel.cn/api/paas/v4/" llm = ChatOpenAI( model="glm-4-flash", # 指定国内模型的名字,如 qwen-plus, qwen-max, deepseek-chat 等 temperature=0, # 也可以在这里直接传入 openai_api_key 和 openai_api_base # openai_api_key="你的API-KEY", # openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1", # max_tokens=512, # 可选,根据需要设置 ) response = llm.invoke("你叫什么名字?") print(response.content) ####################################################### # 流式打印每个块(用 "" 分隔) for chunk in llm.stream("你叫什么名字?"): # chunk 是 AIMessageChunk 对象,其 content 属性包含文本片段 print(chunk.content, end="", flush=True) ####################################################### questions = [ "什么是langchain?", "什么是langgraph?", ] print("使用batch()") responses = llm.batch(questions) # 返回一个列表,顺序与输入一致 for i, response in enumerate(responses): print(f"Q{i+1}: {questions[i]}") print(f"A: {response.content}\n") print("使用batch_as_completed()") for idx, response in llm.batch_as_completed(questions): print(f"Q{idx+1}: {questions[idx]}") print(f"A: {response.content}\n")


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/21 6:17:08

误删/格式化/清空回收站都能救:实操4招专业恢复删除的文件解决方案

许多计算机用户在操作电脑的过程中&#xff0c;手滑误删、回收站清空、磁盘格式化等情况时有发生&#xff0c;这将导致重要文档、照片、视频等数据丢失&#xff0c;给工作和生活带来诸多不便。很多人误以为删除后的文件无法找回&#xff0c;其实只要掌握正确方法&#xff0c;绝…

作者头像 李华
网站建设 2026/8/4 6:04:56

SkyWalking 数据采集与传输全链路原理深度解析

从字节码增强到 gRPC 协议、从探针插件到 OAP 流式处理——一篇文章把 SkyWalking 的数据流动过程说清楚。 1为什么需要 SkyWalking?先从痛点说起 在单体时代,一个请求的完整生命周期基本在一个进程里完成,出了问题翻日志就能找到。但微服务拆分之后,一次用户下单可能经过…

作者头像 李华
网站建设 2026/8/4 6:05:17

一行 log 日志,结果引发了 P1 的线上事故...

线上事故回顾 前段时间新增一个特别简单的功能&#xff0c;晚上上线前review代码时想到公司拼搏进取的价值观临时加一行log日志&#xff0c;觉得就一行简单的日志基本上没啥问题&#xff0c;结果刚上完线后一堆报警&#xff0c;赶紧回滚了代码&#xff0c;找到问题删除了添加日…

作者头像 李华
网站建设 2026/8/4 6:01:59

高性能服务器的好处都有哪些?

在数字化进程飞速发展的当下&#xff0c;高性能服务器以其卓越的性能和强大的功能&#xff0c;成为众多领域发展的关键支撑&#xff0c;在提升运算速度、确保数据安全、增强系统稳定等方面展现出无可比拟的优势。高性能服务器配备了顶级的多核处理器&#xff0c;其运算速度犹如…

作者头像 李华
网站建设 2026/7/21 6:17:27

基于大数据+Hadoop+机器学习的空气PM2.5浓度预测系统设计与开发(源码+精品论文+答辩PPT等资料)

博主介绍&#xff1a;CSDN毕设辅导第一人、靠谱第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交…

作者头像 李华