LangChain 与大模型交互
本节详细梳理LangChain与大模型交互的关键知识点。内容涵盖安装依赖、环境变量设置、密钥管理函数(load_key)的设计与实现,以及其在LangChain部署中的实际应用。
一、配置LangChain的相关内容
1. LangChain大模型交互概述
LangChain是一个用于构建大语言模型(LLM)应用的框架,大模型交互指在用户自己的计算机上运行LangChain,而非依赖云服务。这包括:
- 安装依赖包:获取必要的Python库。
- 配置环境:设置API密钥等敏感信息。
- 集成监控工具:如LangSmith,用于跟踪模型调用记录。 通俗解释:就像组装一台新电脑,你需要先安装操作系统(依赖包),再设置密码和账户(环境变量),最后连接监控摄像头(LangSmith)来查看谁在使用电脑。
2. 安装依赖包
在Python中,我们使用pip命令安装包。样例中的命令如下:
# 安装核⼼依赖包
!pip install langchain
# 安装社区扩展包
!pip install langchain_community
- 知识点解释:
pip是Python的包管理工具,类似手机上的应用商店,用于下载和安装库。langchain是核心库,提供基础功能;langchain_community是社区维护的扩展包,添加额外工具(如连接不同大模型)。- 为什么需要:没有这些包,LangChain无法运行,就像没有微信APP就无法发消息。
- 最佳实践:建议在虚拟环境(如
venv)中安装,避免污染系统Python环境。虚拟环境相当于“隔离房间”,不同项目互不影响。 - 常见问题:如果安装失败,可能是网络问题或Python版本不兼容,可尝试
pip install --upgrade pip升级pip。
3. 设置LangSmith环境变量
LangSmith是一个平台,用于监控LangChain调用大模型的记录。设置环境变量让LangChain能连接LangSmith:
import os
from config.load_key import load_key
os.environ["LANGSMITH_TRACING"] = "true" # 启用追踪
os.environ["LANGSMITH_PROJECT"] = "firstLangChainDemo" # 设置项目名
os.environ["LANGSMITH_API_KEY"] = load_key("LANGSMITH_API_KEY") # 安全加载API密钥
- 知识点解释:
- 环境变量(Environment Variables):是操作系统级别的配置,程序运行时读取。例如,
os.environ["KEY"]在Python中获取或设置变量。这类似于手机的“设置”菜单,全局控制APP行为。 - LangSmith的作用:它记录每次调用大模型的细节(如输入输出、错误),帮助开发者调试和优化。类似于汽车的行车记录仪。
- 为什么需要API_KEY:API_KEY是访问LangSmith的“密码”,必须在官网(https://smith.langchain.com/)申请,确保只有授权用户能查看数据。
- 安全风险:如果直接在代码中写死API_KEY(如
os.environ["LANGSMITH_API_KEY"] = "abc123"),代码泄露时密钥会被盗。这就是为什么我们需要load_key函数来安全管理。
- 环境变量(Environment Variables):是操作系统级别的配置,程序运行时读取。例如,
4. 密钥管理函数:load_key深度分析
load_key函数是样例的核心,专为LangChain大模型交互设计,解决密钥安全存储和自动化加载问题。它在config/load_key.py文件中实现。
4.1 函数定位与价值
- 输入:密钥名称(如
"LANGSMITH_API_KEY")。 - 输出:对应的密钥值。
- 本质:一个本地配置文件管理器,替代手动硬编码密钥的不安全方式。
- 通俗解释:想象一个智能密码箱,你告诉它“我要微信密码”,它会自动从保险柜(配置文件)取出来;如果保险柜不存在或密码缺失,它会让你安全输入并保存。
- 在LangChain中的价值:
- 安全隔离:避免密钥泄露,符合安全最佳实践。
- 简化部署:新手无需手动创建文件,函数自动处理。
- 通用性:可管理任意密钥(如OpenAI或通义千问的API_KEY),通过
load_key("MODEL_API_KEY")调用。 - 支持监控:为LangSmith提供密钥,实现调用追踪。
4.2 执行逻辑(三大场景)
函数根据配置文件Keys.json的状态自动处理三种情况,全程无手动干预:
-
场景1:配置文件存在且密钥有效
- 行为:直接读取密钥并返回。
- 代码路径:
if os.path.exists(file_path): with open(file_path, "r", encoding="utf-8") as file: Key = json.load(file) if keyname in Key and Key[keyname]: return Key[keyname] - 通俗解释:保险柜存在且密码正确,直接开门取物。
-
场景2:配置文件存在但密钥缺失或为空
- 行为:提示用户输入密钥(安全隐藏输入),保存到文件后返回。
- 代码路径:
else: keyval = getpass.getpass(f"配置文件中未找到 {keyname},请输入对应配置信息: ").strip() Key[keyname] = keyval with open(file_path, "w", encoding="utf-8") as file: json.dump(Key, file, indent=4, ensure_ascii=False) return keyval - 通俗解释:保险柜存在但密码丢了,系统让你重新输入密码(输入时不显示),然后锁进柜子。
-
场景3:配置文件不存在
- 行为:创建新文件,提示用户输入密钥,保存后返回。
- 代码路径:
else: keyval = getpass.getpass(f"配置文件不存在,请输入 {keyname} 配置信息: ").strip() Key = {keyname: keyval} with open(file_path, "w", encoding="utf-8") as file: json.dump(Key, file, indent=4, ensure_ascii=False) return keyval - 通俗解释:没有保险柜,系统新建一个,让你设置密码并保存。
4.3 关键技术点
-
文件路径处理:
- 使用
os.path.abspath(__file__)获取当前脚本的绝对路径。 os.path.dirname()提取目录路径,确保Keys.json与脚本在同一文件夹(config目录)。- 为什么重要:保证文件位置固定,避免路径错误。类似地图导航,精确定位保险柜位置。
- 使用
-
JSON文件操作:
json.load(file)读取JSON文件,将内容转为Python字典。json.dump(Key, file, indent=4, ensure_ascii=False)写入文件,indent=4美化格式,ensure_ascii=False支持非ASCII字符(如中文)。- 通俗解释:JSON是文本格式,像记事本记录密码;
json模块是“翻译器”,把Python数据转成文本或反之。
-
安全输入:
getpass.getpass()- 功能:提示用户输入时隐藏内容(输入不显示在屏幕),防止旁观者偷窥。
- 安全优势:比
input()更安全,适用于密码等敏感信息。 - 示例:在命令行输入时,用户看不到键入的字符,类似银行ATM输密码。
-
错误处理与鲁棒性:
- 函数检查文件存在性和密钥有效性,但未显式处理异常(如文件读写错误)。在实际项目中,可添加
try-except块捕获错误,增强健壮性。 - 建议:例如:
try: with open(file_path, "r", encoding="utf-8") as file: Key = json.load(file) except FileNotFoundError: # 处理文件不存在
- 函数检查文件存在性和密钥有效性,但未显式处理异常(如文件读写错误)。在实际项目中,可添加
4.4 函数测试与运行
样例末尾的if __name__ == "__main__":块用于测试:
if __name__ == "__main__":
print(load_key("LANGSMITH_API_KEY"))
- 行为:直接运行脚本时,提示用户输入密钥,并在控制台打印值。
- 结果:输入密钥后,在
config文件夹生成Keys.json文件,存储密钥。 - 通俗解释:这是“自检模式”,像开机测试密码箱是否工作正常。
5. 整体部署流程演示
基于样例,LangChain大模型交互步骤总结:
1、安装依赖:在终端运行pip install langchain langchain_community。
2、创建配置文件:在项目目录新建config文件夹,放入load_key.py。
#load_key.py
import os
import json
import getpass
def load_key(keyname: str) -> object:
# 🔥 核心修改:获取当前脚本所在的目录,拼接Keys.json路径
# 获取当前脚本的绝对路径
script_path = os.path.abspath(__file__)
# 获取脚本所在的文件夹目录
script_dir = os.path.dirname(script_path)
# 强制将Keys.json保存在脚本同一目录下
file_path = os.path.join(script_dir, "Keys.json")
# 如果配置文件存在
if os.path.exists(file_path):
with open(file_path, "r", encoding="utf-8") as file:
Key = json.load(file)
# 如果键存在且非空,直接返回
if keyname in Key and Key[keyname]:
return Key[keyname]
# 键不存在或为空,让用户输入并更新文件
else:
keyval = getpass.getpass(f"配置文件中未找到 {keyname},请输入对应配置信息: ").strip()
Key[keyname] = keyval
with open(file_path, "w", encoding="utf-8") as file:
json.dump(Key, file, indent=4, ensure_ascii=False)
return keyval
# 如果配置文件不存在,新建文件并写入键值
else:
keyval = getpass.getpass(f"配置文件不存在,请输入 {keyname} 配置信息: ").strip()
Key = {
keyname: keyval
}
with open(file_path, "w", encoding="utf-8") as file:
json.dump(Key, file, indent=4, ensure_ascii=False)
return keyval
if __name__ == "__main__":
print(load_key("LANGSMITH_API_KEY"))

3、设置环境变量:在主脚本中导入load_key,设置os.environ。

4、运行测试:执行脚本,输入API_KEY,自动生成Keys.json。

5、验证:访问LangSmith平台查看调用记录。
安全提示:永远不要将Keys.json上传到GitHub等公开平台,用.gitignore文件忽略它。
6. 总结
LangChain大模型交互的核心是安全性和自动化。load_key函数体现了Python在系统工具开发中的优势:
- 安全性:通过文件隔离和隐藏输入保护密钥。
- 自动化:处理配置文件生命周期,减少手动错误。
- 可扩展:易于适配新密钥(如其他大模型API)。 即使您是编程新手,理解这些知识点后,也能高效部署LangChain。如果您有具体问题(如修改函数或集成其他工具),欢迎进一步讨论!
二、访问国内相关大模型
访问国内大模型平台如火山引擎旗下的火山方舟,是开发者高效利用AI资源的关键步骤。以下内容基于样例进行知识点梳理,包括平台操作流程和API调用代码的详细解析,旨在帮助用户掌握核心概念和实践技巧。
1. 火山方舟平台操作流程
火山方舟提供了用户友好的界面来管理AI模型资源。操作步骤如下:
- 步骤1:登录与项目创建
访问火山方舟管理控制台后,登录账号。在“账号全部资源”页面,点击“管理项目”并新建项目。项目名称可自定义,完成后点击确定。这一步的目的是隔离资源,避免不同任务间的冲突。



- 步骤2:资源分配与接入点创建
返回首页,将“账号全部资源”调整到新建项目中。随后进入“在线推理”界面,点击“创建接入点”。接入点名称可自定义,推理模式选择“指定单一模型”(适合测试学习),接入模型推荐选择“DeepSeek-V3.2”(提供免费token额度)。点击“创建并接入”完成设置。这一步的核心是配置模型访问入口,确保资源高效利用。



- 步骤3:API调用准备
在开发环境(如PyCharm或Jupyter)中,需先创建API密钥(在火山方舟平台生成),并安装依赖包:




-
这里强调依赖管理的重要性:# 安装OpenAI工具包(用于通用AI调用) !pip install openai # 安装LangChain的DeepSeek扩展(提供额外功能) !pip install -U "langchain[deepseek]"openai包支持基础API交互,而langchain扩展增强了模型集成能力。
2. API调用代码知识点梳理
以下代码展示了如何调用火山方舟模型,分为多个模块进行解析。每个模块对应一个关键概念:
模块1:导入工具包
import os # 操作系统接口,用于管理环境变量和文件
from openai import OpenAI # OpenAI客户端,支持通用AI模型调用
from config.load_key import load_key # 自定义密钥管理工具,安全存储API密钥
知识点:
os模块:用于读取和设置环境变量(如os.environ),环境变量是临时存储配置的“内存笔记本”,程序运行时动态访问。OpenAI类:提供标准化的API客户端,可适配不同平台(如火山方舟)。- 密钥管理:
load_key是自定义函数,优先从安全存储加载密钥,避免硬编码风险(如密钥泄露)。
模块2:设置LangSmith监控
os.environ["LANGSMITH_TRACING"] = "true" # 启用调用追踪
os.environ["LANGSMITH_PROJECT"] = "firstLangChainDemo" # 设置监控项目名
os.environ["LANGSMITH_API_KEY"] = load_key("LANGSMITH_API_KEY") # 加载LangSmith密钥
知识点:
- LangSmith作用:AI调用监控工具,记录请求和响应(如错误分析、性能优化)。启用后(
"true"),数据可在线查看。 - 项目命名:自定义名称(如
"firstLangChainDemo")便于在监控平台筛选日志。 - 密钥安全:通过
load_key动态加载,减少代码中的敏感信息暴露。
模块3:加载火山方舟API密钥
if not os.environ.get("ARK_API_KEY"): # 检查环境变量是否已存在密钥
os.environ["ARK_API_KEY"] = load_key("ARK_API_KEY") # 不存在则加载并存储

知识点:
- 条件检查:使用
if not os.environ.get(...)避免重复设置密钥。 - 密钥命名:
ARK_API_KEY是火山方舟专用标识,需在平台生成。 - 安全实践:密钥不直接写入代码,而是通过环境变量传递,降低安全风险。
模块4:创建OpenAI客户端
client = OpenAI(
base_url="https://ark.cn-beijing.volces.com/api/v3", # 火山方舟API地址
api_key=os.environ.get("ARK_API_KEY"), # 从环境变量获取密钥
)
知识点:
- 客户端配置:
base_url指向火山方舟的API端点(需确认区域,如cn-beijing)。 - 密钥传递:
api_key参数从环境变量动态读取,确保灵活性(如多环境部署)。 - 通用性:
OpenAI客户端兼容多种平台,只需调整base_url。
模块5:模型调用与对话管理
# 第一次对话:基础请求
print("----- standard request -----")
completion = client.chat.completions.create(
model="ep-20260418160150-lhf9g", # 模型ID(在火山方舟接入点生成)
messages=[
{"role": "system", "content": "你是人工智能助手"}, # 设定AI角色
{"role": "user", "content": "你好"}, # 用户输入
],
)
print(completion.choices[0].message.content) # 输出AI回复
# 第二次对话:继续提问
print("\n----- 继续提问:深度学习中几种常见的网络模型 -----")
completion2 = client.chat.completions.create(
model="ep-20260418160150-lhf9g", # 同一模型ID
messages=[
{"role": "system", "content": "你是人工智能助手,专业讲解深度学习知识,条理清晰"}, # 更新角色
{"role": "user", "content": "深度学习中几种常见的网络模型,只输出网络模型的名字即可,不用过多解释"}, # 具体问题
],
)
print("助手回复2:", completion2.choices[0].message.content) # 输出回复


知识点:
- 模型ID:
model参数需匹配火山方舟接入点生成的ID(如ep-20260418160150-lhf9g),唯一标识模型实例。 - 消息结构:
messages为列表,包含role(system、user、assistant)和content,支持多轮对话。 - 角色设定:
system角色定义AI行为(如“专业讲解”),影响回复风格。 - 输出处理:
completion.choices[0].message.content提取AI回复的首选项内容。 - 对话连续性:多次调用可基于同一
client,保持会话状态(如需上下文,可追加历史消息)。
完整测试代码:
# 1. 导入系统工具包:os是电脑系统的"小助手",帮我们管理电脑里的文件、设置等
import os
# 2. 导入AI聊天工具:OpenAI是一个通用的AI调用工具,我们用它来连接火山方舟的AI模型
from openai import OpenAI
# 3. 导入密钥管理工具:load_key是我们自己写的"密码保管器",专门存API密钥(密码)
# config.load_key 表示从config文件夹里的load_key文件中导入这个工具
from config.load_key import load_key
# ===================== 第一部分:设置AI调用监控工具(LangSmith) =====================
# 知识点:环境变量 = 电脑里的一个"临时小本子",用来存配置信息,程序运行时可以读取
# 开启LangSmith监控功能:等于打开"监控开关",记录AI的调用过程
os.environ["LANGSMITH_TRACING"] = "true"
# 给监控项目起名字:方便我们在LangSmith网站上找到这个AI调用的记录
os.environ["LANGSMITH_PROJECT"] = "firstLangChainDemo"
# 给LangSmith设置密钥:用我们的"密码保管器"load_key读取密钥,赋值给环境变量
# load_key("LANGSMITH_API_KEY") = 自动找密码,找不到就提示我们输入,然后永久保存
os.environ["LANGSMITH_API_KEY"] = load_key("LANGSMITH_API_KEY")
# ===================== 第二部分:加载火山方舟AI的密钥(开门钥匙) =====================
# 知识点:API密钥 = 打开AI服务的"唯一钥匙",没有钥匙就无法使用AI模型
# 判断:电脑的"临时小本子"里有没有火山方舟的钥匙(ARK_API_KEY)
if not os.environ.get("ARK_API_KEY"):
# 如果没有钥匙,就用"密码保管器"load_key读取/保存钥匙,存到临时小本子里
os.environ["ARK_API_KEY"] = load_key("ARK_API_KEY")
# ===================== 第三部分:连接AI服务器(创建聊天客户端) =====================
# 创建一个AI聊天客户端:等于打开一个"AI聊天窗口",准备和AI对话
client = OpenAI(
# 设置AI服务器地址:火山方舟AI的官方网址(相当于AI的"家庭住址")
base_url="https://ark.cn-beijing.volces.com/api/v3",
# 读取钥匙:从电脑的"临时小本子"里拿出火山方舟的钥匙,验证身份
api_key=os.environ.get("ARK_API_KEY"),
)
# ===================== 第四部分:第一次和AI对话 =====================
# 打印分隔线:在屏幕上输出一行文字,用来区分不同的对话内容
print("----- standard request -----")
# 调用AI模型:向AI发送问题,等待AI回复
# completion = 存储AI的回复结果
completion = client.chat.completions.create(
# 指定用哪个AI模型:火山方舟里我们创建的AI模型ID(相当于指定哪个AI大脑回答问题)
model="ep-20260418160150-lhf9g",
# 对话内容:列表格式,存放我们和AI的对话记录
messages=[
# 给AI设定身份:告诉AI"你是一个人工智能助手"
{"role": "system", "content": "你是人工智能助手"},
# 我们向AI提问:说"你好"
{"role": "user", "content": "你好"},
],
)
# 打印AI的回复:把AI说的话输出到屏幕上
print(completion.choices[0].message.content)
# ===================== 第五部分:第二次和AI对话(继续提问) =====================
# 打印分隔线:标记第二次提问的开始,方便看结果
print("\n----- 继续提问:深度学习中几种常见的网络模型 -----")
# 再次调用AI模型,发送新的问题
completion2 = client.chat.completions.create(
# 用同一个AI模型回答问题
model="ep-20260418160150-lhf9g",
# 新的对话内容
messages=[
# 重新设定AI身份:让AI变成专业的深度学习老师
{"role": "system", "content": "你是人工智能助手,专业讲解深度学习知识,条理清晰"},
# 我们的新问题:要求AI只输出网络模型名字,不解释
{"role": "user", "content": "深度学习中几种常见的网络模型,只输出网络模型的名字即可,不用过多解释"},
],
)
# 打印AI的第二次回复
print("助手回复2:", completion2.choices[0].message.content)
更多推荐

所有评论(0)