大模型入门到应用——LangChain:索引(Indexes)-[文本分割器(Text Splitters)]

文章详细介绍了LangChain框架中涉及的基础知识,包括安装配置、代理、记忆管理、大型语言模型(LLMs)、API使用、文本分割技术以及与之相关的功能如图问答、文档加载和代理执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分类目录:《大模型从入门到应用》总目录

LangChain系列文章:


当我们需要处理长文本时,有必要将文本分割成块。虽然这听起来很简单,但这里存在很多潜在的复杂性。理想情况下,我们希望将语义相关的文本块保持在一起,但什么是"语义相关"可能取决于文本的类型。本文就展示了几种实现这一目标的方法。

在高层次上,文本分割器的工作原理如下:

  1. 将文本分割成小的、语义有意义的块(通常是句子)。
  2. 开始将这些小块组合成较大的块,直到达到一定的大小(由某个函数衡量)。
  3. 一旦达到该大小,将该块作为自己的文本片段,然后开始创建一个具有一定重叠的新文本块(以保持块之间的上下文)。

这意味着有两个不同的方向可以定制文本分割器:

  • 文本如何被分割
  • 块的大小如何衡量

默认推荐的文本分割器是RecursiveCharacterTextSplitter。该文本分割器接受一个字符列表作为参数。它尝试根据第一个字符进行分块,但如果有任何分块过大,它将继续尝试下一个字符,依此类推。默认情况下,它尝试进行分割的字符是\n\n\n等。除了控制分割的字符之外,我们还可以控制其他一些内容:

  • length_function:如何计算分块的长度。默认只计算字符数,但通常在这里传递一个标记计数器。
  • chunk_size:分块的最大大小(由长度函数测量)。
  • chunk_overlap:分块之间的最大重叠量。保持一些重叠可以保持分块之间的连续性(例如使用滑动窗口)。
  • add_start_index:是否在元数据中包含每个分块在原始文档中的起始位置。
# This is a long document we can split up.
with open('../../state_of_the_union.txt') as f:
    state_of_the_union = f.read()
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
    # Set a really small chunk size, just to show.
    chunk_size = 100,
    chunk_overlap  = 20,
    length_function = len,
    add_start_index = True,
)
texts = text_splitter.create_documents([state_of_the_union])
print(texts[0])
print(texts[1])

输出:

page_content='Madam Speaker, Madam Vice President, our First Lady and Second Gentleman. Members of Congress and' metadata={'start_index': 0} page_content='of Congress and the Cabinet. Justices of the Supreme Court. My fellow Americans.' metadata={'start_index': 82}

我们还可以使用文本分割器分割下列类型的文件:

  • Character
  • HTML
  • Latex
  • Markdown
  • NLTK
  • Python
  • Recursive Character
  • spaCy
  • tiktoken(OpenAI)

参考文献:
[1] LangChain官方网站:https://www.langchain.com/
[2] LangChain 🦜️🔗 中文网,跟着LangChain一起学LLM/GPT开发:https://www.langchain.com.cn/
[3] LangChain中文网 - LangChain 是一个用于开发由语言模型驱动的应用程序的框架:http://www.cnlangchain.com/

