LangChain

技术栈
AI 框架
llmragagentchainprompt-engineeringorchestration

概览

LangChain

LangChain 是当下最流行的 LLM 应用编排框架,由 Harrison Chase 于 2022 年创建。它将大语言模型与外部工具、数据源、记忆连接起来,通过 Chain(链)、Agent(智能体)、RAG(检索增强生成)三大范式构建复杂的 AI 应用。

核心价值:

  • Chain:将 prompt → LLM → 后处理串联为可复用流水线
  • Agent:LLM 自主决策使用哪些工具(搜索、计算、API),ReAct 模式
  • RAG:检索文档 + LLM 生成,解决幻觉与知识截止问题
  • Memory:对话记忆管理,支持缓冲区/摘要/向量等多种策略
  • 多模型:支持 OpenAI、Anthropic、Google、开源模型(Ollama/vLLM)

适用场景: 聊天机器人、知识库问答、文档分析、代码助手、自主 Agent。

安装

环境准备

  • Python:>= 3.9(推荐 3.11)
  • LLM 后端:OpenAI API Key / Anthropic Key / 本地 Ollama / vLLM
  • 向量数据库(RAG 场景):Chroma(轻量内置)或 Pinecone / Milvus / Qdrant
  • 磁盘:Embedding 模型约 1-2 GB

安装命令

最小安装

pip install langchain langchain-openai

常用全家桶

pip install langchain langchain-openai langchain-community \
    chromadb tiktoken unstructured langchain-text-splitters \
    beautifulsoup4 faiss-cpu

特定集成

# Anthropic Claude
pip install langchain-anthropic

# Google Gemini
pip install langchain-google-genai

# 本地 Ollama
pip install langchain-ollama

# RAG 全家桶
pip install langchain chromadb sentence-transformers

配置 API Key

export OPENAI_API_KEY="sk-..."
# 或在代码中:
# import os; os.environ["OPENAI_API_KEY"] = "sk-..."

常见安装问题

Q1: ImportError: cannot import name 'ChatOpenAI' from 'langchain'

LangChain v0.1+ 拆分了包。使用 from langchain_openai import ChatOpenAI

Q2: ChromaDB 安装失败(Windows)

需要 Visual C++ Build Tools。改用 FAISS:pip install faiss-cpu,代码里 from langchain_community.vectorstores import FAISS

Q3: RateLimitError / InsufficientQuotaError

OpenAI 免费额度用完或达到速率限制。添加 max_retries=3request_timeout=60,或切换到本地 Ollama。

示例

LangChain RAG(检索增强生成)Hello World

目标

构建一个最小 RAG 系统:加载文档 → 切分 → 向量化存储 → 检索 → 让 LLM 回答问题。

完整代码

from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate

# ─── 1. 准备文档 ───
with open("knowledge.txt", "w") as f:
    f.write("""Python 是一种解释型、面向对象的编程语言,由 Guido van Rossum 于 1991 年发布。
Python 的设计哲学强调代码可读性,使用缩进代替大括号。
Python 广泛应用于 Web 开发(Django/Flask)、数据科学(NumPy/Pandas)、AI(PyTorch/TensorFlow)。
Python 的包管理器是 pip,虚拟环境用 venv 或 conda 管理。""")

# ─── 2. 加载 → 切分 ───
loader = TextLoader("knowledge.txt")
documents = loader.load()
splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=50)
chunks = splitter.split_documents(documents)
print(f"文档被切分为 {len(chunks)} 个 chunk")

# ─── 3. 向量化存储 ───
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(chunks, embeddings, persist_directory="./chroma_db")
retriever = vectorstore.as_retriever(search_kwargs={"k": 2})

# ─── 4. 构建 RAG Chain ───
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

prompt = ChatPromptTemplate.from_template("""
根据以下上下文回答用户问题。如果上下文中没有答案,请说"我不确定"。
不要编造信息。

上下文:
{context}

问题:{input}
回答:
""")

combine_chain = create_stuff_documents_chain(llm, prompt)
rag_chain = create_retrieval_chain(retriever, combine_chain)

