news 2026/5/20 17:22:46

长文本处理技术综述:突破上下文限制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
长文本处理技术综述:突破上下文限制

长文本处理技术综述:突破上下文限制

前言

大模型的上下文窗口是有限的,但很多应用场景需要处理超长文本。如何高效处理长文本是大模型应用开发中的重要挑战。

我在项目中处理过各种长文本场景,从法律文档分析到代码仓库理解。今天分享一些常用的长文本处理技术。

文本分块技术

基于长度的分块

class FixedSizeChunker: """固定大小分块""" def __init__(self, chunk_size: int = 512, overlap: int = 50): self.chunk_size = chunk_size self.overlap = overlap def chunk(self, text: str) -> list: """分块""" words = text.split() chunks = [] for i in range(0, len(words), self.chunk_size - self.overlap): chunk_words = words[i:i + self.chunk_size] chunks.append(" ".join(chunk_words)) return chunks

基于语义的分块

import re class SemanticChunker: """语义分块""" def __init__(self, max_tokens: int = 512): self.max_tokens = max_tokens def chunk(self, text: str) -> list: """按语义边界分块""" # 按段落分割 paragraphs = re.split(r'\n\n+', text) chunks = [] current_chunk = [] current_size = 0 for para in paragraphs: para_size = self._count_tokens(para) if current_size + para_size > self.max_tokens: if current_chunk: chunks.append("\n\n".join(current_chunk)) current_chunk = [para] current_size = para_size else: current_chunk.append(para) current_size += para_size if current_chunk: chunks.append("\n\n".join(current_chunk)) return chunks def _count_tokens(self, text: str) -> int: """估算 token 数量""" return len(text) // 4

Map-Reduce 策略

class MapReduceProcessor: """Map-Reduce 处理长文本""" def __init__(self, llm, chunk_size: int = 512): self.llm = llm self.chunker = FixedSizeChunker(chunk_size=chunk_size) def process(self, task: str, text: str) -> str: """处理长文本""" # Map 阶段:处理每个块 chunks = self.chunker.chunk(text) summaries = [] for i, chunk in enumerate(chunks): prompt = f"""任务:{task} 文本片段 {i+1}/{len(chunks)}: {chunk} 请提取与任务相关的信息:""" summary = self.llm.generate(prompt) summaries.append(summary) # Reduce 阶段:合并结果 combined = "\n\n".join(summaries) prompt = f"""任务:{task} 各部分分析结果: {combined} 请综合以上信息给出最终回答:""" return self.llm.generate(prompt)

滑动窗口技术

class SlidingWindowProcessor: """滑动窗口处理""" def __init__(self, llm, window_size: int = 512, step: int = 256): self.llm = llm self.window_size = window_size self.step = step def process(self, task: str, text: str) -> str: """滑动窗口处理""" words = text.split() results = [] for i in range(0, len(words), self.step): window_words = words[i:i + self.window_size] window_text = " ".join(window_words) prompt = f"""任务:{task} 文本:{window_text} 分析:""" result = self.llm.generate(prompt) results.append(result) # 综合结果 return self._synthesize(results, task) def _synthesize(self, results: list, task: str) -> str: """综合结果""" combined = "\n\n".join(results) prompt = f"""基于以下分析结果,给出综合回答: {combined} 任务:{task} 综合回答:""" return self.llm.generate(prompt)

递归总结

class RecursiveSummarizer: """递归总结""" def __init__(self, llm, target_length: int = 500): self.llm = llm self.target_length = target_length def summarize(self, text: str) -> str: """递归总结""" current_length = self._count_tokens(text) if current_length <= self.target_length: return text # 分割为两部分 words = text.split() mid = len(words) // 2 left = " ".join(words[:mid]) right = " ".join(words[mid:]) # 递归总结 left_summary = self.summarize(left) right_summary = self.summarize(right) # 合并 combined = f"{left_summary}\n\n{right_summary}" prompt = f"""请总结以下内容: {combined} 总结:""" return self.llm.generate(prompt) def _count_tokens(self, text: str) -> int: return len(text) // 4

实际应用

