LangChain 架构与环境搭建

探索 LangChain 的强大能力------这是一个简化 AI 应用开发的 Python 框架。本教程面向具备 Python 开发经验的中级开发者,涵盖安装步骤、架构设计、核心组件介绍,以及动手实践项目搭建。

学习目标

  • 理解 LangChain 是什么,以及它为何对 AI 开发至关重要
  • 掌握 LangChain 的核心架构与组件层级关系
  • 学会使用 pip 在 Python 中安装 LangChain,并配置开发环境
  • 逐步构建你的第一个 LangChain Python 应用

前置要求:本教程适合谁?

本中级教程假设你已具备以下条件:

  • 基础的 Python 编程知识
  • 已完成第一阶段(AI 基础知识)或具备同等经验
  • 系统中已安装 Python 3.8 或更高版本
  • 熟悉 pip 包管理工具

什么是 LangChain?

LangChain 是一个专为简化大语言模型(LLM)驱动应用开发而设计的强大框架。它提供了一系列工具和抽象层,使构建复杂的 AI 应用变得更加容易。

你可以把 LangChain 看作:

AI 开发领域的 "React" 或 "Django" ------ 它为基于 LLM 的应用提供了结构化支持、最佳实践和可复用的组件。

🚀 没有 LangChain 时你会面临:

✗ 为每个 LLM 集成重复编写样板代码

✗ 手动处理提示模板(prompt templates)和格式化逻辑

✗ 自行实现记忆(memory)管理系统

✗ 从零开始构建自定义链(chains)和工作流

✨ 使用 LangChain 后你能获得:

✓ 所有 LLM 提供商的统一接口

✓ 内置的提示模板与管理功能

✓ 开箱即用的记忆机制与对话历史支持

✓ 预构建的常用模式链(pre-built chains)

LangChain 架构:核心组件层级

  1. 模型(Models)🤖
    基础层------提供与各类大语言模型(如 OpenAI、Anthropic 等)的接口
    示例:ChatOpenAI、ChatAnthropic、Ollama
  2. 提示(Prompts)📝
    用于创建高效提示的模板与格式化工具
    示例:PromptTemplate、ChatPromptTemplate、FewShotPromptTemplate
  3. 记忆(Memory)🧠
    用于维护对话上下文与历史记录的系统
    示例:ConversationBufferMemory、ConversationSummaryMemory
  4. 链(Chains)⛓️
    将模型、提示和记忆组合成可复用的工作流
    示例:LLMChain、ConversationChain、RetrievalQA
  5. 智能体(Agents)🤖
    能自主决策并调用工具或链的智能执行者
    示例:AgentExecutor、Tools、ReActAgent

💡 关键洞察:每个组件都建立在前一层之上。你从模型开始,加入提示,按需引入记忆,通过链将它们组合起来,最终构建能处理复杂任务的智能体。

🌟 支持的 LLM 提供商

LangChain 通过统一接口支持多种模型提供商:

  • Google:Gemini
  • OpenAI:GPT-4、GPT-3.5
  • Anthropic:Claude
  • 本地模型:Ollama、LlamaCpp

如何在 Python 中安装 LangChain:分步设置指南

设置步骤

  1. 安装 LangChain 及相关依赖:
python 复制代码
pip install langchain langchain-google-genai langchain-community python-dotenv

本文的版本:

复制代码
dependencies = [
    "anthropic>=0.79.0",
    "google-genai>=1.63.0",
    "langchain>=1.2.10",
    "langchain-community>=0.4.1",
    "langchain-google-genai>=4.2.0",
    "python-dotenv>=1.2.1",
]

注意:当前大模型所有技术都在一个飞速发展和变更的时代,所以不同的版本api有可能不同,主要是学习相关思想。

  1. 创建项目结构:
python 复制代码
my-langchain-app/
├── .env
└── app.py

你的第一个 LangChain 应用

基础示例:构建一个智能助手

我们将使用 LangChain 创建一个简单的助手应用:

  1. 首先获取 Google AI API 密钥:
  • 访问 Google AI Studio
  • 点击 "Create API Key"(免费使用)
  • 复制你的 API 密钥