<think>好的,用户让我详细讲解一下LangChain,我需要先回想一下自己对这个框架的了解。LangChain是一个用于开发语言模型应用的框架,对吧?它帮助开发者将大型语言模型(LLM)与其他数据源和工具结合起来,构建更复杂的应用。比如,可能涉及到数据增强生成(RAG)、代理(Agents)之类的概念。 首先,用户可能想知道LangChain的核心组件有哪些。我需要分解一下,比如模型(Models)、链(Chains)、记忆(Memory)、索引Indexes)、代理(Agents)和回调(Callbacks)。每个部分的作用是什么,得简明扼要地解释清楚。 然后,应用场景。用户可能对实际用途感兴趣,比如智能问答、文档分析、聊天机器人、自动化流程这些方面。举几个例子会更有帮助,比如用LangChain结合外部数据源做问答系统,或者用代理来处理复杂任务。 接下来,可能得讲讲工作流程,从加载数据、处理文本,到构建链或代理,最后集成应用。这部分需要步骤清晰,让用户明白如何从零开始构建一个应用。 还要考虑用户可能的疑问,比如为什么选择LangChain而不是直接调用API?这时候需要强调其模块化和扩展性,方便集成各种工具和数据源。另外,可能得提到它支持多种模型提供商,比如OpenAI、Hugging Face,这增加了灵活性。 用户可能还想知道优缺点。优点包括模块化、灵活性、开源社区支持;缺点可能是学习曲线陡峭,需要一定编程基础,以及性能优化的问题。需要客观分析,帮助用户判断是否适合他们的项目。 最后,提供一些学习资源,比如官方文档、GitHub仓库、社区教程,这样用户可以有进一步学习的途径。可能还要提到实际项目练习的重要性,以巩固知识。 整个过程中,要确保用词准确,结构清晰,避免技术术语过多,同时覆盖关键点。需要检查是否符合之前的系统指令,比如数学公式的格式是否正确,但在这个问题里可能涉及较少。主要确保使用中文,分点明确,步骤详细,帮助用户全面理解LangChain。</think>### LangChain 详细介绍 LangChain 是一个用于构建**语言模型驱动应用**的开源框架,旨在将大型语言模型(LLLM,如 GPT、Claude 等)与外部数据源、工具和计算逻辑结合,实现更复杂的任务自动化与交互式应用。以下从核心概念、功能模块、应用场景及工作流程进行详细讲解。 --- #### 一、核心概念 1. **模型(Models)** - **基础模型**:支持多种 LLM(如 OpenAI、Hugging Face 等),通过统一接口调用。 - **数据增强模型**:结合外部知识库(如数据库、文档)提升模型输出的准确性,典型技术为 **RAG(Retrieval-Augmented Generation)**。 - **小模型协同**:将大模型与小模型(如分类器、翻译模型)结合,优化成本与性能。 2. **链(Chains)** - 将多个模型或工具按顺序组合成“链”,例如: $$ \text{用户输入} \rightarrow \text{语义解析} \rightarrow \text{数据库查询} \rightarrow \text{生成回答} $$ - 支持条件分支、循环等复杂逻辑。 3. **记忆(Memory)** - 为链或代理(Agent)提供短期或长期记忆,支持上下文感知的交互(如多轮对话)。 4. **索引Indexes)** - 结构化外部数据(如文档、数据库),结合**检索器(Retriever)**实现高效信息查询。 5. **代理(Agents)** - 自主决策模块,根据输入动态选择工具或模型。例如: ```python Agent → 工具1(搜索API) → 工具2(计算器) → 生成答案 ``` 6. **回调(Callbacks)** - 监控与记录任务执行过程,用于调试和优化。 --- #### 二、典型应用场景 1. **智能问答系统** - 结合企业文档库,实现基于 RAG 的精准问答(如客服机器人)。 2. **文档分析与摘要** - 解析长文本,提取关键信息并生成摘要。 3. **自动化流程** - 通过代理调用 API 完成预订、数据分析等任务。 4. **代码生成与调试** - 根据需求生成代码片段,并调用解释器验证结果。 --- #### 三、工作流程示例 以“基于企业文档的问答系统”为例: 1. **数据加载**: - 使用 `DocumentLoader` 加载 PDF、HTML 等格式的文档。 2. **文本处理**: - 通过 `TextSplitter` 分割文本为片段,嵌入为向量并存入数据库。 3. **检索增强生成(RAG)**: - 用户提问 → 检索相关文本片段 → 结合 LLM 生成答案。 4. **部署应用**: - 使用 `LangServe` 快速构建 API 或 Web 交互界面。 --- #### 四、代码示例(简化版) ```python from langchain_community.document_loaders import WebBaseLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_openai import OpenAIEmbeddings, ChatOpenAI from langchain_community.vectorstores import FAISS from langchain_core.prompts import ChatPromptTemplate # 1. 加载并处理数据 loader = WebBaseLoader("https://example.com/docs") docs = loader.load() text_splitter = RecursiveCharacterTextSplitter(chunk_size=500) splits = text_splitter.split_documents(docs) # 2. 构建向量数据库 embeddings = OpenAIEmbeddings() vectorstore = FAISS.from_documents(splits, embeddings) # 3. 定义问答链 retriever = vectorstore.as_retriever() llm = ChatOpenAI(model="gpt-3.5-turbo") prompt = ChatPromptTemplate.from_template("基于以下上下文回答:{context}\n问题:{input}") chain = {"context": retriever, "input": RunnablePassthrough()} | prompt | llm chain.invoke("如何申请休假?") ``` --- #### 五、优缺点分析 | **优点** | **挑战** | |-----------------------------------|-----------------------------------| | 模块化设计,灵活扩展 | 需一定编程基础,学习曲线较陡 | | 支持多模型、多数据源 | 复杂链的性能优化需精细调试 | | 开源社区活跃,工具生态丰富 | 依赖外部 API 可能增加成本与延迟 | --- #### 六、学习资源推荐 1. **官方文档**:https://python.langchain.com 2. **GitHub 仓库**:https://github.com/langchain-ai/langchain 3. **实战教程**: -LangChain in Action》 - 官方 Cookbook 示例 通过掌握 LangChain,开发者可高效构建从简单对话到企业级知识管理的多样化 AI 应用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

von Neumann

您的赞赏是我创作最大的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值