class LongTextAnalyzer: """长文本分析器""" def __init__(self, llm): self.llm = llm self.processor = MapReduceProcessor(llm) def analyze_document(self, document_path: str, task: str) -> str: """分析文档""" with open(document_path, "r") as f: text = f.read() return self.processor.process(task, text) def answer_question(self, document_path: str, question: str) -> str: """基于文档回答问题""" with open(document_path, "r") as f: text = f.read() # 使用 RAG 风格 chunks = FixedSizeChunker().chunk(text) # 找到最相关的块 relevant_chunks = self._find_relevant(chunks, question) # 基于相关块回答 context = "\n\n".join(relevant_chunks) prompt = f"""基于以下内容回答问题: {context} 问题:{question} 回答:""" return self.llm.generate(prompt) def _find_relevant(self, chunks: list, query: str) -> list: """找到相关的块""" # 简化实现:返回前 3 个块 return chunks[:3]

总结

长文本处理技术:

  1. 分块策略:固定大小 vs 语义分块
  2. Map-Reduce:分而治之的经典方法
  3. 滑动窗口:处理连续文本
  4. 递归总结:层次化压缩

关键要点:

  • 根据任务选择合适的分块策略
  • 保持一定的重叠避免信息丢失
  • 对于问答任务,优先检索相关部分
  • 考虑使用向量数据库进行语义检索
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/20 17:20:32

Excel函数综合应用技巧

Excel函数综合应用技巧 一、基础函数应用 1. 文本处理函数 1.1 LEFT/RIGHT/MID函数 从左侧提取字符&#xff1a; LEFT(文本, 提取长度) 示例&#xff1a;LEFT("Hello World", 5) → "Hello" 从右侧提取字符&#xff1a; RIGHT(文本, 提取长度) 示…

作者头像 李华
网站建设 2026/5/20 17:19:29

HC32F460串口接收超时中断+DMA实战:搞定无协议编码器数据包的完整流程

HC32F460串口接收超时中断与DMA协同设计&#xff1a;工业编码器数据采集实战解析 在工业自动化领域&#xff0c;增量式编码器作为核心位置传感器&#xff0c;其数据采集的稳定性和实时性直接影响运动控制系统的性能。不同于标准通信协议设备&#xff0c;许多工业编码器采用无协…

作者头像 李华
网站建设 2026/5/20 17:18:02

基于SSD202D的摩托车智能仪表方案:从芯片选型到量产实战

1. 项目概述&#xff1a;当摩托车仪表遇上高性能嵌入式CPU作为一名在嵌入式行业摸爬滚打了十几年的老工程师&#xff0c;我见过太多项目从概念到量产的起起落落。最近几年&#xff0c;一个非常有意思的趋势是&#xff0c;传统的摩托车、电动车仪表正在经历一场深刻的智能化变革…

作者头像 李华
网站建设 2026/5/20 17:14:21

为MindSDK搭建ARM GCC编译环境:从工具链配置到工程集成实践

1. 项目概述&#xff1a;为什么需要为MindSDK搭建专属的ARM GCC环境&#xff1f; 如果你正在接触基于ARM Cortex-M内核的微控制器开发&#xff0c;尤其是使用像MindSDK这类厂商提供的软件开发套件&#xff0c;那么你迟早会碰到一个绕不开的环节&#xff1a;搭建一个可靠、版本…

作者头像 李华
网站建设 2026/5/20 17:13:18

5元Air601模组与LuatOS:低成本物联网开发的硬件选型与实战指南

1. 项目概述&#xff1a;当“乐鑫平替”遇上开源OS最近在捣鼓一个需要低成本联网的小玩意儿&#xff0c;核心需求就俩&#xff1a;能连Wi-Fi&#xff0c;最好还能搞点蓝牙&#xff0c;预算压得死死的。正当我对着ESP12F模块琢磨成本时&#xff0c;一个朋友甩过来一个链接&#…

作者头像 李华
网站建设 2026/5/20 17:12:04

从开题到定稿,okbiye 如何让本科毕业论文写作告别 “通宵焦虑”

okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPT毕业论文 - Okbiye智能写作https://www.okbiye.com/ai/bylw 一、本科毕业论文的 “三座大山”&#xff0c;正在拖垮你的毕业季 对于大多数本科生而言&#xff0c;毕业论文写作早已不是 “写一篇文章”…

作者头像 李华