构建基于向量存储的LLM模型时遇最大令牌限制问题求助
解决LLM上下文令牌超限问题
你遇到的问题根源是检索返回的7个文档片段总令牌数过高——虽然你的提示词和查询很短,但RetrievalQA会把所有检索到的文档内容拼接进传给LLM的prompt里,导致总令牌数超过模型4097的上限。以下是具体解决办法:
减少检索的文档数量:将retriever的
search_kwargs中的k值从7降低,比如改成3或4,这样拼接进prompt的文档内容会大幅减少。修改代码如下:qa = RetrievalQA.from_chain_type( llm=OpenAI(), retriever=vectordb.as_retriever(search_kwargs={'k': 3}), return_source_documents=True )缩小文档拆分的片段尺寸:把
CharacterTextSplitter的chunk_size从1000调小(比如500),同时对应降低chunk_overlap(比如100),让每个文档片段的令牌数更少。修改代码:text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=100)切换到上下文更长的LLM模型:如果业务允许,改用支持更大上下文窗口的模型,比如gpt-3.5-turbo-16k(最大16384令牌)或gpt-4系列。修改LLM初始化代码:
llm=OpenAI(model_name="gpt-3.5-turbo-16k")注:如果使用Chat模型,需要改用
ChatOpenAI类初始化。使用更高效的链类型:默认的
stuff链会把所有文档塞进一个prompt,换成map_reduce或refine链类型,这些链会分批处理文档,避免单prompt令牌超限。修改代码:qa = RetrievalQA.from_chain_type( llm=OpenAI(), chain_type="map_reduce", retriever=vectordb.as_retriever(search_kwargs={'k': 7}), return_source_documents=True )
内容的提问来源于stack exchange,提问作者zizon
相关产品推荐
相关产品推荐

