使用LangChain时如何减少传递给OpenAI的Token数量?
解决LangChain中ConversationalRetrievalChain Token超量问题
当chat_history为空、问题本身也很短却触发Token超量错误时,核心原因是检索器返回的文档总Token数超出了gpt-3.5-turbo的4097上下文限制。以下是几种可行的解决方法:
减少单次检索的文档数量
通过调整检索器的search_kwargs参数,限制返回的最相关文档数量,直接降低总Token规模:retriever: VectorStoreRetriever = db.as_retriever(search_kwargs={"k": 2}) # 仅返回2个最相关文档,可根据需求调整截断检索到的文档内容
对每个文档的内容进行截断,只保留前N个字符(或Token),减少单文档的Token占用:# 定义文档截断函数 def truncate_document(doc, max_characters=1000): doc.page_content = doc.page_content[:max_characters] return doc # 包装检索器,自动截断返回的文档 class TruncatedRetriever: def __init__(self, base_retriever, max_len=1000): self.base_retriever = base_retriever self.max_len = max_len def get_relevant_documents(self, query): docs = self.base_retriever.get_relevant_documents(query) return [truncate_document(doc, self.max_len) for doc in docs] # 初始化截断后的检索器并传入QA链 base_retriever = db.as_retriever(search_kwargs={"k": 3}) truncated_retriever = TruncatedRetriever(base_retriever) qa = ConversationalRetrievalChain.from_llm(model, retriever=truncated_retriever)切换到长上下文模型
若业务场景允许,直接使用支持更长上下文的模型,从根源上解决Token限制问题:model = ChatOpenAI(model_name="gpt-3.5-turbo-16k") # 支持16384 Token上下文使用上下文压缩工具提炼关键内容
借助LangChain的ContextualCompressionRetriever,通过LLM自动提炼文档中与问题相关的内容,剔除无关信息以压缩Token:from langchain.retrievers import ContextualCompressionRetriever from langchain.retrievers.document_compressors import LLMChainExtractor compressor = LLMChainExtractor.from_llm(model) compression_retriever = ContextualCompressionRetriever( base_compressor=compressor, base_retriever=retriever ) qa = ConversationalRetrievalChain.from_llm(model, retriever=compression_retriever)
内容的提问来源于stack exchange,提问作者Patrick Collins
相关产品推荐
相关产品推荐