没有VPN的可以自己用Ollama搭建一个大模型,本地使用,不要太在意大模型,主要是学习流程和思路。

复制代码
# 创建 .env 文件
GOOGLE_API_KEY=AIza...your-api-key-here...
  1. 编写 LangChain 应用代码:
python 复制代码
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_core.prompts import ChatPromptTemplate
import os
from dotenv import load_dotenv

# 加载环境变量
load_dotenv()

# 初始化模型
llm = ChatGoogleGenerativeAI(
    model="gemini-2.5-flash",  # 使用最新模型
    temperature=0.7
)

# 创建提示模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个乐于助人、能清晰解释概念的助手。"),
    ("human", "请用简单易懂的方式解释 {topic}")
])

# 使用新语法构建链(注意:LLMChain 已弃用)
chain = prompt | llm

# 执行链
result = chain.invoke({"topic": "量子计算"})
print(result.content)

结果:

复制代码
好的,我们来用最简单的方式理解量子计算!

---

想象一下,我们现在用的电脑(叫做"经典电脑")是怎么工作的:

1.  **经典电脑:像一个开关**
    *   它用"位"(bit)来存储信息。
    *   一个位就像一个电灯开关,它要么是"开"(1),要么是"关"(0)。
    *   经典电脑一次只能处理一个开关的状态。比如,如果要算两个数,它得先算第一个,再算第二个。

---

现在,我们来看看**量子电脑**:

1.  **量子电脑:像一个会转的硬币**
    *   它用"量子位"(qubit)来存储信息。
    *   一个量子位可厉害了,它不只是"开"或"关"那么简单,它有三个神奇的特性:

    *   **特性一:叠加态 (Superposition)**
        *   想象一个硬币在空中旋转。在它落地之前,它既不是正面也不是反面,而是**同时是正面和反面的结合体**!
        *   一个量子位也能这样:它**可以同时是0和1**。
        *   **这有什么用?** 经典电脑要一个一个地尝试所有可能性,而量子电脑可以一次性同时考虑很多很多种可能性!就像你不是只走一条路,而是同时走所有可能的路。

    *   **特性二:纠缠 (Entanglement)**
        *   想象你和朋友各拿着一枚神奇的硬币,无论你们相隔多远,只要你的硬币一落地是正面,你朋友的硬币就**立刻**(没有时间延迟地)变成反面,反之亦然。它们之间有一种神秘的联系。
        *   量子位也能这样:两个或多个量子位可以"纠缠"在一起。它们的状态是相互关联的,即使相距遥远,一个量子位的变化会**瞬间**影响到另一个。
        *   **这有什么用?** 这种关联性让量子电脑能够处理更加复杂和庞大的计算,它们不再是独立工作的,而是形成一个巨大的、相互影响的网络。

    *   **特性三:干涉 (Interference)**
        *   就像水波一样,两个波相遇时,它们可以相互抵消(让波变小)或者相互增强(让波变大)。
        *   量子电脑利用这种特性,让正确的答案相互增强,让错误的答案相互抵消,从而更快地找到正确的解。

---

**简单来说,量子计算就是:**

经典电脑像一个只能走一条路的普通人,一步一步地解决问题。
量子电脑像一个拥有魔法的人,他可以:
1.  **同时走所有可能的路**(叠加态)。
2.  **让这些路之间产生神秘的联系**(纠缠态)。
3.  **让正确的路越来越明显,错误的路消失**(干涉)。

所以,对于某些**非常非常复杂**的问题(比如模拟新药分子、破解最强的密码、优化复杂的物流路线、在海量数据中寻找模式),量子电脑能比经典电脑快上亿万倍,甚至能解决经典电脑根本无法解决的问题。

**它不是要取代我们现在所有的电脑,而是为了解决那些最尖端、最烧脑的科学和技术难题。**
这段代码做了什么?
  • 初始化 ChatGoogleGenerativeAI 模型(建议使用当前可用的最新 Gemini 模型)
  • 创建包含 system 和 human 消息的提示模板
  • 使用管道操作符 | 组合提示与模型(这是当前推荐的新语法)
  • 传入输入主题并执行链

