一、什么是 LangChain

LangChain 是一个开源框架,专为开发由大型语言模型(LLM)驱动的应用程序而设计。它的核心价值在于连接 LLM 与外部数据源和计算工具,从而创建功能强大、可交互的应用程序。

简单来说,LangChain 就像是 LLM 世界的 "Spring Framework",它提供了模块化的组件和设计模式,让开发者能更高效、更结构化地构建应用,而不是直接与原始的 API 调用打交道。

LangChain 的主要特点包括:

  • 数据感知能力:将语言模型连接到上下文来源(提示指令、少量示例、需要回应的内容等)
  • 推理能力:依赖语言模型进行推理(根据提供的上下文如何回答、采取什么行动等)
  • 模块化设计:提供可组合的工具和集成,易于使用和扩展
  • 现成的链:用于完成高级任务的组件的内置组合

二、LangChain 的核心组件

LangChain 由多个核心组件组成,这些组件可以灵活组合,构建各种复杂的 LLM 应用。

2.1 模型接口(Models)

模型接口是 LangChain 与底层大模型交互的 "桥梁",它封装了不同类型的模型,并定义了模型输入输出的交互规则。

主要包括:

  • 大型语言模型(LLM) :传统的 "输入文本->输出文本" 模式,如 GPT、BERT、LLaMA 等
  • 聊天模型(ChatModel) :针对对话场景优化的模型,以一系列对话消息作为输入/输出
  • 嵌入向量模型(Embedding 模型) :用于将文本转换为向量表示,主要用于语义检索、相似度匹配等

2.2 提示模板(Prompt Templates)

提示模板用于创建和管理提示词模板,这在控制模型的输入和输出方面起着关键作用。通过精心设计提示模板,可以引导模型生成更符合期望的回答。

主要类型包括:

  • 基础提示模板:定义固定格式的提示内容,包含可替换的占位符
  • 自定义提示模板:根据复杂的业务逻辑和模型特性,灵活设计提示词的结构和内容
  • 少样本提示模板(Few-Shot Prompt) :在提示中提供一些示例,帮助模型更好地理解任务要求

2.3 链(Chains)

链是将多个组件按逻辑串联在一起,形成一个完整的应用程序流程的组件。链可以是简单的顺序执行,也可以是复杂的条件分支和循环。

主要类型包括:

  • LLMChain:最基础的链,由提示模板和语言模型组成
  • SequentialChain:按顺序执行多个链,前一个链的输出作为后一个链的输入
  • RouterChain:根据输入内容动态选择不同的子链执行

2.4 记忆(Memory)

记忆是一套存储过往交互信息的系统,使 LLM 应用能够记住之前的对话内容,实现上下文连贯的多轮对话。

主要类型包括:

  • ConversationBufferMemory:简单保存所有对话历史
  • ConversationSummaryMemory:自动总结对话历史,节省 Token
  • ConversationTokenBufferMemory:按 Token 数量保存历史,防止超过模型输入限制

2.5 代理(Agents)

代理是让 LLM 具备 "自主决策能力" 的组件,能根据目标选择工具、规划步骤,处理需要动态判断的任务。

主要类型包括:

  • Zero-shot React Description:根据工具的描述直接决定调用
  • Conversational React Description:带记忆的代理,适合对话场景
  • Structured Input:处理结构化输入的代理

2.6 工具(Tools)

工具是模型可以调用的外部能力,帮助模型弥补自身在实时信息、计算、特定功能上的不足。

常见工具包括:

  • 搜索引擎:如 Google Search,用于查询实时信息
  • 计算器:如 llm-math,用于精确计算
  • 数据库:如 SQL 工具,用于查询数据库数据
  • 自定义函数:开发者可以根据需求封装自己的工具

2.7 文档加载器(Document Loaders)

文档加载器负责从各种来源加载文档,如文件、网页、数据库等,并将其转换为 LangChain 统一的 "文档(Document)" 格式。

