欢迎光临
我们一直在努力

LangChain入门- LangChain Community 详解

超详细 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 贡献指南:

  • Fork langchain-community 仓库
  • 实现相应的基类接口
  • 添加测试和文档
  • 提交 Pull Request
  • 参考资源

    官方文档

    • 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 社区

    赞(0)
    未经允许不得转载:171主机测评 » LangChain入门- LangChain Community 详解
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址