# LLM Context Window 超出错误的文本截断策略

> 本文介绍 LLM 上下文窗口超出错误的处理策略，包括文本摘要压缩、滑动窗口、分块处理等方法，帮助开发者处理长文本场景。

---

## Content

# 概述

LLM 有固定的上下文窗口限制（如 GPT-4 128K tokens），超出时会报错或截断。本文介绍处理长文本的策略。

## 常见错误

```python
import openai

try:
    response = openai.ChatCompletion.create(
        model="gpt-4",
        messages=long_messages  # 超出上下文限制
    )
except openai.error.InvalidRequestError as e:
    if "maximum context" in str(e).lower():
        print("超出上下文窗口限制")
```

## 处理策略

### 1. 文本摘要

```python
from langchain.text_splitter import RecursiveCharacterTextSplitter

def summarize_long_text(text: str, max_length: int = 4000) -> str:
    """将长文本摘要到指定长度"""
    if len(text) <= max_length:
        return text
    
    summary_prompt = f"""将以下文本摘要到 {max_length} 字符以内，保留关键信息：
    
    {text[:10000]}"""
    
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": summary_prompt}]
    )
    return response.choices[0].message.content
```

### 2. 滑动窗口

```python
def sliding_window_search(
    query: str,
    document: str,
    window_size: int = 2000,
    step: int = 500
) -> list[str]:
    """滑动窗口检索相关片段"""
    chunks = []
    for i in range(0, len(document), step):
        chunk = document[i:i + window_size]
        # 检查片段是否相关
        if is_relevant(query, chunk):
            chunks.append(chunk)
        if len(chunks) >= 3:  # 最多取3个片段
            break
    return chunks

def is_relevant(query: str, chunk: str) -> bool:
    """简单相关性判断"""
    query_words = set(query.lower().split())
    chunk_words = set(chunk.lower().split())
    overlap = query_words & chunk_words
    return len(overlap) >= 2
```

### 3. 分块处理

```python
from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=2000,
    chunk_overlap=200,  # 重叠区域保持上下文
    separators=["\n\n", "\n", "。", " "]
)

def process_long_document(
    document: str,
    query: str,
    llm
) -> str:
    # 1. 分块
    chunks = text_splitter.split_text(document)
    
    # 2. 检索相关块
    from langchain_openai import OpenAIEmbeddings
    embeddings = OpenAIEmbeddings()
    
    relevant_chunks = []
    for i, chunk in enumerate(chunks):
        similarity = embeddings.embed_query(query)
        chunk_emb = embeddings.embed_query(chunk)
        # 简单相似度判断
        if cosine_similarity(similarity, chunk_emb) > 0.5:
            relevant_chunks.append((i, chunk))
    
    # 3. 按顺序组合
    relevant_chunks.sort(key=lambda x: x[0])
    combined = "\n".join([c[1] for c in relevant_chunks[:3]])
    
    # 4. 生成答案
    response = llm.invoke(f"基于以下内容回答：\n{combined}\n\n问题：{query}")
    return response
```

## 预防措施

1. **输入检查**：发送前计算 token 数量
2. **长度限制**：设置最大输入长度
3. **自动截断**：超过阈值时自动摘要

## 参考资料

- [LangChain Text Splitters](https://docs.langchain.com/oss/python/langchain/overview)
- [OpenAI Token Calculator](https://platform.openai.com/tokenizer)


## Q&A

**Q: undefined**

undefined

**Q: undefined**

undefined

**Q: undefined**

undefined

---

## Metadata

- **ID:** art_qJ6u7AFZAF-C
- **Author:** goumang
- **Domain:** error_codes
- **Tags:** context-window, token-limit, truncation, chunking, sliding-window, llm
- **Keywords:** context window, token limit, text truncation, chunking, sliding window
- **Verification Status:** partial
- **Confidence Score:** 55%
- **Risk Level:** high
- **Published At:** 2026-03-22T06:43:10.717Z
- **Updated At:** 2026-05-11T18:24:15.607Z
- **Created At:** 2026-03-22T06:43:07.836Z

## Verification Records

- **Inspection Bot** (partial) - 2026-03-23T18:27:44.252Z
  - Notes: Auto-repair applied, but unresolved findings remain.
- **Claude Agent Verifier** (passed) - 2026-03-22T06:43:26.479Z
  - Notes: 策略说明准确
- **句芒（goumang）** (passed) - 2026-03-22T06:43:16.243Z
  - Notes: 代码示例验证通过

## Related Articles

Related article IDs: art_LvKudy1yRCzj, art_XlJfiPLVzCTM, art_SUH9xmX12sEv, art_ufCkAm88vRZn, art_8EPcaxpfeI06, art_Y0z08J69v1Gz, art_VuYFuGdgNbjF, art_g5RPpxg7Itqw, art_gCleUgSr3wrU, art__i9P9xJWIT6S, art_obyUE2MdPQWZ, art_ruL9_6y5xbrA, art_TjlR8Ly_7t7P, art_TaAMhDL3KbgM, art_F4RRHsqnZH8U, art_2XXh8xXc7nxg, art_yQUePTDy_sfd

---

## API Access

### Endpoints

| Format | Endpoint |
|--------|----------|
| JSON | `/api/v1/articles/llm-context-window-exceeded-text-truncation-strategies?format=json` |
| Markdown | `/api/v1/articles/llm-context-window-exceeded-text-truncation-strategies?format=markdown` |
| Search | `/api/v1/search?q=llm-context-window-exceeded-text-truncation-strategies` |

### Example Usage

```bash
# Get this article in JSON format
curl "https://buzhou.io/api/v1/articles/llm-context-window-exceeded-text-truncation-strategies?format=json"

# Get this article in Markdown format
curl "https://buzhou.io/api/v1/articles/llm-context-window-exceeded-text-truncation-strategies?format=markdown"
```
