You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用llama_index PromptHelper仍超出GPT-3.5-turbo-16k上下文长度求助

问题排查:GPT-3.5-turbo-16k上下文长度超限问题

问题背景

尝试用Azure OpenAI的GPT-3.5-turbo-16k模型分析Instagram帖子评论的整体情感,因评论数量过多频繁触发上下文长度超限错误。使用llama_index的PromptHelper调整参数后仍无效,错误信息如下:

InvalidRequestError: This model's maximum context length is 16384 tokens. However, your messages resulted in 22272 tokens. Please reduce the length of the messages.

代码问题定位

核心问题在于SimpleChatEngine不会自动拆分prefix_messages中的系统消息:你将所有评论打包成一条系统消息传入后,PromptHelper和node_parser的配置根本没有生效——这些组件是用于处理索引化的文档数据,而非直接处理前缀消息内容。SimpleChatEngine会直接把完整的前缀消息发送给LLM,自然会触发token超限。

解决方案

要让llama_index的文本拆分能力生效,需要将评论内容转换为Document对象,通过索引(如SummaryIndex)来管理和拆分文本,再通过查询引擎获取整体情感。具体修改步骤如下:

  1. 将评论列表转换为llama_index的Document
  2. 使用SummaryIndex创建索引,自动拆分长文本
  3. 通过QueryEngine查询整体情感

修改后的代码示例

from llama_index.llms import AzureOpenAI
from llama_index import ServiceContext, PromptHelper
from llama_index.text_splitter import TokenTextSplitter
from llama_index.node_parser import SimpleNodeParser
from llama_index import Document, SummaryIndex

import pandas as pd
import glob
import os

# 加载评论数据
csv_files = glob.glob('data/csv/*.csv')
df = pd.read_csv(
    csv_files[1],
    sep='|'
)
context_comments = df['COMENTARIO'].to_list()

# 将每条评论转换为独立的Document对象
documents = [Document(text=comment) for comment in context_comments]

# 定义LLM
llm = AzureOpenAI(
    model=MODEL_NAME,
    engine=DEPLOYMENT_NAME,
    api_key=AZURE_OPENAI_API_KEY,
    api_base=AZURE_BASE_URL,
    api_type="azure",
    api_version="2023-05-15"
)

# 配置文本拆分器和PromptHelper
node_parser = SimpleNodeParser.from_defaults(
  text_splitter=TokenTextSplitter(chunk_size=512, chunk_overlap=20)
)

prompt_helper = PromptHelper(
  context_window=16384,
  num_output=1500,
  chunk_overlap_ratio=0.2,
  separator="\n"
)

# 创建服务上下文
service_context = ServiceContext.from_defaults(
    llm=llm,
    prompt_helper=prompt_helper,
    node_parser=node_parser,
    embed_model=None,
    chunk_size=512,
    context_window=16384,
    num_output=1500
)

# 创建SummaryIndex并构建查询引擎(采用树状汇总处理长文本)
index = SummaryIndex.from_documents(documents, service_context=service_context)
query_engine = index.as_query_engine(
    response_mode="tree_summarize",
    verbose=True
)

# 执行情感分析查询
query = """Analiza el sentimiento general de todos los comentarios. 
Redacta tu respuesta como un informe para los responsables de la publicación, 
detallando el sentimiento dominante y cualquier tendencia relevante."""

response = query_engine.query(query)
print(response)

关键说明

  • SummaryIndex会自动将评论拆分为符合token限制的节点,通过tree_summarize模式逐层汇总每个节点的情感,最终得到整体结论
  • 不再将所有评论塞进系统消息,而是让llama_index的索引机制处理文本拆分,从根本上避免上下文超限问题

内容的提问来源于stack exchange,提问作者Jorge Ros

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 20:59:53