# ─── 5. 提问 ───
questions = [
    "Python 是谁创建的?",
    "Python 在 AI 领域有哪些框架?",
    "Python 是编译型还是解释型?",
]

for q in questions:
    result = rag_chain.invoke({"input": q})
    print(f"\n❓ {q}")
    print(f"💬 {result['answer']}")

运行步骤

pip install langchain langchain-openai chromadb tiktoken
export OPENAI_API_KEY="sk-..."
echo "Python 是一种解释型..." >; knowledge.txt
python rag_hello_world.py

预期输出

文档被切分为 2 个 chunk

❓ Python 是谁创建的?
💬 Python 由 Guido van Rossum 于 1991 年创建。

❓ Python 在 AI 领域有哪些框架?
💬 Python 在 AI 领域使用的框架包括 PyTorch 和 TensorFlow。

❓ Python 是编译型还是解释型?
💬 Python 是一种解释型编程语言。

教程

LangChain 入门教程:四大核心概念

1. Chain:可组合的流水线

Chain 是 LangChain 的核心抽象——将多个步骤串联:

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-3.5-turbo")

# LCEL(LangChain Expression Language)语法
chain = (
    ChatPromptTemplate.from_template("将以下内容翻译为{language}:{text}")
    | llm
    | StrOutputParser()
)

result = chain.invoke({"language": "法语", "text": "你好,世界"})
print(result)  # Bonjour, le monde

| 管道操作符是 LCEL 的核心语法,每个环节的输出自动成为下一个的输入。

2. Agent:LLM 自主决策

Agent 让 LLM 自己决定使用哪些工具、以什么顺序调用:

from langchain.agents import create_react_agent, AgentExecutor
from langchain_community.tools import DuckDuckGoSearchRun, PythonREPLTool

tools = [
    DuckDuckGoSearchRun(),           # 搜索
    PythonREPLTool(),                # 执行 Python 代码
]

agent = create_react_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

executor.invoke({
    "input": "2024年诺贝尔物理学奖得主是谁?把他的年龄算出来(当前年份减去出生年份)"
})

ReAct 模式:Thought → Action → Observation → ... → Final Answer

3. Memory:对话记忆

from langchain.memory import ConversationSummaryMemory

memory = ConversationSummaryMemory(llm=llm, return_messages=True)

# 第一个对话
memory.save_context({"input": "我叫小明"}, {"output": "你好小明!"})
# 第二个
memory.save_context({"input": "我喜欢 Python"}, {"output": "Python 是很好的选择!"})

print(memory.load_memory_variables({}))
# {'history': '用户叫小明,喜欢 Python 编程。'}

记忆类型对比:

类型 原理 适合
BufferMemory 存全部 短对话
BufferWindowMemory 只存最近 K 轮 长对话限流
SummaryMemory LLM 摘要压缩 长对话保留要点
VectorStoreMemory 向量检索历史 关键信息回溯

4. Tools:扩展 LLM 能力边界

from langchain_core.tools import tool

@tool
def multiply(a: int, b: int) -> int:
    """乘法计算器,输入两个整数返回乘积"""
    return a * b

@tool
def get_current_weather(city: str) -> str:
    """获取城市当前天气"""
    import random
    return f"{city}:晴天,{random.randint(18, 35)}°C"

tools = [multiply, get_current_weather]

工具定义的关键:docstring 是 LLM 理解工具的唯一途径,必须写清楚用途和参数。

5. RAG 架构全景

文档加载器 → TextSplitter → Embedding → VectorStore ←─ 检索
                                            ↓            ↑
                                       用户提问 → Embedding ─┘
                                            ↓
                                       LLM + Context
                                            ↓
                                         回答

6. LangChain vs LlamaIndex vs 原生

框架 适合 不适合
LangChain Agent、复杂编排、多 LLM 简单调用
LlamaIndex 文档 RAG、数据分析 Agent 场景
原生 SDK 简单问答、原型 多步骤链

思考题

  1. Agent 中 "Thought" 步骤的作用是什么?如果去掉会发生什么?
  2. RAG 中 chunk_size 设为 100 和 2000 对检索质量有何影响?
  3. Memory 在并发多用户场景如何隔离?应该用哪种 memory 策略?

参考资料

暂无参考文献