注意:请使用最新的 Gemini 模型,具体可用模型请参考 Google AI 官方文档

重要更新:LLMChain 类已被弃用,请改用 prompt | llm 的管道语法。

为应用添加记忆功能

为什么需要记忆?

如果没有记忆,每次与 AI 的交互都是孤立的------它无法记住之前的对话内容。这使得自然对话或上下文感知应用几乎无法实现。

❌ 无记忆示例:

用户:"我叫 Alice。"

AI:"很高兴认识你!"

用户:"我叫什么名字?"

AI:"我不知道你的名字。"

✅ 有记忆示例:

用户:"我叫 Alice。"

AI:"很高兴认识你,Alice!"

用户:"我叫什么名字?"

AI:"你叫 Alice。"

我们在此添加了以下功能:
  • RunnableWithMessageHistory:存储完整的对话历史
  • 记忆集成:自动将历史消息包含在每次请求中
  • 上下文保持:确保多轮对话的连贯性
python 复制代码
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistory  # 内存存储
from dotenv import load_dotenv

load_dotenv()

# 初始化模型
llm = ChatGoogleGenerativeAI(
    model="gemini-2.5-flash",
    temperature=0.7
)

# 创建提示模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个乐于助人的助手。请结合对话历史提供上下文相关的回答。"),
    ("placeholder", "{chat_history}"),  # 自动注入历史消息
    ("human", "{input}")
])

# 构建基础链
chain = prompt | llm

# 存储会话历史(这里用内存,生产环境可用 Redis 等)
store = {}

def get_session_history(session_id: str) -> BaseChatMessageHistory:
    if session_id not in store:
        store[session_id] = ChatMessageHistory()
    return store[session_id]

# 包装为带历史记录的 runnable
with_message_history = RunnableWithMessageHistory(
    chain,
    get_session_history,
    input_messages_key="input",
    history_messages_key="chat_history",
)

# 使用示例
config = {"configurable": {"session_id": "alice_session_1"}}

response1 = with_message_history.invoke(
    {"input": "你好,我叫 Alice"},
    config=config
)
print(response1.content)

response2 = with_message_history.invoke(
    {"input": "我叫什么名字?"},
    config=config
)
print(response2.content)

response3 = with_message_history.invoke(
    {"input": "给我讲个关于我名字的笑话"},
    config=config
)
print(response3.content)

结果:

复制代码
你好 Alice!很高兴认识你。有什么我可以帮助你的吗?
你的名字是 Alice。
好的,Alice!这是一个关于你名字的笑话:

为什么 Alice 总是随身带着一本笔记本?
因为她总是发现事情变得"好奇妙又好奇妙"(curiouser and curiouser)!

希望你喜欢!😄

神奇之处:该对话链会自动记住之前的交互内容,使 AI 能够引用对话早期的信息!

记忆模块详解

注意:0.2+的langchain版本将不再使用from langchain.memory import ConversationBufferMemory作为记忆模块,RunnableWithMessageHistory 取代 ConversationBufferMemory,支持更强大的历史管理和 LCEL 集成。

上面关键代码讲解:

python 复制代码
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个助手..."),
    ("placeholder", "{chat_history}"),  # ← 这里预留位置放历史
    ("human", "{input}")                # ← 用户当前的问题
])
  • {input}:用户这次问的问题(比如 "我叫 Alice")
  • {chat_history}:之前所有的对话记录(AI 自动填入)
python 复制代码
chain = prompt | llm
  • 这个 chain 期待一个字典输入:{"input": "...", "chat_history": [...]}
python 复制代码
store = {}  # 用字典模拟数据库,key 是 session_id

def get_session_history(session_id: str):
    if session_id not in store:
        store[session_id] = ChatMessageHistory()  # 创建新会话
    return store[session_id]
  • 这个函数告诉 LangChain:"你要的历史存在哪?我来给你拿"
