You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 用户提问时的匹配流程

  1. 生成用户提问的嵌入向量:用同样的Embeddings API处理用户输入的问题。
  2. 计算相似度并筛选:在数据库中计算用户提问向量与所有存储的embedding的余弦相似度,筛选出相似度≥0.6的记录。
    • 推荐使用支持向量计算的数据库(如PostgreSQL的pgvector扩展、MySQL 8.0.32+的向量函数),可直接在数据库层面完成高效检索。
  3. 组装结果:提取筛选出的记录的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 17:43:15