使用LlamaIndex的RelevancyEvaluator评估OpenAI响应时二次请求超时
问题排查方向与解决方案
1. 缓存RelevancyEvaluator实例,避免重复初始化
每次请求都创建新的RelevancyEvaluator实例会产生不必要的资源开销,第二次请求时可能因资源累积触发超时。将Evaluator加入缓存:
@st.cache_resource(show_spinner=False) def get_evaluator(service_context): return RelevancyEvaluator(service_context=service_context) # 使用时替换原创建逻辑 evaluator = get_evaluator(service_context)
2. 优化评估调用逻辑,减少串行API调用
当前循环每个source_node单独调用evaluate(),串行多次API调用会累积耗时,容易触发超时。可通过两种方式优化:
- 限制待评估源节点数量:创建查询引擎时减少返回的相关节点数,降低评估次数:
chat_engine = index.as_query_engine(similarity_top_k=3) # 按需调整节点数量 - 并行处理评估请求:用异步方式并行调用评估接口,缩短总耗时(注意OpenAI并发限制):
注:Streamlit中使用异步需配合import asyncio async def evaluate_single_node(evaluator, prompt, response_str, context): return await evaluator.aevaluate(query=prompt, response=response_str, contexts=[context]) # 替换原循环逻辑 tasks = [ evaluate_single_node(evaluator, prompt, response_str, node.get_content()) for node in response.source_nodes ] eval_results = await asyncio.gather(*tasks) for result in eval_results: print("RESULT") print(str(result.passing)) print(result.feedback)st.async_runner,或封装为异步函数后用asyncio.run()执行。
3. 调整LLM超时配置
默认OpenAI客户端超时时间较短,第二次请求可能因评估逻辑复杂触发超时。初始化LLM时延长超时时间:
service_context = ServiceContext.from_defaults( llm=OpenAI( model="gpt-3.5-turbo", temperature=0.5, system_prompt="....", timeout=30 # 按需调整超时秒数 ) )
4. 检查Streamlit会话状态与资源泄漏
第二次请求时,会话状态可能残留未清理资源或response.source_nodes出现异常数据:
- 打印
response.source_nodes的长度和内容,确认节点数量是否异常增加; - 检查
st.session_state.messages更新逻辑,避免重复添加消息或角色判断错误导致重复执行评估。
5. 自定义评估提示词,简化判断逻辑
默认RelevancyEvaluator提示词可能过于复杂,导致处理时间长且易产生幻觉。自定义简洁提示词聚焦核心判断:
from llama_index.prompts import PromptTemplate RELEVANCY_PROMPT = PromptTemplate( "判断以下回答是否使用了给定上下文,仅返回'是'或'否',并简要说明理由:\n" "问题:{query}\n" "回答:{response}\n" "上下文:{contexts}\n" ) evaluator = RelevancyEvaluator( service_context=service_context, relevancy_prompt=RELEVANCY_PROMPT )
内容的提问来源于stack exchange,提问作者Katie
相关产品推荐
相关产品推荐