python 复制代码
with_message_history = RunnableWithMessageHistory(
    chain,
    get_session_history,
    input_messages_key="input",        # 告诉它:用户输入在字典的哪个 key
    history_messages_key="chat_history" # 告诉它:历史消息放哪个 key
)

✅ RunnableWithMessageHistory 的作用:

每次你调用 invoke({"input": "xxx"}, config={"session_id": "foo"}),它会:

  1. 调用 get_session_history("foo") 拿到历史
  2. 把历史 + 新问题组装成 {"input": "xxx", "chat_history": [msg1, msg2, ...]}
  3. 传给你的 chain
  4. 把 AI 的回答 自动存回历史
存储模块极简模板
python 复制代码
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.chat_history import BaseChatMessageHistory
from your_llm_import import YourLLM  # 如 ChatGoogleGenerativeAI

# 1. 模型
llm = YourLLM(...)

# 2. Prompt(必须有 {history} 占位符)
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是个聪明的助手"),
    ("placeholder", "{history}"),
    ("human", "{question}")
])

# 3. Chain
chain = prompt | llm

# 4. 历史存储
store = {}
def get_history(session_id: str) -> BaseChatMessageHistory:
    if session_id not in store:
        store[session_id] = ChatMessageHistory()
    return store[session_id]

# 5. 包装
chain_with_history = RunnableWithMessageHistory(
    chain,
    get_history,
    input_messages_key="question",
    history_messages_key="history"
)

# 6. 使用
resp = chain_with_history.invoke(
    {"question": "你好!"},
    config={"configurable": {"session_id": "user123"}}
)
print(resp.content)

再一次强调,langchain版本迭代飞快,api一直在不断地修改的迭代,主要理解代码思路,而不是api。

常见的 LangChain 模式

📝 模板链(Template Chaining)

将多个提示组合,实现复杂工作流

PromptTemplate → LLMChain → 输出

💬 对话式 AI(Conversational AI)

结合记忆与上下文,构建聊天机器人

Memory + ConversationChain

🔍 问答系统(Question Answering)

基于文档内容回答问题

Documents → RetrievalQA

🤖 自主智能体(Autonomous Agents)

能调用工具并做出决策的 AI

Tools + Agent + AgentExecutor

✨ LangChain 最佳实践

开发方面

  • 使用环境变量管理 API 密钥
  • 从简单功能起步,逐步增加复杂度
  • 上线前充分测试提示效果
  • 调试链时启用 verbose=True

架构设计

  • 将提示逻辑与业务逻辑分离
  • 根据场景选择合适的记忆类型
  • 妥善处理异常和错误
  • 监控 token 使用量与成本

🎉 下一步

干得漂亮!你现在已经掌握了 LangChain 的基础知识。接下来,我们将深入学习 提示模板(Prompt Templates) 与 输出解析器(Output Parsers),以构建更强大的 AI 应用。

相关推荐
够快云库2 小时前
制造业非结构化数据治理架构解析
架构·企业文件安全·企业文件管理
墨者阳2 小时前
Redis 架构三部曲:单机、主备、集群的本质差异、性能陷阱与哈希设计精髓
redis·架构·哈希算法
蓝天星空2 小时前
企业总线、注册中心、网关三者的区别
后端·架构
玄〤2 小时前
RabbitMQ高级篇总结(黑马微服务课day11)(包含黑马商城业务改造)
java·分布式·spring cloud·微服务·架构·rabbitmq
钛态2 小时前
Flutter for OpenHarmony 实战:Supabase — 跨平台后端服务首选
flutter·ui·华为·架构·harmonyos
AC赳赳老秦2 小时前
多云协同趋势下的AI新范式:DeepSeek适配多云架构实现工作负载跨云迁移的深度解析
网络·人工智能·安全·web安全·架构·prometheus·deepseek
vx-bot5556662 小时前
企业微信ipad协议在混合架构中的消息状态同步实践
架构·企业微信·ipad
SunnyRivers3 小时前
提示模板与输出解析器
langchain·提示词模板·输出解析器