使用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)来管理和拆分文本,再通过查询引擎获取整体情感。具体修改步骤如下:
- 将评论列表转换为llama_index的
Document - 使用
SummaryIndex创建索引,自动拆分长文本 - 通过
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
相关产品推荐
相关产品推荐

