基于GPT4ALL与Instructor-large的文档QA聊天bot提示词超窗问题
解决GPT4ALL+Instructor-large构建文档QA机器人的提示窗口溢出问题
问题背景
使用GPT4ALL作为大语言模型、Hugging Face的Instructor-large作为嵌入模型构建文档QA聊天机器人,已成功完成文档索引构建,但执行查询时无回溯报错,仅重复返回提示:ERROR: The prompt size exceeds the context window size and cannot be processed。
问题分析
核心问题在于生成的prompt总长度(系统提示+检索到的上下文+用户查询)超过了GPT4ALL模型的上下文窗口限制,现有配置未充分适配模型实际参数:
- 当前设置的
max_input_size=4096未匹配GPT4All-13B-snoozy的实际上下文窗口(该模型默认支持8192上下文窗口); chunk_size=1024设置的文本块长度偏大,检索时多个块拼接后易超出窗口;- 未限制检索返回的上下文数量,导致拼接内容过多。
解决方案
以下是针对性的代码调整步骤:
1. 明确设置模型上下文窗口
在初始化GPT4ALL时,添加context_window参数,匹配模型实际支持的窗口大小:
llm = GPT4All( model=model_path, callbacks=callbacks, verbose=True, context_window=8192 # GPT4All-13B-snoozy默认支持8192上下文窗口 )
2. 优化文本块与PromptHelper参数
调小文本块大小,并为PromptHelper的max_input_size预留系统提示和用户查询的空间:
# 调小chunk_size至512,减少单个文本块的token数 service_context = ServiceContext.from_defaults( chunk_size=512, llm=llm, prompt_helper=PromptHelper( max_input_size=7168, # 预留1024给系统提示和查询内容 num_output=256, max_chunk_overlap=0.1 # 降低重叠率,减少冗余内容 ), embed_model=embed_model )
3. 限制检索返回的上下文数量
创建查询引擎时,设置similarity_top_k减少返回的上下文块数量,控制prompt总长度:
# 仅返回最相关的3个文本块,避免拼接内容过多 query_engine = index.as_query_engine(similarity_top_k=3)
4. 可选:自定义精简提示模板
如果默认提示模板过长,可自定义更简洁的模板,减少固定内容的token占用:
from llama_index import PromptTemplate # 自定义精简提示模板 qa_template_str = """ 以下是相关上下文信息: {context_str} 基于上述信息,回答问题:{query_str} """ qa_template = PromptTemplate(qa_template_str) query_engine = index.as_query_engine( similarity_top_k=3, text_qa_template=qa_template )
完整调整后代码示例
from llama_index import VectorStoreIndex, SimpleDirectoryReader, PromptHelper, ServiceContext, LangchainEmbedding, PromptTemplate from langchain.embeddings import HuggingFaceEmbeddings from langchain.llms import GPT4All from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler documents = SimpleDirectoryReader(r'C:\Users\avish.wagde\Documents\work_avish\LLM_trials\instructor_large').load_data() print('document loaded in memory.......') model_id = 'hkunlp/instructor-large' model_path = "..\models\GPT4All-13B-snoozy.ggmlv3.q4_0.bin" callbacks = [StreamingStdOutCallbackHandler()] # 明确设置上下文窗口 llm = GPT4All(model=model_path, callbacks=callbacks, verbose=True, context_window=8192) print('llm model ready.............') embed_model = LangchainEmbedding(HuggingFaceEmbeddings(model_name=model_id)) print('embedding model ready.............') # 优化PromptHelper参数 prompt_helper = PromptHelper(max_input_size=7168, num_output=256, max_chunk_overlap=0.1) # 调小chunk_size service_context = ServiceContext.from_defaults(chunk_size=512, llm=llm, prompt_helper=prompt_helper, embed_model=embed_model) print('service context set...........') index = VectorStoreIndex.from_documents(documents, service_context=service_context) print('indexing done................') # 自定义精简模板并限制检索数量 qa_template_str = """ 以下是相关上下文信息: {context_str} 基于上述信息,回答问题:{query_str} """ qa_template = PromptTemplate(qa_template_str) query_engine = index.as_query_engine(similarity_top_k=3, text_qa_template=qa_template) print('query set...........') response = query_engine.query("What is apple's finnacial situation") print(response)
内容的提问来源于stack exchange,提问作者Avish Wagde
相关产品推荐
相关产品推荐

