超详细 LangChain Community 详解
标签: 资源, LangChain, 集成, 社区
LangChain Community 详解
文档概述
langchain-community 是 LangChain 生态系统中社区维护的第三方集成包,包含 1000+ 与各种 AI 服务、数据库、工具和平台的集成。本文档详细介绍其架构、功能和使用方法。
目录
概述
什么是 langchain-community
langchain-community 是一个由社区维护的 LangChain 集成包,它实现了 langchain-core 中定义的基础接口,使这些集成可以在任何 LangChain 应用中即插即用。
核心特点
| 社区维护 | 由第三方开发者和社区成员维护 |
| 接口统一 | 实现 langchain-core 定义的基础接口 |
| 即插即用 | 可直接在 LangChain 应用中使用 |
| 版本独立 | 独立版本管理,避免核心库频繁更新 |
| 覆盖广泛 | 支持 1000+ 第三方服务和平台 |
与其他包的关系
#mermaid-svg-uIavhB9XiUewW1SD{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-uIavhB9XiUewW1SD .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-uIavhB9XiUewW1SD .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-uIavhB9XiUewW1SD .error-icon{fill:#552222;}#mermaid-svg-uIavhB9XiUewW1SD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-uIavhB9XiUewW1SD .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-uIavhB9XiUewW1SD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-uIavhB9XiUewW1SD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-uIavhB9XiUewW1SD .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-uIavhB9XiUewW1SD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-uIavhB9XiUewW1SD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-uIavhB9XiUewW1SD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-uIavhB9XiUewW1SD .marker.cross{stroke:#333333;}#mermaid-svg-uIavhB9XiUewW1SD svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-uIavhB9XiUewW1SD p{margin:0;}#mermaid-svg-uIavhB9XiUewW1SD .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-uIavhB9XiUewW1SD .cluster-label text{fill:#333;}#mermaid-svg-uIavhB9XiUewW1SD .cluster-label span{color:#333;}#mermaid-svg-uIavhB9XiUewW1SD .cluster-label span p{background-color:transparent;}#mermaid-svg-uIavhB9XiUewW1SD .label text,#mermaid-svg-uIavhB9XiUewW1SD span{fill:#333;color:#333;}#mermaid-svg-uIavhB9XiUewW1SD .node rect,#mermaid-svg-uIavhB9XiUewW1SD .node circle,#mermaid-svg-uIavhB9XiUewW1SD .node ellipse,#mermaid-svg-uIavhB9XiUewW1SD .node polygon,#mermaid-svg-uIavhB9XiUewW1SD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-uIavhB9XiUewW1SD .rough-node .label text,#mermaid-svg-uIavhB9XiUewW1SD .node .label text,#mermaid-svg-uIavhB9XiUewW1SD .image-shape .label,#mermaid-svg-uIavhB9XiUewW1SD .icon-shape .label{text-anchor:middle;}#mermaid-svg-uIavhB9XiUewW1SD .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-uIavhB9XiUewW1SD .rough-node .label,#mermaid-svg-uIavhB9XiUewW1SD .node .label,#mermaid-svg-uIavhB9XiUewW1SD .image-shape .label,#mermaid-svg-uIavhB9XiUewW1SD .icon-shape .label{text-align:center;}#mermaid-svg-uIavhB9XiUewW1SD .node.clickable{cursor:pointer;}#mermaid-svg-uIavhB9XiUewW1SD .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-uIavhB9XiUewW1SD .arrowheadPath{fill:#333333;}#mermaid-svg-uIavhB9XiUewW1SD .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-uIavhB9XiUewW1SD .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-uIavhB9XiUewW1SD .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uIavhB9XiUewW1SD .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-uIavhB9XiUewW1SD .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uIavhB9XiUewW1SD .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-uIavhB9XiUewW1SD .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-uIavhB9XiUewW1SD .cluster text{fill:#333;}#mermaid-svg-uIavhB9XiUewW1SD .cluster span{color:#333;}#mermaid-svg-uIavhB9XiUewW1SD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-uIavhB9XiUewW1SD .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-uIavhB9XiUewW1SD rect.text{fill:none;stroke-width:0;}#mermaid-svg-uIavhB9XiUewW1SD .icon-shape,#mermaid-svg-uIavhB9XiUewW1SD .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uIavhB9XiUewW1SD .icon-shape p,#mermaid-svg-uIavhB9XiUewW1SD .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-uIavhB9XiUewW1SD .icon-shape rect,#mermaid-svg-uIavhB9XiUewW1SD .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uIavhB9XiUewW1SD .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-uIavhB9XiUewW1SD .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-uIavhB9XiUewW1SD :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
使用
使用
依赖
依赖
依赖
定义
定义
定义
应用层
langchain
langchain-community
langchain-core
Runnable 协议
消息类型
LLM 抽象
架构定位
LangChain 包生态
#mermaid-svg-0NVLLCTLpIr6USfT{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-0NVLLCTLpIr6USfT .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-0NVLLCTLpIr6USfT .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-0NVLLCTLpIr6USfT .error-icon{fill:#552222;}#mermaid-svg-0NVLLCTLpIr6USfT .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0NVLLCTLpIr6USfT .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-0NVLLCTLpIr6USfT .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0NVLLCTLpIr6USfT .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0NVLLCTLpIr6USfT .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-0NVLLCTLpIr6USfT .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0NVLLCTLpIr6USfT .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0NVLLCTLpIr6USfT .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0NVLLCTLpIr6USfT .marker.cross{stroke:#333333;}#mermaid-svg-0NVLLCTLpIr6USfT svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0NVLLCTLpIr6USfT p{margin:0;}#mermaid-svg-0NVLLCTLpIr6USfT .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-0NVLLCTLpIr6USfT .cluster-label text{fill:#333;}#mermaid-svg-0NVLLCTLpIr6USfT .cluster-label span{color:#333;}#mermaid-svg-0NVLLCTLpIr6USfT .cluster-label span p{background-color:transparent;}#mermaid-svg-0NVLLCTLpIr6USfT .label text,#mermaid-svg-0NVLLCTLpIr6USfT span{fill:#333;color:#333;}#mermaid-svg-0NVLLCTLpIr6USfT .node rect,#mermaid-svg-0NVLLCTLpIr6USfT .node circle,#mermaid-svg-0NVLLCTLpIr6USfT .node ellipse,#mermaid-svg-0NVLLCTLpIr6USfT .node polygon,#mermaid-svg-0NVLLCTLpIr6USfT .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-0NVLLCTLpIr6USfT .rough-node .label text,#mermaid-svg-0NVLLCTLpIr6USfT .node .label text,#mermaid-svg-0NVLLCTLpIr6USfT .image-shape .label,#mermaid-svg-0NVLLCTLpIr6USfT .icon-shape .label{text-anchor:middle;}#mermaid-svg-0NVLLCTLpIr6USfT .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-0NVLLCTLpIr6USfT .rough-node .label,#mermaid-svg-0NVLLCTLpIr6USfT .node .label,#mermaid-svg-0NVLLCTLpIr6USfT .image-shape .label,#mermaid-svg-0NVLLCTLpIr6USfT .icon-shape .label{text-align:center;}#mermaid-svg-0NVLLCTLpIr6USfT .node.clickable{cursor:pointer;}#mermaid-svg-0NVLLCTLpIr6USfT .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-0NVLLCTLpIr6USfT .arrowheadPath{fill:#333333;}#mermaid-svg-0NVLLCTLpIr6USfT .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-0NVLLCTLpIr6USfT .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-0NVLLCTLpIr6USfT .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0NVLLCTLpIr6USfT .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-0NVLLCTLpIr6USfT .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0NVLLCTLpIr6USfT .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-0NVLLCTLpIr6USfT .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-0NVLLCTLpIr6USfT .cluster text{fill:#333;}#mermaid-svg-0NVLLCTLpIr6USfT .cluster span{color:#333;}#mermaid-svg-0NVLLCTLpIr6USfT div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-0NVLLCTLpIr6USfT .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-0NVLLCTLpIr6USfT rect.text{fill:none;stroke-width:0;}#mermaid-svg-0NVLLCTLpIr6USfT .icon-shape,#mermaid-svg-0NVLLCTLpIr6USfT .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0NVLLCTLpIr6USfT .icon-shape p,#mermaid-svg-0NVLLCTLpIr6USfT .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-0NVLLCTLpIr6USfT .icon-shape rect,#mermaid-svg-0NVLLCTLpIr6USfT .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0NVLLCTLpIr6USfT .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-0NVLLCTLpIr6USfT .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-0NVLLCTLpIr6USfT :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
LangChain 生态系统
langchain-core核心抽象
langchain主实现库
langchain-community社区集成
langchain-xxx合作伙伴包
包分类说明
| langchain-core | LangChain 团队 | 核心抽象和接口 | Runnable, BasePromptTemplate |
| langchain | LangChain 团队 | 主实现库 | Chains, Agents, Memory |
| langchain-community | 社区 | 社区维护的集成 | 各种 LLM, Vector Stores |
| langchain-openai | LangChain 团队 | OpenAI 官方集成 | ChatOpenAI, OpenAIEmbeddings |
| langchain-anthropic | LangChain 团队 | Anthropic 官方集成 | ChatAnthropic |
| langchain-aws | LangChain 团队 | AWS 官方集成 | Bedrock |
为什么需要 community 包
核心集成分类
1. 聊天模型 (Chat Models)
主流提供商
# OpenAI (独立包)
from langchain_openai import ChatOpenAI
# Anthropic (独立包)
from langchain_anthropic import ChatAnthropic
# 社区包中的模型
from langchain_community.chat_models import (
ChatOllama, # 本地模型
ChatLlamaCpp, # LLaMA.cpp
ChatXverse, # 元戎机器人
ChatTongyi, # 阿里通义千问
ChatHunyuan, # 腾讯混元
ChatZhipuAI, # 智谱AI
ChatDeepSeek, # DeepSeek
)
使用示例
from langchain_community.chat_models import ChatOllama
from langchain_core.messages import HumanMessage
# 初始化本地模型
llm = ChatOllama(model="llama2")
# 调用
messages = [HumanMessage(content="你好")]
response = llm.invoke(messages)
print(response.content)
2. 嵌入模型 (Embeddings)
向量嵌入提供商
from langchain_community.embeddings import (
OllamaEmbeddings, # 本地嵌入
LlamaCppEmbeddings, # LLaMA.cpp 嵌入
HuggingFaceEmbeddings, # Hugging Face 模型
TensorflowHubEmbeddings, # TensorFlow Hub
SpacyEmbeddings, # spaCy 嵌入
XinferenceEmbeddings, # Xorbits Inference
)
使用示例
from langchain_community.embeddings import HuggingFaceEmbeddings
# 使用本地嵌入模型
embeddings = HuggingFaceEmbeddings(
model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
)
# 生成嵌入
text = "这是一段示例文本"
vector = embeddings.embed_query(text)
print(f"向量维度: {len(vector)}")
3. 向量存储 (Vector Stores)
支持的向量数据库
from langchain_community.vectorstores import (
Chroma, # ChromaDB
FAISS, # Facebook AI Similarity Search
Pinecone, # Pinecone (独立包推荐)
Qdrant, # Qdrant (独立包推荐)
Weaviate, # Weaviate
Milvus, # Milvus (独立包推荐)
Elasticsearch, # Elasticsearch
PGVector, # PostgreSQL + pgvector
Redis, # Redis (独立包推荐)
MongoDB, # MongoDB Atlas (独立包推荐)
)
使用示例
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_core.documents import Document
# 准备文档
documents = [
Document(page_content="LangChain 是一个强大的 LLM 应用开发框架"),
Document(page_content="Vector Stores 用于存储和检索向量嵌入"),
]
# 创建向量存储
embeddings = HuggingFaceEmbeddings()
vectorstore = Chroma.from_documents(
documents=documents,
embedding=embeddings,
collection_name="langchain_docs"
)
# 相似度搜索
query = "什么是向量存储"
results = vectorstore.similarity_search(query)
for doc in results:
print(doc.page_content)
4. 文档加载器 (Document Loaders)
文件格式加载器
from langchain_community.document_loaders import (
# 文本文件
TextLoader, # .txt
CSVLoader, # .csv
JSONLoader, # .json
UnstructuredMarkdownLoader, # .md
# PDF 处理
PyPDFLoader, # PyPDF2
PDFMinerLoader, # PDFMiner
PyMuPDFLoader, # PyMuPDF (fitz)
UnstructuredPDFLoader, # Unstructured
# Office 文档
UnstructuredWordLoader, # .docx
UnstructuredExcelLoader, # .xlsx
UnstructuredPowerPointLoader, # .pptx
# 网页内容
WebBaseLoader, # HTML 网页
AzPDFLoader, # Azure Blob Storage PDF
GitLoader, # Git 仓库
)
使用示例
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import OllamaEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 加载网页内容
loader = WebBaseLoader("https://python.langchain.com/docs/get_started/introduction")
documents = loader.load()
# 分割文档
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
splits = text_splitter.split_documents(documents)
# 创建向量存储
embeddings = OllamaEmbeddings()
vectorstore = Chroma.from_documents(
documents=splits,
embedding=embeddings
)
5. 工具和工具包 (Tools)
搜索工具
from langchain_community.tools import (
# 搜索工具
SerpAPIWrapper, # Google Search
TavilySearchResults, # Tavily AI 搜索 (独立包推荐)
DuckDuckGoSearchRun, # DuckDuckGo
BingSearchRun, # Bing 搜索
GoogleSearchRun, # Google 搜索
GoogleSerperAPIWrapper, # Google Serper API
# 计算工具
WolframAlphaQueryRun, # Wolfram Alpha
# API 工具
RequestsGetTool, # HTTP GET
RequestsPostTool, # HTTP POST
# 数据库工具
QueryDatabaseTool, # 数据库查询
)
使用示例
from langchain_community.tools import DuckDuckGoSearchRun
from langchain_core.tools import Tool
# 初始化搜索工具
search = DuckDuckGoSearchRun()
# 执行搜索
result = search.run("LangChain Community 集成列表")
print(result)
# 创建自定义工具
custom_tool = Tool(
name="search",
func=search.run,
description="搜索互联网获取最新信息"
)
6. 检索器 (Retrievers)
from langchain_community.retrievers import (
# 向量检索
VectorStoreRetriever, # 向量存储检索器
# 特殊检索器
BM25Retriever, # BM25 关键词检索
TavilyRetriever, # Tavily 搜索检索
KNNRetriever, # K 近邻检索
# 多模态检索
MultiQueryRetriever, # 多查询检索
ContextualCompressionRetriever, # 上下文压缩
)
7. 记忆存储 (Memory Stores)
from langchain_community.storage import (
# 内存存储
InMemoryStore, # 内存键值存储
# 持久化存储
RedisStore, # Redis 存储
UpstashRedisStore, # Upstash Redis
# 数据库存储
SQLStore, # SQL 数据库
MongoDBStore, # MongoDB
# 文件存储
LocalFileStore, # 本地文件
)
安装与配置
基础安装
# 安装 langchain-community
pip install langchain-community
# 安装基础依赖
pip install langchain langchain-core
按需安装依赖
# 基础文档处理
pip install langchain-community[docs]
# 向量存储支持
pip install langchain-community[vectorstores]
# 全部依赖(较大)
pip install langchain-community[all]
常见集成额外依赖
# Chroma 向量数据库
pip install chromadb
# FAISS 向量搜索
pip install faiss-cpu # 或 faiss-gpu
# PDF 处理
pip install pypdf unstructured[pdf]
# 网页抓取
pip install beautifulsoup4 lxml
# OpenAI (如果使用)
pip install langchain-openai
常见集成使用
案例 1: 本地 RAG 应用
from langchain_community.document_loaders import PyPDFLoader
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.chat_models import ChatOllama
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 1. 加载文档
loader = PyPDFLoader("document.pdf")
documents = loader.load()
# 2. 分割文档
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
splits = text_splitter.split_documents(documents)
# 3. 创建向量存储
embeddings = OllamaEmbeddings(model="nomic-embed-text")
vectorstore = Chroma.from_documents(
documents=splits,
embedding=embeddings
)
retriever = vectorstore.as_retriever()
# 4. 创建 RAG 链
llm = ChatOllama(model="llama2")
template = """基于以下上下文回答问题:
上下文:
{context}
问题: {question}
回答:"""
prompt = ChatPromptTemplate.from_template(template)
def format_docs(docs):
return "\\n\\n".join(doc.page_content for doc in docs)
rag_chain = (
{
"context": retriever | format_docs,
"question": lambda x: x["question"]
}
| prompt
| llm
| StrOutputParser()
)
# 5. 查询
result = rag_chain.invoke({"question": "文档的主要内容是什么?"})
print(result)
案例 2: 多来源数据检索
from langchain_community.document_loaders import (
WebBaseLoader,
PyPDFLoader,
TextLoader
)
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import HuggingFaceEmbeddings
# 多来源加载
web_loader = WebBaseLoader("https://example.com/docs")
pdf_loader = PyPDFLoader("manual.pdf")
text_loader = TextLoader("notes.txt")
web_docs = web_loader.load()
pdf_docs = pdf_loader.load()
text_docs = text_loader.load()
# 合并文档
all_docs = web_docs + pdf_docs + text_docs
# 创建 FAISS 索引
embeddings = HuggingFaceEmbeddings()
vectorstore = FAISS.from_documents(
documents=all_docs,
embedding=embeddings
)
# 保存索引
vectorstore.save_local("faiss_index")
# 加载索引
new_vectorstore = FAISS.load_local(
"faiss_index",
embeddings,
allow_dangerous_deserialization=True
)
案例 3: 带搜索的 Agent
from langchain_community.tools import DuckDuckGoSearchRun
from langchain_community.chat_models import ChatOllama
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate
# 初始化模型和工具
llm = ChatOllama(model="llama2")
search = DuckDuckGoSearchRun()
tools = [search]
# 创建提示模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个有用的助手。使用搜索工具获取最新信息。"),
("human", "{input}"),
("placeholder", "{agent_scratchpad}")
])
# 创建 Agent
agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True
)
# 执行
result = agent_executor.invoke({
"input": "2025年 LangChain 有哪些新功能?"
})
案例 4: 持久化记忆
from langchain_community.storage import RedisStore
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_core.messages import AIMessage, HumanMessage
# Redis 存储
store = RedisStore(
redis_url="redis://localhost:6379",
prefix="chat_history"
)
# 自定义历史类
class RedisChatHistory(BaseChatMessageHistory):
def __init__(self, session_id: str):
self.session_id = session_id
self.key = f"session:{session_id}"
@property
def messages(self):
data = store.get(self.key)
return data if data else []
def add_message(self, message):
messages = self.messages
messages.append(message)
store.put(self.key, messages)
def clear(self):
store.delete(self.key)
# 使用
history = RedisChatHistory(session_id="user123")
history.add_message(HumanMessage(content="你好"))
history.add_message(AIMessage(content="你好,有什么可以帮助你的?"))
print(history.messages)
自定义集成开发
创建自定义文档加载器
from typing import List, Iterator
from langchain_core.documents import Document
from langchain_community.document_loaders.base import BaseLoader
class CustomLoader(BaseLoader):
"""自定义文档加载器"""
def __init__(self, source: str):
self.source = source
def load(self) –> List[Document]:
"""加载所有文档"""
with open(self.source, 'r', encoding='utf-8') as f:
content = f.read()
return [Document(page_content=content, metadata={"source": self.source})]
def lazy_load(self) –> Iterator[Document]:
"""懒加载文档"""
yield from self.load()
# 使用
loader = CustomLoader("data.txt")
documents = loader.load()
创建自定义工具
from langchain_core.tools import BaseTool
from typing import Optional, Type
from pydantic import BaseModel, Field
class CustomSearchInput(BaseModel):
"""自定义搜索输入"""
query: str = Field(description="搜索查询字符串")
class CustomSearchTool(BaseTool):
"""自定义搜索工具"""
name: str = "custom_search"
description: str = "自定义搜索工具,用于搜索特定内容"
args_schema: Type[BaseModel] = CustomSearchInput
def _run(self, query: str) –> str:
"""同步执行"""
# 实现搜索逻辑
return f"搜索结果: {query}"
async def _arun(self, query: str) –> str:
"""异步执行"""
# 实现异步搜索逻辑
return f"异步搜索结果: {query}"
# 使用
tool = CustomSearchTool()
result = tool.invoke({"query": "LangChain"})
创建自定义向量存储
from langchain_core.vectorstores import VectorStore, VectorStoreRetriever
from langchain_core.embeddings import Embeddings
from typing import List, Dict, Any, Optional
class CustomVectorStore(VectorStore):
"""自定义向量存储"""
def __init__(self, embedding_function: Embeddings):
self.embedding_function = embedding_function
self.documents: Dict[str, Document] = {}
self.vectors: Dict[str, List[float]] = {}
def add_texts(
self,
texts: List[str],
metadatas: Optional[List[Dict]] = None
) –> List[str]:
"""添加文本"""
ids = []
for i, text in enumerate(texts):
doc_id = f"doc_{len(self.documents)}"
vector = self.embedding_function.embed_query(text)
self.documents[doc_id] = Document(
page_content=text,
metadata=metadatas[i] if metadatas else {}
)
self.vectors[doc_id] = vector
ids.append(doc_id)
return ids
def similarity_search(
self,
query: str,
k: int = 4
) –> List[Document]:
"""相似度搜索"""
query_vector = self.embedding_function.embed_query(query)
# 计算相似度 (简化示例)
similarities = []
for doc_id, vector in self.vectors.items():
# 余弦相似度计算
similarity = self._cosine_similarity(query_vector, vector)
similarities.append((doc_id, similarity))
# 排序并返回 top-k
similarities.sort(key=lambda x: x[1], reverse=True)
return [self.documents[doc_id] for doc_id, _ in similarities[:k]]
def _cosine_similarity(self, v1: List[float], v2: List[float]) –> float:
"""计算余弦相似度"""
import numpy as np
return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))
@classmethod
def from_texts(
cls,
texts: List[str],
embedding: Embeddings,
**kwargs: Any
) –> "CustomVectorStore":
"""从文本创建"""
instance = cls(embedding)
instance.add_texts(texts)
return instance
最佳实践
1. 选择正确的集成包
| OpenAI 集成 | langchain-openai | 官方维护,更新及时 |
| 本地模型 | langchain-community | 支持多种本地模型 |
| 专用向量数据库 | langchain-{db} | 独立包,依赖更少 |
| 通用集成 | langchain-community | 社区支持,覆盖广泛 |
2. 环境配置管理
import os
from typing import Optional
from dotenv import load_dotenv
load_dotenv()
class Config:
"""配置管理"""
# OpenAI
OPENAI_API_KEY: Optional[str] = os.getenv("OPENAI_API_KEY")
# Ollama
OLLAMA_BASE_URL: str = os.getenv("OLLAMA_BASE_URL", "http://localhost:11434")
# 向量数据库
CHROMA_PERSIST_DIR: str = os.getenv("CHROMA_PERSIST_DIR", "./chroma_db")
# Redis
REDIS_URL: str = os.getenv("REDIS_URL", "redis://localhost:6379")
config = Config()
3. 错误处理
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_core.exceptions import LangChainException
def safe_embedding(text: str, max_retries: int = 3):
"""带重试的嵌入生成"""
embeddings = HuggingFaceEmbeddings()
for attempt in range(max_retries):
try:
return embeddings.embed_query(text)
except Exception as e:
if attempt == max_retries – 1:
raise LangChainException(f"嵌入生成失败: {e}")
print(f"重试 {attempt + 1}/{max_retries}…")
return None
4. 性能优化
# 批量处理
from langchain_community.embeddings import OllamaEmbeddings
embeddings = OllamaEmbeddings()
# 批量嵌入比单个嵌入更高效
texts = ["文本1", "文本2", "文本3", ...]
vectors = embeddings.embed_documents(texts) # 批量
# 而不是
# for text in texts:
# vector = embeddings.embed_query(text) # 单个,低效
5. 依赖管理
# requirements.txt 分组管理
# 核心依赖
langchain–core>=0.3.0
langchain>=0.3.0
# 社区集成
langchain–community>=0.3.0
# 向量存储 (按需)
chromadb>=0.4.0
faiss–cpu>=1.7.0
# 文档处理 (按需)
pypdf>=3.0.0
unstructured[pdf]>=0.10.0
常见问题
Q1: langchain vs langchain-community?
A: langchain 包含 LangChain 团队维护的核心功能,langchain-community 包含社区维护的第三方集成。对于流行的服务(如 OpenAI、Anthropic),有专门的 langchain-{provider} 包。
Q2: 如何选择向量数据库?
A:
| Chroma | 本地开发、小规模应用 |
| FAISS | 高性能本地搜索 |
| Pinecone | 生产环境、托管服务 |
| Qdrant | 开源、高性能 |
| PGVector | 已有 PostgreSQL 基础设施 |
Q3: 社区包稳定吗?
A: 社区包的质量因维护者而异。对于生产环境,建议:
- 选择活跃维护的集成
- 查看 GitHub issues 和更新频率
- 考虑使用官方合作伙伴包
- 充分测试
Q4: 如何贡献集成?
A: 参考 LangChain 贡献指南:
参考资源
官方文档
- Python 文档: https://python.langchain.com/
- API 参考: https://api.python.langchain.com/
- 集成列表: https://python.langchain.com/docs/integrations/providers/
代码仓库
- LangChain: https://github.com/langchain-ai/langchain
- Community: https://github.com/langchain-ai/langchain-community
- Core: https://github.com/langchain-ai/langchain-core
社区资源
- Discord: https://discord.gg/langchain
- GitHub Discussions: https://github.com/langchain-ai/langchain/discussions
- Twitter: @LangChainAI
版本信息
- 当前版本: 0.3.x
- Python 要求: >=3.9
- 许可证: MIT
- 维护者: LangChain 社区




