上下文管理艺术突破 Token 限制 学习目标掌握长文档处理的三种核心策略学会设计记忆机制和对话管理系统理解 RAG检索增强生成的实战应用能够构建万字长文自动生成系统 核心概念Token 限制的困境现状所有 LLM 都有上下文窗口限制模型上下文窗口相当于GPT-4 Turbo128K~10 万汉字Claude 3200K~15 万汉字GLM-4128K~10 万汉字GPT-3.516K~1.2 万汉字问题即使是最先进的模型也无法一次性处理整本书或超长技术文档。 三大解决方案方案 1分块策略Chunking基础分块defsplit_document(document,chunk_size4000,overlap200): 将长文档分割为重叠的块 Args: document: 原始文档 chunk_size: 每块大小字符数 overlap: 重叠区域大小 Returns: 分块列表 chunks[]start0whilestartlen(document):endstartchunk_size chunkdocument[start:end]# 确保不在句子中间切断ifendlen(document):last_periodchunk.rfind(。)iflast_periodchunk_size*0.7:chunkchunk[:last_period1]endstartlast_period1chunks.append(chunk)startend-overlapreturnchunks# 使用示例documentload_long_article()# 10 万字chunkssplit_document(document)print(f分为{len(chunks)}块)智能分块按结构importredefsmart_split_by_structure(markdown_text): 根据 Markdown 标题层级智能分块 Args: markdown_text: Markdown 格式文本 Returns: 结构化分块列表 # 提取所有章节标题patternr^(#{1,3})\s(.)$matchesre.finditer(pattern,markdown_text,re.MULTILINE)sections[]positions[m.start()forminmatches]fori,posinenumerate(positions):startpos endpositions[i1]ifi1len(positions)elselen(markdown_text)sectionmarkdown_text[start:end]sections.append(section)returnsections# 使用sectionssmart_split_by_structure(long_markdown)fori,sectioninenumerate(sections):print(f\n 第{i1}节 )print(section[:100])# 预览前 100 字优势✅ 保持语义完整性✅ 符合人类阅读习惯✅ 便于后续组装方案 2记忆机制Memory System对话缓冲区Conversation BufferclassConversationBuffer:简单的对话历史管理def__init__(self,max_tokens3000):self.messages[]self.max_tokensmax_tokens self.current_tokens0defadd_message(self,role,content):添加消息并自动清理旧消息token_countestimate_tokens(content)# 如果超出限制删除最旧的消息whileself.current_tokenstoken_countself.max_tokens:ifself.messages:old_msgself.messages.pop(0)self.current_tokens-estimate_tokens(old_msg[content])else:break# 添加新消息self.messages.append({role:role,content:content})self.current_tokenstoken_countdefget_messages(self):获取当前对话历史returnself.messages# 使用示例bufferConversationBuffer(max_tokens3000)buffer.add_message(user,我想写一篇关于 Python 装饰器的文章)buffer.add_message(assistant,好的装饰器是 Python 的高级特性...)buffer.add_message(user,能举个例子吗)# 获取对话历史historybuffer.get_messages()responsellm.chat(history)摘要记忆Summary MemoryclassSummaryMemory:保留核心信息的摘要记忆def__init__(self,llm):self.llmllm self.summaryself.recent_messages[]defupdate_summary(self,new_content):动态更新摘要promptf 请基于以下对话历史生成一个简洁的摘要200 字以内 【当前摘要】{self.summary}【新内容】{new_content}【更新后的摘要】 self.summaryself.llm.generate(prompt)returnself.summarydefadd_message(self,role,content):self.recent_messages.append({role:role,content:content})# 每 5 条消息更新一次摘要iflen(self.recent_messages)%50:recent_conv\n.join([m[content]forminself.recent_messages[-5:]])self.update_summary(recent_conv)self.recent_messages[]# 清空临时消息defget_context(self):获取完整上下文returnf{self.summary}\n\n最近对话:\n\\n.join([f{m[role]}:{m[content]}forminself.recent_messages])适用场景✅ 长篇连载小说创作✅ 多章节技术文档✅ 长期项目规划方案 3RAG检索增强生成基础 RAG 架构fromsklearn.feature_extraction.textimportTfidfVectorizerimportnumpyasnpclassSimpleRAG:简易版 RAG 系统def__init__(self,llm):self.llmllm self.documents[]self.vectorizerTfidfVectorizer()self.vectorsNonedefadd_documents(self,docs):添加文档到知识库self.documents.extend(docs)self.vectorsself.vectorizer.fit_transform(self.documents)defsearch(self,query,top_k3):检索相关文档query_vecself.vectorizer.transform([query])similarities(query_vec*self.vectors.T).toarray()[0]top_indicesnp.argsort(similarities)[-top_k:][::-1]return[self.documents[i]foriintop_indices]defgenerate_with_context(self,query):基于检索结果生成回答context_docsself.search(query)promptf 基于以下参考资料回答问题 【参考资料】{ .join(context_docs)}【问题】{query}【回答】 returnself.llm.generate(prompt)# 使用ragSimpleRAG(llm)# 加载知识库knowledge_baseload_technical_docs()rag.add_documents(knowledge_base)# 查询answerrag.generate_with_context(Python 装饰器的工作原理是什么)print(answer) 实战万字长文自动生成Step 1: 大纲驱动写作asyncdefgenerate_long_article(topic,target_words10000): 生成万字长文 Args: topic: 文章主题 target_words: 目标字数 Returns: 完整文章 # 1. 生成详细大纲outline_promptf 请为《{topic}》生成一个详细的大纲要求 1. 包含 8-12 个主要章节 2. 每个章节有 3-5 个小节 3. 预计总字数{target_words}字 格式 # 主标题 ## 1. 第一章 ### 1.1 第一节 ### 1.2 第二节 ... outlineawaitllm.async_generate(outline_prompt)# 2. 逐章撰写article_parts[]chaptersparse_chapters(outline)forchapterinchapters:chapter_promptf 基于以下大纲撰写第{chapter.number}章 【完整大纲】{outline}【本章标题】{chapter.title}【本章小节】{chapter.subsections}【要求】 - 字数1500-2000 字 - 风格技术博客深入浅出 - 包含代码示例 chapter_contentawaitllm.async_generate(chapter_prompt)article_parts.append(chapter_content)print(f✓ 第{chapter.number}章完成 ({len(chapter_content)}字))# 3. 组装全文full_article\n\n.join(article_parts)returnfull_article# 运行articleawaitgenerate_long_article(Python 异步编程完全指南,target_words12000)print(f全文共{len(article)}字)Step 2: 一致性检查asyncdefcheck_consistency(article): 检查长文的一致性 检查项 1. 术语使用是否统一 2. 代码风格是否一致 3. 逻辑是否连贯 # 提取关键术语termsextract_key_terms(article)# 检查术语一致性consistency_promptf 请检查以下文章的术语使用是否一致 【文章】{article[:5000]}... # 取前 5000 字 【关键术语列表】{terms}【检查项】 1. 同一概念是否使用了不同词汇 2. 缩写是否首次出现时有全称 3. 代码示例的命名风格是否统一 【问题列表】 issuesawaitllm.async_generate(consistency_prompt)returnissues# 使用issuesawaitcheck_consistency(article)ifissues:print(发现一致性问题:)print(issues)Step 3: 自动修订asyncdefrevise_article(article,issues): 根据问题列表自动修订文章 Args: article: 原文 issues: 问题列表 Returns: 修订后的文章 revise_promptf 请根据以下问题修订文章 【原文】{article}【问题】{issues}【修订要求】 1. 保持原意不变 2. 只修改有问题的部分 3. 用批注标记修改处 【修订版】 revisedawaitllm.async_generate(revise_prompt)returnrevised# 完整流程articleawaitgenerate_long_article(topic)issuesawaitcheck_consistency(article)final_articleawaitrevise_article(article,issues)save_to_file(final_article,final.md) 高级技巧技巧 1渐进式摘要classProgressiveSummarizer:渐进式摘要生成器def__init__(self,llm):self.llmllmdefsummarize_layers(self,text,layers3): 生成多层级摘要 Layer 1: 一句话总结10 字 Layer 2: 段落摘要100 字 Layer 3: 详细摘要500 字 summaries[]# Layer 1: 极简摘要prompt1f用一句话总结以下内容不超过 10 个字:\n{text[:1000]}summaries.append(self.llm.generate(prompt1))# Layer 2: 简短摘要prompt2f用 100 字总结:\n{text}summaries.append(self.llm.generate(prompt2))# Layer 3: 详细摘要prompt3f用 500 字详细总结:\n{text}summaries.append(self.llm.generate(prompt3))returnsummaries# 使用summarizerProgressiveSummarizer(llm)layerssummarizer.summarize_layers(long_document)fori,summaryinenumerate(layers,1):print(f\nLayer{i}:\n{summary})技巧 2跨章节引用defadd_cross_references(article): 自动添加跨章节引用 例如 正如我们在第 3 章讨论的... 这个概念将在第 7 章深入探讨... # 提取章节信息chaptersextract_chapters(article)# 识别可引用的概念conceptsfind_key_concepts(article)# 生成引用forconceptinconcepts:first_mentionfind_first_mention(article,concept)later_chapterfind_later_discussion(chapters,concept)iflater_chapter:# 在首次提到处添加引用notef详见第{later_chapter.number}章articleinsert_after(article,first_mention,note)returnarticle⚠️ 常见问题Q1: 如何避免分块后丢失上下文A: 使用重叠窗口边界检测defsplit_with_overlap(text,chunk_size4000,overlap500):chunks[]start0whilestartlen(text):endstartchunk_size# 寻找最近的句子边界ifendlen(text):boundarytext.rfind(。,start,end)ifboundarystartchunk_size*0.8:endboundary1chunktext[start:end]chunks.append(chunk)# 重叠部分startend-overlapreturnchunksQ2: RAG 检索不准确怎么办A: 优化向量表示混合检索fromsentence_transformersimportSentenceTransformerclassAdvancedRAG:def__init__(self):self.modelSentenceTransformer(all-MiniLM-L6-v2)defhybrid_search(self,query,bm25_results,vector_results,k5):结合 BM25 和向量检索# 加权融合combined_scores{}fordoc,scoreinzip(bm25_results,range(len(bm25_results))):combined_scores[doc]score*0.4# BM25 权重 40%fordoc,scoreinzip(vector_results,range(len(vector_results))):ifdocincombined_scores:combined_scores[doc]score*0.6# 向量权重 60%else:combined_scores[doc]score*0.6# 返回 Top-Ksorted_docssorted(combined_scores.items(),keylambdax:x[1],reverseTrue)[:k]return[docfordoc,scoreinsorted_docs]Q3: 如何保证长文的连贯性A: 使用过渡段生成前后呼应defgenerate_transitions(chapters):为章节之间生成过渡段transitions[]foriinrange(len(chapters)-1):current_summarysummarize(chapters[i])next_previewpreview(chapters[i1])transition_promptf 基于上一章总结:{current_summary}和下一章预告{next_preview}生成一个承上启下的过渡段100-150 字 transitionllm.generate(transition_prompt)transitions.append(transition)returntransitions 课后作业基础题实现一个简单的分块函数支持重叠窗口为对话系统添加缓冲记忆机制进阶题构建一个基于 TF-IDF 的简易 RAG 系统实现大纲驱动的万字长文生成器挑战题开发一致性检查工具自动检测术语不统一问题实现完整的长文创作系统分块 记忆RAG 延伸阅读LangChain Memory 模块文档RAG 最佳实践论文Sentence Transformers 库长文本处理技术报告 - OpenAI 总结核心要点分块是基础智能分块保持语义完整记忆是关键缓冲区和摘要维持上下文RAG 是方向检索增强突破知识边界✍️一致性是保障自动检查和修订提升质量行动清单✅ 为你的写作助手添加记忆模块✅ 实验不同的分块策略✅ 尝试集成 RAG 能力✅ 建立自动化审校流程下篇预告《质量评估体系如何判断 AI 写得好不好》BLEU、ROUGE 等自动评估指标详解人工评估维度设计A/B 测试方法论实战构建写作质量打分系统敬请期待