LangChain学习笔记 - 2.Hello World

0 阅读8分钟

LangChain学习笔记 - Hello World

第一部分:常用网站与资源

以下是笔者在学习期间(以及未来工作中)经常使用的大模型相关网站:

大模型供应商聚合平台

主流大模型服务平台

平台名称核心特点优势适用场景典型应用案例
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

官方文档


第二部分:获取大模型调用凭证(三件套)

以阿里云百炼平台为例,演示如何获取调用大模型所需的三个关键信息。

前置准备: 登录 阿里云百炼平台

步骤 1:获取 API Key

2.1.png

步骤 2:获取模型名称

2.2.png

2.3.png

步骤 3:获取 Base URL(API 基础地址)

2.4.png

第三部分: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}")

2.5.png

第三步: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)

2.6.png

缺点:

  • 极不安全: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__" 避免导入时执行代码