基于LlamaIndex+ChatGPT的网站知识库聊天机器人响应过慢求优化
LlamaIndex+ChatGPT知识库聊天机器人性能优化建议
针对你遇到的响应慢问题,结合你的代码和50份1-2页的文档场景,给出以下优化方案:
1. 更换高效索引类型
当前使用的GPTSimpleVectorIndex基于向量检索,在小文档集场景下,可改用关键词索引或轻量化向量索引提升速度:
- 切换为
SimpleKeywordTableIndex:基于关键词匹配检索,速度远快于向量检索,适配小规模文档库。
代码修改示例:# 导入替换索引类 from llama_index import SimpleKeywordTableIndex # 训练索引时替换 index = SimpleKeywordTableIndex.from_documents( documents, service_context=service_context ) - 若保留向量检索,升级为
VectorStoreIndex(LlamaIndex推荐的新版向量索引,性能更优):from llama_index import VectorStoreIndex index = VectorStoreIndex.from_documents( documents, service_context=service_context )
2. 切换更快的LLM模型
你当前使用的text-davinci-003响应速度较慢,建议替换为gpt-3.5-turbo-instruct,它的响应速度是davinci的3-5倍,成本仅为其1/10,且知识库问答质量足够:
llm_predictor = LLMPredictor(llm=OpenAI( temperature=0, model_name="gpt-3.5-turbo-instruct", # 替换模型 max_tokens=128 ))
3. 优化检索与生成参数
减少检索的文档块数量
默认索引会返回多个相似文档块,通过similarity_top_k参数减少数量,降低LLM处理的上下文负载:
def ask_ai(): # 设置仅返回最相关的2个块 st.session_state.response = index.query(st.session_state.prompt, similarity_top_k=2)
调整文本分块策略
当前分块参数过大,可减小分块尺寸提升检索速度:
# 修改PromptHelper参数 num_output = 256 max_chunk_overlap = 10 # 减小重叠率 max_input_size = 2048 # 减小最大输入尺寸 prompt_helper = PromptHelper(max_input_size, num_output, max_chunk_overlap)
同时,加载文档时直接指定分块大小:
documents = SimpleDirectoryReader(doc_path).load_data(chunk_size=512, chunk_overlap=10)
4. 缓存重复查询结果
对用户重复查询进行缓存,避免重复调用LLM,直接返回历史结果:
# 初始化缓存字典 if 'query_cache' not in st.session_state: st.session_state.query_cache = {} def ask_ai(): prompt = st.session_state.prompt # 检查缓存 if prompt in st.session_state.query_cache: st.session_state.response = st.session_state.query_cache[prompt] else: response = index.query(prompt, similarity_top_k=2) st.session_state.response = response st.session_state.query_cache[prompt] = response
5. 缓存索引加载
当前每次启动都重新加载索引,使用Streamlit的资源缓存机制避免重复加载:
@st.cache_resource def load_index(): if os.path.exists(index_file): return GPTSimpleVectorIndex.load_from_disk(index_file) return None index = load_index()
6. 异步查询优化
使用LlamaIndex的异步查询接口aquery,结合Streamlit的异步支持,提升用户感知的响应速度:
import asyncio async def async_ask_ai(): st.session_state.response = await index.aquery(st.session_state.prompt, similarity_top_k=2) def ask_ai(): asyncio.run(async_ask_ai())
内容的提问来源于stack exchange,提问作者Aggamarcel
相关产品推荐
相关产品推荐

