OpenAI Completions API匹配问答遇上下文超限,咨询方案最优性
问答对匹配方案优化建议
当前的实现方案并非最优,核心问题在于依赖大语言模型(LLM)处理全量问答对,既受限于模型上下文长度,又存在效率、成本和结果可靠性的问题。以下是具体分析和优化方案:
现有方案的核心问题
- 上下文长度瓶颈:gpt-3.5-turbo-instruct的最大上下文窗口仅4096 tokens,随着数据库中问答对数量增加,Prompt很快会超出限制,触发报错。
- 资源浪费:让LLM计算余弦相似度属于大材小用,LLM擅长自然语言理解,但这类数值计算任务效率低、成本高。
- 结果不可控:LLM生成的JSON格式可能存在偏差,需要额外校验,增加开发复杂度。
最优替代方案:基于向量嵌入的相似度匹配
利用OpenAI的Embeddings API预计算问答对的向量表示,再通过向量相似度匹配实现精准检索,步骤如下:
1. 预计算并存储问答对的嵌入向量
为数据库中每个问答对的question字段生成嵌入向量,存储到数据库(新增embedding字段):
// 示例:为单个问答对生成嵌入向量 $open_ai = new \Orhanerday\OpenAi\OpenAi('YOUR_API_KEY'); $qa = [ "question" => "question 1", "answer" => "answer 1", "action" => "action 1" ]; $embedding_response = $open_ai->embeddings([ 'model' => 'text-embedding-ada-002', 'input' => $qa['question'], ]); $embedding_data = json_decode($embedding_response, true); $embedding = $embedding_data['data'][0]['embedding']; // 将$embedding存入数据库对应记录的embedding字段
2. 用户提问时的匹配流程
- 生成用户提问的嵌入向量:用同样的Embeddings API处理用户输入的问题。
- 计算相似度并筛选:在数据库中计算用户提问向量与所有存储的
embedding的余弦相似度,筛选出相似度≥0.6的记录。- 推荐使用支持向量计算的数据库(如PostgreSQL的pgvector扩展、MySQL 8.0.32+的向量函数),可直接在数据库层面完成高效检索。
- 组装结果:提取筛选出的记录的
answer和action字段,组装成预期的JSON数组。
方案优势
- 无上下文限制:仅处理用户提问的向量,不受LLM上下文窗口约束,支持海量问答对。
- 成本更低:Embeddings API的价格远低于Completion API,向量匹配的计算成本可忽略。
- 结果可靠:直接从数据库提取数据,JSON格式完全可控,无需额外校验。
- 性能更高:向量检索的速度远快于LLM处理大Prompt的速度。
临时过渡方案(不推荐长期使用)
如果暂时无法改造数据库支持向量计算,可采取以下临时措施,但无法解决根本问题:
- 分批处理:将问答对分成多批,分别调用LLM后合并结果,但会增加API调用次数和成本。
- 切换大窗口模型:改用gpt-3.5-turbo-16k(16k上下文窗口),但成本翻倍,且数据量持续增长仍会触发上限。
内容的提问来源于stack exchange,提问作者Jorge Brian Moreno Tapia
相关产品推荐
相关产品推荐