支持的数据源包括:

  • 本地文件:PDF、Word、Markdown、Excel 等
  • 在线内容:网页(URL)、社交媒体帖子、API 返回数据等
  • 数据库:SQL 数据库、MongoDB 等

2.8 文本分割器(Text Splitters)

文本分割器将长文档分割为短文本片段("Chunk"),解决 LLM 上下文长度限制问题,同时优化后续检索效率。

主要分割策略包括:

  • 按字符数/单词数分割:如每 500 字符一段
  • 按语义分割:如基于句子、段落边界,避免切断语义

2.9 向量存储(Vector Stores)

向量存储用于存储文本片段的向量表示(由嵌入模型生成),支持高效的 "语义检索"(根据文本含义而非关键词匹配)。

常见向量存储包括:

  • 开源工具:FAISS、Chroma、Milvus
  • 云服务:Pinecone、Weaviate、AWS OpenSearch

三、安装与环境配置

3.1 安装 LangChain

LangChain 支持 Python 和 JavaScript/TypeScript 两种编程语言。以下是 Python 版本的安装方法:

# 安装 LangChain 核心库
pip install langchain

# 安装常用模型依赖(以 OpenAI 为例)
pip install langchain-openai

# 安装完整依赖(包括社区集成和核心功能)
pip install langchain langchain-community langchain-core

3.2 环境配置

使用 LangChain 通常需要与一个或多个模型提供商、数据存储、API 等进行集成。以 OpenAI 为例,需要设置 API 密钥:

# 通过环境变量设置
export OPENAI_API_KEY="your-api-key"

# 或在代码中直接设置
import os
os.environ["OPENAI_API_KEY"] = "your-api-key"

四、基础使用示例

4.1 调用大语言模型(LLM)

from langchain.llms import OpenAI
import os

# 设置 API 密钥
os.environ["OPENAI_API_KEY"] = "your-api-key"

# 初始化模型llm = OpenAI(model_name="gpt-3.5-turbo-instruct", temperature=0.7)

# 调用模型生成文本
response = llm("请简要介绍 LangChain 的作用")
print(response)

4.2 使用提示词模板(Prompts)

from langchain.prompts import PromptTemplate

# 定义模板(用 {变量名} 表示动态参数)
template = "请用 {language} 翻译这句话:{text}"
prompt = PromptTemplate(
    input_variables=["language", "text"],  # 声明变量
    template=template
)

# 填充变量生成具体提示词
formatted_prompt = prompt.format(language="法语", text="我爱自然语言处理")
print(formatted_prompt)  # 输出:"请用法语翻译这句话:我爱自然语言处理"

# 结合模型调用
response = llm(formatted_prompt)
print(response)  # 输出法语翻译

4.3 构建链(Chains)

from langchain.chains import LLMChain

# 1. 定义提示词模板
template = "为 {product} 生成 3 个吸引人的营销标语"
prompt = PromptTemplate(input_variables=["product"], template=template)

# 2. 组合模板和模型为链
chain = LLMChain(llm=llm, prompt=prompt)

# 3. 运行链
result = chain.run(product="环保水杯")
print(result)

4.4 多轮对话(加入记忆功能)

from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory

# 初始化记忆(保存对话历史)
memory = ConversationBufferMemory()

# 构建带记忆的对话链
conversation = ConversationChain(
    llm=llm,
    memory=memory,
    verbose=True  # 打印流程日志(可选)
)

# 多轮对话
response1 = conversation.predict(input="我叫小明,喜欢打篮球")
print(response1)  # 模型会记住你的名字和爱好

response2 = conversation.predict(input="我喜欢的运动是什么?")
print(response2)  # 模型会回答:"你喜欢打篮球"

4.5 调用工具(使用代理 Agent)

from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType

# 加载工具(这里加载"计算器"和"维基百科")
tools = load_tools(["calculator", "wikipedia"], llm=llm)

