news 2026/8/1 4:45:37

Python 如何处理 AI API 的长文本:文件读取、分段与上下文整理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 如何处理 AI API 的长文本:文件读取、分段与上下文整理

当文档、日志或代码文件较长时,直接一次性发送给 AI API 容易超过上下文限制,也会增加处理时间。本文介绍一种适合个人项目的长文本处理流程。

为什么长文本不能直接全部发送?

一段较长的内容直接放进请求里,可能遇到:

  • 超过模型上下文长度
  • 请求体过大
  • 响应变慢
  • 处理结果不完整
  • 内容中无关部分太多

更实用的流程是:

读取文件 → 清理内容 → 分段 → 分别处理 → 汇总结果

这样可以让每次请求只处理一部分内容,也更方便定位失败位置。


一、先读取文本文件

Python 可以使用pathlib读取文件:

frompathlibimportPath file_path=Path("example.txt")text=file_path.read_text(encoding="utf-8")print(text[:500])

如果文件可能不是 UTF-8 编码,需要根据实际情况处理编码异常。不要默认所有文件都可以直接读取。


二、先清理无用内容

在分段前,可以先做简单清理:

defclean_text(text:str)->str:lines=[line.strip()forlineintext.splitlines()]lines=[lineforlineinlinesifline]return"\n".join(lines)

清理的目的不是删除所有空行,而是减少重复空白、无效分隔符和明显无关内容。

如果是日志文件,还可以根据时间、级别或关键字筛选内容。


三、按照固定长度分段

最简单的分段方式是按照字符数量切分:

defsplit_text(text:str,chunk_size:int=4000)->list[str]:return[text[i:i+chunk_size]foriinrange(0,len(text),chunk_size)]

这种方式实现简单,但可能把一句话或一个代码块从中间截断。

适合用于:

  • 初步测试
  • 结构简单的纯文本
  • 对边界要求不高的任务

四、优先按照段落分段

如果希望保留文章结构,可以优先按段落切分:

defsplit_by_paragraph(text:str,max_chars:int=4000)->list[str]:paragraphs=text.split("\n\n")chunks=[]current=[]current_length=0forparagraphinparagraphs:ifcurrentandcurrent_length+len(paragraph)>max_chars:chunks.append("\n\n".join(current))current=[]current_length=0current.append(paragraph)current_length+=len(paragraph)ifcurrent:chunks.append("\n\n".join(current))returnchunks

这种方式比直接按字符切分更适合文章、说明文档和 Markdown 文件。


五、给每个分段增加编号

分段处理时,建议保留编号:

chunks=split_by_paragraph(text)forindex,chunkinenumerate(chunks,start=1):print(f"正在处理第{index}/{len(chunks)}段")

编号可以帮助你:

  • 定位失败片段
  • 记录处理进度
  • 重新处理单个分段
  • 汇总结果时保持顺序

六、调用 AI API 分别处理每一段

下面是一个基础示例:

fromopenaiimportOpenAI client=OpenAI(api_key="your-api-key",base_url="https://your-api-domain.com/v1",)defsummarize_chunk(chunk:str)->str:response=client.chat.completions.create(model="your-model-name",messages=[{"role":"system","content":"你负责提取文本中的关键事实,保持简洁,不要添加原文没有的信息。",},{"role":"user","content":f"请总结下面这段内容:\n\n{chunk}",},],)returnresponse.choices[0].message.content

实际处理时,可以逐段调用并保存结果。


七、最后汇总分段结果

summaries=[]forindex,chunkinenumerate(chunks,start=1):summary=summarize_chunk(chunk)summaries.append(f"第{index}段:{summary}")final_text="\n\n".join(summaries)print(final_text)

如果分段数量很多,最终汇总也可能变成长文本。可以再次进行二次总结,或者只保留关键字段。


八、长文本处理中的几个注意点

1. 分段不要过大

要给系统提示词和模型输出留出空间。

2. 分段不要过小

过小会导致上下文不足,增加请求次数。

3. 需要保留文档结构

标题、章节和代码块最好不要随意截断。

4. 失败后支持单段重试

不要因为一个片段失败就丢弃全部结果。

5. 注意敏感信息

上传前应检查密钥、手机号、邮箱和其他隐私内容。


九、适合长文本分段的场景

  • Markdown 文档总结
  • 项目日志分析
  • 代码文件说明
  • 会议记录整理
  • 知识库内容处理
  • 批量文本分类

如果任务需要理解全文关系,可以先分段提取信息,再进行统一汇总。


十、结语

长文本处理的核心不是简单截断,而是建立一个可恢复的流程:

  • 先读取和清理
  • 根据内容分段
  • 逐段处理并记录编号
  • 失败时只重试单段
  • 最后汇总结果

对于 Python AI 项目来说,这种方式比一次性发送整篇文档更容易控制请求规模,也方便后续扩展缓存、限流和日志功能。

免责声明

本文内容仅用于技术交流与经验分享,具体实现请结合项目实际情况调整。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/1 4:39:41

STM32 HAL库核心函数解析与实战:从寄存器到高效开发

1. 从寄存器到HAL:STM32开发者的效率革命如果你是从51单片机或者早期直接操作STM32寄存器过来的开发者,第一次接触HAL库的感觉,大概率是既困惑又惊喜。困惑在于,以前直接写GPIOA->ODR | 0x0001;就能点亮一个灯,现在…

作者头像 李华
网站建设 2026/8/1 4:38:49

大模型已经很会搜索了,为什么还需要 QVeris?

QVeris 产品解读 大模型已经很会搜索了,为什么还需要 QVeris?搜到信息,和获得可以直接工作的数据,是两件事。 假设你对一个金融 Agent 说:"帮我看看这家公司最近有什么变化。"今天的大模型很会搜。它可以找…

作者头像 李华
网站建设 2026/8/1 4:37:51

Python中使用Vosk实现离线语音识别实践

1. 项目概述:Vosk-ASR在Python中的语音识别实践Vosk是一个开源的语音识别工具包,支持多种编程语言调用,其中Python接口因其易用性备受开发者青睐。这个项目主要演示如何通过Python调用Vosk实现高质量的语音转文字功能,特别适合需要…

作者头像 李华
网站建设 2026/8/1 4:37:36

硬件工程师必备:如何绘制与解读一份专业级的“最全电路图”

1. 项目概述:一张图背后的工程世界 “最全电路图”——这个标题听起来像是一个雄心勃勃的收藏家宣言,或者是一个新手工程师在项目开始前最想找到的“终极答案”。作为一名在硬件开发一线摸爬滚打了十多年的老工程师,我深知这四个字背后所承载…

作者头像 李华
网站建设 2026/8/1 4:36:27

OpenCV 保姆级入门:从图像本质到代码实现的核心操作全解

一、前置基础:图像在计算机里到底是什么? 在写代码之前,先搞懂最核心的底层概念,后面所有操作都基于这个: 灰度图:本质是一个二维数组,行数 图像高度,列数 图像宽度。每个元素是…

作者头像 李华
网站建设 2026/8/1 4:35:54

Jetson Xavier NX中文环境配置:从Locale到Fcitx输入法实战指南

1. 项目概述:为什么Jetson Xavier NX的语言设置是个“技术活”?刚拿到一块英伟达的Jetson Xavier NX开发板,很多朋友的第一反应是赶紧跑个AI模型试试性能。但当你兴奋地接上显示器、键盘鼠标,准备大干一场时,很可能第一…

作者头像 李华