AI(学习笔记第七课) 使用langchain进行文本切割

发布于:2025-09-07 ⋅ 阅读:(21) ⋅ 点赞:(0)

AI(学习笔记第七课) 使用langchain进行文本切割

  • 为什么需要文本切割(Text split)以及如何切割

学习内容:

  • 为什么需要文本切割(Text split)
  • 常见的文本切割的方法(approaches)
  • langchain文本切割示例

1.为什么需要文本切割(Text split)

1.1 学习url

1.2 为什么需要split文本

  • 现实世界的文本都是不规则长度的,需要将它们进行split,保证统一的尺寸。
  • 克服model的限制,模型一般都有一次的输入文本大小的限制。所以需要提前对文本进行split,以免超过model的尺寸限制。
  • 保证模型处理的质量,对于超大的文本,模型的处理精度会明显下降,所以需要将大文本split成小文本。
  • 提高检索精度,对于检索系统,小文本的输入能够提高检索的精度。
  • 优化计算computational资源,对于大的文本,计算资源消耗很大,而且返回结果会很慢。

1.3 split文本方法的种类

1.3.1 (固定长度split)基于tocken–Token-based

什么是token?同样,让AI回答这个问题。(解释下ai中的token@deepseek

  • 一句话核心解释
    Token是AI模型理解和生成文本(或代码、图像)时使用的基本单位。 你可以把它想象成AI世界的“原子”或“乐高积木”。
  • Token是什么?它不是简单的“词”
    很多人会认为一个Token就对应一个英文单词或一个汉字,但这并不完全准确。
    对于英文文本:一个Token通常可以是一个单词(例如:“apple”)、一个词根(例如:“un” 在 “undo” 中),甚至一个标点符号(例如:“!”)。
    例子:句子 “Don’t hesitate to ask!” 可能会被拆分成以下Tokens:[“Don”, “'”, “t”, " hesitate", " to", " ask", “!”]。你看,“Don’t” 被拆成了3个Token。
    对于中文文本:由于中文没有空格分隔,处理方式不同。通常,一个汉字或一个常见的词组会被视为一个Token。
    例子:句子 “我喜欢吃苹果” 可能会被拆分成:[“我”, “喜欢”, “吃”, “苹果”]。这里每个单元都是一个Token。
    关键点:Token是统计和语义上的单位,而不是严格的“单词”。模型通过海量数据学习,确定了如何拆分文本能最有效地捕捉含义和模式。
  • 为什么需要Token?直接处理字符不行吗?
    直接处理字符(比如每个英文字母或每个汉字)从技术上是可行的,但效率极低,原因如下:
    词汇量爆炸:如果以字符为单位,模型需要学习的组合方式太多(26个字母可以组成无数单词),导致模型非常庞大和低效。
    语义丢失:单词或词组的含义远大于单个字符的简单相加。“狗”和“猫”作为整体Token,比拆成笔画或拼音更能表达其明确的概念。
    效率与性能的平衡:Token化在“字符的细粒度”和“单词的粗粒度”之间找到了一个完美的平衡点。它既保留了足够的语义信息,又将输入控制在了可管理的规模。
  • Token是AI世界中的“计价单位”和“资源限制单位”
    • 计费基础:无论是OpenAI、Anthropic还是其他厂商,API的收费基本都是按Token数量计算的(输入和输出的Token总和)。理解Token能帮你更好地估算使用成本。
    • 上下文窗口(Context Window):这是模型一次能处理的最大Token数量(包括你的输入和它的输出)。你经常听到的“128K上下文”,就是指模型最多能同时处理128,000个Token。
    • 如果你的对话(历史记录+新问题+回复)超过了这个限制,最早的信息就会被“遗忘”(从输入中移除)。
1.3.2 (固定长度split)基于character–Character-based

这里,不采用AI专属的概念token进行分割,可以采用人类识别的character进行分割。但是API接口不一样。

2.langchain的文本切割(Text split)

2.1 langchain的文本切割代码(固定长度-token-based)

import asyncio
import bs4,os
from langchain_community.document_loaders import WebBaseLoader,UnstructuredURLLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
page_url = "https://python.langchain.com/docs/how_to/chatbots_memory/"
import tiktoken
async def load_partial_web():
    loader = WebBaseLoader(
        web_paths=[page_url],
        bs_kwargs={
   
   
            "parse_only"

网站公告

今日签到

点亮在社区的每一天
去签到