# 初始化代理(指定类型为"零-shot",即无需示例直接推理)
agent = initialize_agent(
    tools,
    llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True  # 打印思考过程
)

# 让代理解决问题(需要计算和知识)
agent.run("地球的直径是多少公里?用这个数字除以2的结果是多少?")

五、高级功能:检索增强生成(RAG)

检索增强生成(RAG)是 LangChain 的一个重要功能,它可以帮助 LLM 访问外部知识库,从而生成更准确、更相关的回答。

5.1 RAG 的基本流程

  1. 加载文档:使用文档加载器从各种来源加载文档
  2. 分割文档:将长文档分割成短文本片段
  3. 创建嵌入:使用嵌入模型将文本片段转换为向量表示
  4. 存储向量:将向量存储在向量数据库中
  5. 检索相关文档:根据用户查询,检索最相关的文档片段
  6. 生成回答:结合检索到的文档片段和用户查询,生成最终回答

5.2 实现一个简单的 RAG 应用

from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA

# 1. 加载文档
loader = PyPDFLoader("your_document.pdf")
documents = loader.load()

# 2. 分割文档
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
texts = text_splitter.split_documents(documents)

# 3. 创建向量存储
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(documents=texts, embedding=embeddings)

# 4. 创建检索器
retriever = vectorstore.as_retriever()

# 5. 创建 RAG 链
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=retriever,
    return_source_documents=True
)

# 6. 提问并获取回答
query = "请解释文档中的核心概念"
result = qa_chain({
    "query": query
})

print(result["result"])  # 打印回答
print("\n来源文档:")
for doc in result["source_documents"]:
    print(f"- {doc.metadata['source']}")

六、LangChain 生态系统

LangChain 不仅仅是一个库,它还包括一系列工具和平台,形成了完整的生态系统:

6.1 LangSmith

LangSmith 是一个开发者平台,用于调试、测试、评估和监控 LLM 应用程序。它提供了可视化的日志、提示词调试和版本控制功能,帮助开发者快速定位和解决问题。

6.2 LangServe

LangServe 是一个用于将 LangChain 链部署为 REST API 的库。它使得快速搭建生产就绪的 API 变得简单,支持自动生成 API 文档和客户端代码。

6.3 LangGraph

LangGraph 是 LangChain 的一个扩展,旨在通过将步骤建模为图中的边和节点,构建强大且有状态的多参与者应用程序。它提供了用于创建常见类型代理的高级接口,以及用于组合自定义流程的低级 API。

七、最佳实践和常见问题

7.1 最佳实践

  1. 模块化设计:充分利用 LangChain 的模块化特性,将应用拆分为独立的组件,便于维护和扩展
  2. 提示词工程:精心设计提示词模板,提高模型输出的质量和一致性
  3. 使用记忆组件:对于需要多轮对话的应用,合理使用记忆组件,保持上下文的连贯性
  4. 优化检索策略:对于 RAG 应用,选择合适的文档分割策略和检索算法,提高检索的准确性
  5. 监控和调试:使用 LangSmith 等工具监控应用的运行状态,及时发现和解决问题

7.2 常见问题

  1. 模型响应质量不佳

    • 检查提示词设计是否合理
    • 考虑使用少样本提示模板
    • 尝试调整模型参数(如 temperature)
  2. 应用性能问题

    • 使用流式输出减少等待时间
    • 优化检索策略,减少不必要的计算
    • 考虑使用缓存机制,避免重复调用模型
  3. 内存占用过高

    • 对于长文档,使用更细粒度的分割策略
    • 考虑使用 ConversationSummaryMemory 等节省内存的记忆组件
    • 定期清理不再需要的上下文信息

八、总结

LangChain 是一个强大的框架,为开发 LLM 驱动的应用程序提供了全面的支持。通过其模块化的设计和丰富的组件,开发者可以快速构建各种复杂的应用,从简单的文本生成到复杂的多轮对话系统和检索增强生成应用。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