LangChain学习笔记 - Hello World
第一部分:常用网站与资源
以下是笔者在学习期间(以及未来工作中)经常使用的大模型相关网站:
大模型供应商聚合平台
- AI Base - 大模型供应商聚合 - 一站式对比各大模型厂商
主流大模型服务平台
| 平台名称 | 核心特点 | 优势 | 适用场景 | 典型应用案例 |
|---|---|---|---|---|
| CloseAI | 专注亚太地区优化的 GPT 系列接口服务,支持多语言、低延迟响应 | 本地化部署友好,合规性高 | 企业级合规需求 | 跨国企业亚太区客服系统 |
| OpenRouter | 聚合多家大模型(OpenAI、Anthropic、Cohere 等),支持一键切换 | 模型选择灵活,成本可控,支持 A/B 测试 | 多模型对比、动态路由 | 多模型智能客服路由系统 |
| 阿里云百炼 | 提供通义千问系列模型,支持企业级微调、部署、监控一体化 | 性能接近 GPT-4,价格较低,新用户赠送 5000 万 Tokens 免费额度 | 企业级应用 | 金融风控建模、工业质检报告生成 |
| 百度千帆 | 基于文心大模型,支持多模态(文本、图像、语音),提供低代码开发工具 | 模型全面,支持多场景定制化 | 快速原型开发 | 教育行业智能助教、电商文案生成 |
| 硅基流动 | 专注 AI 基础设施,提供开源大模型 API(Qwen2、GLM4、Yi1.5 等)永久免费 | 性价比高,降低开发门槛 | 技术开发者应用开发 | 开源模型应用孵化器 |
| Ollama | 支持本地部署,集成多种开源模型(Llama3、Mistral 等),隐私保护优先 | 强调用户隐私和自主性 | 离线环境或内网部署 | 政府/军工内部知识问答系统 |
| Hugging Face | 全球最大开源模型社区,提供模型、数据集、推理 API、Spaces 等 | 社区活跃,资源丰富,支持一键部署和微调 | 学术研究、前沿探索 | 模型微调实验 |
| Fireworks AI | 推理高性能平台,支持 Llama3、Mixtral、Qwen 等,主打低延迟、高吞吐量 | 推理速度极快,适合高并发场景 | 实时聊天、推荐系统 | 实时客服机器人 |
| Together AI | 提供高性能开源模型 API(Llama3、Mixtral、Stable Diffusion 等) | 支持多模型并行推理,价格透明 | 多模型协作场景 | 多模型协作内容生成 |
| Groq | 基于自研 LPU(语言处理单元),推理速度极快(毫秒级响应) | 延迟极低,适合实时交互 | 语音助手、游戏 NPC 对话 | 实时语音助手、游戏智能 NPC |
官方文档
- LangChain 中文文档 - 官方授权的中文翻译版本
- LangChain 英文文档 - 最新原版文档
第二部分:获取大模型调用凭证(三件套)
以阿里云百炼平台为例,演示如何获取调用大模型所需的三个关键信息。
前置准备: 登录 阿里云百炼平台
步骤 1:获取 API Key
步骤 2:获取模型名称
步骤 3:获取 Base URL(API 基础地址)
第三部分:Hello World - 快速开始(以deepseek为例)
第一步:环境准备
系统要求:
- Python: 3.9+(推荐 3.10 或 3.11,版本过高可能导致 LangChain 兼容性问题)
- langchain: LangChain 核心框架(1.0+ 版本)
- langchain-community: LangChain 社区扩展包
- python-dotenv: 环境变量管理工具
1. 创建 Conda 环境
打开终端(PowerShell 或 CMD),执行以下命令:
# 创建名为 langchain 的 Python 3.10 环境
conda create -n langchain python=3.10 -y
2. 激活环境
# Windows PowerShell/CMD
conda activate langchain
# macOS/Linux
source activate langchain
验证激活成功: 命令行前面会显示 (langchain) 前缀。
3. 安装依赖包
在已激活的环境中执行:
# 方式一:使用 conda 安装(稳定)
conda install -c conda-forge langchain langchain-community -y
# 方式二:使用 pip 安装(推荐,版本更新)
pip install langchain langchain-community python-dotenv
建议: 优先使用 pip 安装,因为 LangChain 更新频繁,PyPI 上的版本通常更新。
第二步:验证安装
运行以下代码检查安装是否成功:
# 导入 LangChain 核心库
import langchain
# 导入 LangChain 社区库(包含第三方工具和扩展)
import langchain_community
# 导入 Python 系统库,用于获取版本信息
import sys
# 打印版本信息
print("LangChain 版本:" + langchain.__version__)
print("LangChain Community 版本:" + langchain_community.__version__)
print("LangChain 安装路径:" + langchain.__file__)
print(f"Python 版本:{sys.version}")
第三步:API Key 的三种配置方式
方式一:硬编码方式(❌ 不推荐)
代码示例:
from langchain.chat_models import init_chat_model
model = init_chat_model(
model="deepseek-chat",
model_provider="deepseek",
# 直接写死在代码中
api_key="sk-xxxxxxxxxxxxx",
base_url="https://api.deepseek.com"
)
print(model.invoke("你是谁").content)
缺点:
- ❌ 极不安全:API Key 暴露在代码中
- ❌ 无法共享代码:提交到 Git 会泄露密钥
- ❌ 维护困难:更换密钥需要修改代码
使用场景: 仅限个人本地快速测试,绝不建议用于生产环境。
方式二:系统环境变量(⭐ 推荐)
代码示例:
import os
from langchain.chat_models import init_chat_model
model = init_chat_model(
model="deepseek-chat",
model_provider="deepseek",
api_key=os.getenv("DEEPSEEK_API_KEY"),
base_url="https://api.deepseek.com"
)
print(model.invoke("你是谁").content)
配置方法:
Windows PowerShell:
# 临时设置(当前终端有效)
$env:DEEPSEEK_API_KEY="sk-xxxxxxxxxxxxx"
# 永久设置(重启后有效)
[System.Environment]::SetEnvironmentVariable('DEEPSEEK_API_KEY', 'sk-xxxxxxxxxxxxx', 'User')
Linux/macOS:
# 临时设置(当前终端有效)
export DEEPSEEK_API_KEY="sk-xxxxxxxxxxxxx"
# 永久设置(写入 ~/.bashrc 或 ~/.zshrc)
echo 'export DEEPSEEK_API_KEY="sk-xxxxxxxxxxxxx"' >> ~/.bashrc
source ~/.bashrc
优点:
- ✅ 安全性高:密钥不写在代码中
- ✅ 可共享代码:可以安全提交到 Git
- ✅ 跨平台支持:所有操作系统都支持
缺点:
- ⚠️ 配置麻烦:每次新开终端需要重新设置(临时方式)
- ⚠️ 团队协作不便:需要手动告知队友密钥名称和值
使用场景: 个人开发、服务器部署、CI/CD 流程。
方式三:.env 文件方式(🔥 最推荐)
代码示例:
import os
from dotenv import load_dotenv
# dotenv 是一个环境变量管理工具,可以让你在项目中安全、方便地存储和加载配置信息
# 用 .env 文件存放敏感配置(如密码、API 密钥),代码中像用普通变量一样读取它们,避免将敏感信息直接写进代码
# 务必将 .env 添加到 .gitignore 中
# 在 .env.example 中保存变量名示例(不含真实值)供团队参考
# 生产环境(如服务器)通常直接在系统环境变量中设置
from langchain.chat_models import init_chat_model
# 先加载 .env 文件中的环境变量
load_dotenv(encoding='utf-8')
model = init_chat_model(
model="deepseek-chat",
model_provider="deepseek",
api_key=os.getenv("deepseek-api"),
base_url=os.getenv("deepseek-url")
)
print(model.invoke("你是谁").content)
配置步骤:
步骤 1:创建 .env 文件
在项目根目录创建 .env 文件,内容如下:
# DeepSeek API 密钥
deepseek-api=sk-xxxxxxxxxx
# DeepSeek Base URL
deepseek-url=https://api.deepseek.com
步骤 2:创建 .gitignore 文件(⚠️ 必须!)
# 忽略 .env 文件,防止密钥泄露
.env
优点:
- ✅ 最安全:密钥文件被 Git 忽略
- ✅ 团队协作友好:通过
.env告知需要的密钥 - ✅ 管理方便:所有密钥集中管理,易于更换
- ✅ 多环境支持:可为不同环境创建不同的
.env文件(如.env.dev、.env.prod)
缺点:
- ⚠️ 需要额外依赖:需安装
python-dotenv库 - ⚠️ 文件管理:需要确保
.env文件存在
使用场景: 团队协作、多环境部署、生产环境。
三种方式对比总结
| 特性 | 硬编码 | 系统环境变量 | .env 文件 |
|---|---|---|---|
| 安全性 | ❌ 极低 | ✅ 高 | ✅✅ 最高 |
| 可共享代码 | ❌ 不可以 | ✅ 可以 | ✅✅ 可以 |
| 配置便利性 | ✅ 最简单 | ⚠️ 较麻烦 | ✅✅ 方便 |
| 团队协作 | ❌ 困难 | ⚠️ 一般 | ✅✅ 友好 |
| 多环境支持 | ❌ 不支持 | ⚠️ 一般 | ✅✅ 优秀 |
| 推荐指数 | ❌ 不推荐 | ⭐⭐ 推荐 | ⭐⭐⭐ 最推荐 |
第四部分:企业级工程化实践
以下是一个符合企业级开发规范的完整示例,展示了如何封装 LLM 调用代码。
# 导入必要的库
from langchain_openai import ChatOpenAI
import os
from dotenv import load_dotenv
from langchain_core.exceptions import LangChainException
# 加载.env文件中的环境变量(指定编码,避免中文乱码)
load_dotenv(encoding='utf-8')
# 配置日志(可选,便于调试)
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
def init_llm_client() -> ChatOpenAI:
"""
初始化LLM客户端(封装成函数,提高复用性)
Returns:
ChatOpenAI: 初始化后的LLM客户端实例
"""
# 1. 读取环境变量并做非空校验
api_key = os.getenv("QWEN_API_KEY")
if not api_key:
raise ValueError("环境变量 QWEN_API_KEY 未配置,请检查.env文件")
# 2. 初始化LLM客户端(参数命名规范,添加注释)
llm = ChatOpenAI(
model="deepseek-v3.2", # 模型名称
api_key=api_key, # 通义千问API密钥
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", # 阿里云兼容接口地址
temperature=0.7, # 可选:添加温度参数,控制输出随机性
max_tokens=2048 # 可选:限制输出长度,避免超限
)
return llm
def main():
"""主函数:封装核心逻辑,符合Python工程化规范"""
try:
# 初始化客户端
llm = init_llm_client()
logger.info("LLM客户端初始化成功")
# 调用模型(问题用变量存储,提高可读性)
question = "你是谁"
response = llm.invoke(question)
# 格式化输出结果(而非直接打印原始对象)
logger.info(f"问题:{question}")
logger.info(f"回答:{response.content}")
print("====================以下是流式输出,另一种调用方式")
print("*" * 50)
responseStream = llm.stream("介绍下langchain,300字以内")
for chunk in responseStream:
print(chunk.content,end="")
# 捕获具体异常(而非宽泛的Exception)
except ValueError as e:
logger.error(f"配置错误:{str(e)}")
except LangChainException as e:
logger.error(f"模型调用失败:{str(e)}")
except Exception as e:
logger.error(f"未知错误:{str(e)}")
# 脚本入口(符合 Python 规范,避免导入时执行代码)
if __name__ == "__main__":
main()
核心知识点解析
1. 函数封装:将初始化逻辑封装成 init_llm_client() 函数,提高复用性
2. 异常处理:使用 try-except 捕获不同类型的异常
ValueError:配置错误(如 API Key 未设置)LangChainException:LangChain 框架异常Exception:其他未知异常
3. 日志记录:使用 logging 模块替代 print,便于调试和监控
logger.info():记录正常流程信息logger.error():记录错误信息
4. 环境变量校验:在初始化时检查 API Key 是否已配置,提前发现问题
5. 流式输出:演示了 llm.stream() 的用法,适用于实时对话场景
6. 脚本入口规范:使用 if __name__ == "__main__" 避免导入时执行代码