
1) 【一句话结论】处理长文本输入需结合文档切分(按逻辑单元如章节/段落)与跨切分保留(保留句子边界、关键实体),通过多轮拼接或特殊token(如<doc_end>)保证语义连贯性,核心是平衡信息完整性与模型上下文窗口。
2) 【原理/概念讲解】老师口吻:大语言模型(LLM)存在上下文窗口限制(如512 tokens),长文本需切分处理。
3) 【对比与适用场景】
| 策略类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 固定长度切分 | 按固定token数(如512)分割文本 | 简单易实现,但可能切分句子中间 | 简单查询、短文本 | 可能破坏句子结构,语义不连贯 |
| 逻辑单元切分 | 按段落、句子、章节等逻辑边界分割 | 保持局部语义连贯 | 长文档理解、知识库检索 | 需先做文本结构化(如NLP分句) |
| 混合策略 | 结合固定长度与逻辑单元(如先按逻辑单元切分,再调整长度) | 平衡长度与语义 | 复杂长文本处理 | 实现复杂,需动态调整 |
4) 【示例】(伪代码)
def process_long_text(text, max_tokens=512):
# 分句
sentences = split_into_sentences(text)
chunks = []
current_chunk = []
current_len = 0
for s in sentences:
token_len = count_tokens(s)
if current_len + token_len + 1 <= max_tokens: # +1为分隔符
current_chunk.append(s)
current_len += token_len
else:
# 处理当前chunk(跨切分保留)
if current_chunk:
chunks.append(merge_with_preserve(current_chunk))
current_chunk = [s]
current_len = token_len
if current_chunk:
chunks.append(merge_with_preserve(current_chunk))
return chunks
def merge_with_preserve(chunk):
# 保留句子结尾标点和实体
merged = " ".join(chunk)
# 示例:保留最后一个标点
if merged.endswith(('.', '!', '?')):
merged = merged.rstrip('!?.') + merged[-1]
return merged
(输入长文本“文本1...文本2...”,分句后按逻辑单元切分,跨切分保留标点,最终输出可拼接的片段。)
5) 【面试口播版答案】(约90秒)
“面试官您好,处理长文本输入的核心思路是结合文档切分与跨切分保留,同时保证信息完整性。首先,长文本超过模型上下文窗口(如512 tokens)时,需按逻辑单元(如段落、句子)切分,比如按段落切分后,每个段落长度控制在窗口内。然后,跨切分保留关键信息,比如保留句子结尾的标点(如“。”)和实体(如人名“张三”),避免语义断裂。接着,通过拼接机制(如用<doc_end>分隔或分轮次输入)保证语义连贯,比如第一轮输入前N个段落,第二轮输入剩余部分,模型能理解上下文。这样既能处理长文本,又保持信息完整。”
6) 【追问清单】
7) 【常见坑/雷区】