更新于

OpenAI File Search vs 自建 RAG:怎么选更合适


OpenAI 的 Assistants API 内置了 File Search 工具,可以上传文档后直接检索,无需自己搭向量库。这让很多开发者产生疑问:我还需要自建 RAG 吗?

答案取决于你的具体场景。本文从多个维度做系统对比,帮你找到合适自己的路径。

(关于自建 RAG 的完整工程细节,见 中文 RAG 工程实战:从分块到 Rerank 完整流程,本文专注选型决策。)

一、两者的架构差异

File Search 是 OpenAI Assistants API 的一个内置工具,工作流程如下:

  1. 上传文件(支持 PDF、Word、TXT、代码文件等,单文件上限 512MB,单 Assistant 上限 10,000 个文件)
  2. OpenAI 在后台自动做 chunking、embedding、存入向量库(使用 OpenAI 自己的 Vector Store)
  3. 运行时自动检索相关 chunk,注入到上下文里

整个管道对用户完全透明,你看不到 chunk 策略、向量维度、检索算法。

自建 RAG

自建 RAG 的典型架构:

文档 → 解析(pdf/docx → text) → 分块(chunk strategy)
     → Embedding 模型 → 向量数据库(Pinecone/Weaviate/Milvus/pgvector)
     → 检索时 Embedding 查询 → 可选 Rerank → 注入 LLM 上下文

每个环节都可以自己控制和优化。成熟的实现可以参考 LlamaIndex、LangChain 等框架(见 LlamaIndex 中文 RAG 完整教程)。

二、核心维度对比

对比维度OpenAI File Search自建 RAG
上手时间30 分钟内跑通1–3 天最小可用版本
中文检索质量中等(依赖 text-embedding-3 系列)可选专用中文 Embedding,可做优化
成本结构存储费 + token 费(每 GB 向量存储约 $0.10/天)Embedding 费 + 向量库托管费(可自托管免费)
可观测性低(chunk 策略不透明)高(每步可日志和监控)
检索可调性不可调(top_k 受限)完全可控(分块大小、重叠、rerank 策略)
多模型兼容仅 OpenAI 模型任意 LLM
文件格式支持主流格式(PDF/Word/TXT/代码等)自定义解析器,几乎无限制
国内访问需解决 OpenAI 访问问题向量库可自托管,访问稳定
数据留存风险文件存在 OpenAI 服务器数据在自己基础设施

三、成本分析

OpenAI File Search 成本

File Search 的费用由两部分组成:

Vector Store 存储费(近似)

  • 前 1GB 免费
  • 超出部分约 $0.10/GB/天

API 调用费

  • 和普通 Assistants API 一样,按 token 计费(GPT-4o 约 $2.50/M input tokens)
  • File Search 工具本身在 2024 年后不再单独收费(之前收过 $0.20/session)

实际场景估算(近似)

  • 100 个 PDF 文档,总计约 50MB → 向量存储后约 0.1GB → 基本在免费额度内
  • 每天 500 次查询 × 平均 2000 tokens/次 → 约 1M tokens/天 → 约 $2.50/天

自建 RAG 成本

  • Embedding:OpenAI text-embedding-3-small 约 $0.02/M tokens,处理一次后不重复计费
  • 向量库:自托管(pgvector + PostgreSQL)基本免费;托管服务(Pinecone、Weaviate Cloud)有免费层,超出后按用量计费
  • 增量维护:文档更新时需要重新 Embedding 变更部分,成本通常比全量低很多

结论

  • 小规模场景(< 100 文档,< 200 次/天查询):File Search 免费额度内,成本优势明显;
  • 中大规模场景(> 1000 文档,> 1000 次/天查询):自建 RAG 通常更便宜,且成本可预期。

四、中文检索质量:这是关键差异点

这是很多中文团队踩坑最多的地方。

File Search 的中文表现

OpenAI 的 text-embedding-3-large/small 是多语言 Embedding,中文质量可以用,但在专业术语密集的场景(如医疗、法律、金融)表现明显下滑。主要原因是训练数据中中文比例较低,专业中文词汇的语义表示不够精准。

自建 RAG 的中文优化空间

可以使用专门的中文 Embedding 模型:

# 示例:使用 BGE 系列中文 Embedding(来自 BAAI)
from FlagEmbedding import BGEM3FlagModel

model = BGEM3FlagModel('BAAI/bge-m3', use_fp16=True)
embeddings = model.encode(["你好,这是中文文本"])

BGE-M3、BCE-embedding 等模型在中文理解上明显强于通用多语言模型,尤其是技术文档、合同、报告等专业场景。

结论:如果文档是中文专业内容,自建 RAG + 专用中文 Embedding 的检索质量通常优于 File Search。

五、哪种场景选哪个

优先选 File Search 的场景

  • 快速原型/MVP:需要在几小时内跑通知识库问答,验证场景可行性
  • 文档量小且更新不频繁:< 200 个文档,内容相对稳定
  • 英文文档为主:多语言能力要求不高
  • 不想维护向量库:团队没有运维向量数据库的能力或意愿
  • 已经在用 Assistants API:工具链统一,减少集成成本

优先选自建 RAG 的场景

  • 中文专业文档:检索质量对业务有直接影响,无法接受通用 Embedding 的表现
  • 大规模文档库:数千个文档以上,File Search 存储费用和性能开始显现问题
  • 需要自定义分块策略:如按章节分块、代码块特殊处理、表格提取
  • 多 LLM 切换:未来可能用 Claude / Gemini 替代 OpenAI,不想被锁定
  • 数据合规要求:不能把内部文档上传到第三方服务
  • 需要 Rerank:提升检索精度,File Search 不支持自定义 rerank

六、混合方案:两者结合

有一种较少讨论但实用的做法:用 File Search 快速验证,用自建 RAG 生产部署

  1. 先用 File Search 跑通 MVP,验证知识库问答对业务有价值;
  2. 如果 MVP 效果好、决定长期使用,再迁移到自建 RAG,优化中文质量和控制成本。

迁移成本不高:自建 RAG 的文档处理逻辑与 File Search 的最大差异是分块和 Embedding,核心 LLM 调用逻辑不变。

七、国内访问注意事项

无论选哪种方案,在国内访问 OpenAI API 都需要解决网络问题:

  • File Search:完全依赖 OpenAI Assistants API,必须能访问 api.openai.com
  • 自建 RAG(使用 OpenAI Embedding):同样需要访问 OpenAI API
  • 自建 RAG(使用开源 Embedding):可以完全在本地运行,不依赖 OpenAI

如果使用 OpenAI API,通过中转服务(如 YoTradeApi)可以在国内稳定访问,配置 OPENAI_BASE_URL 即可,不需要修改其他代码。

八、代码示例:File Search 快速上手

from openai import OpenAI

client = OpenAI(
    base_url="https://api.yotradeapi.com/v1",  # 中转地址
    api_key="your_api_key"
)

# 创建 Vector Store
vector_store = client.beta.vector_stores.create(name="产品文档库")

# 上传文件
with open("product_manual.pdf", "rb") as f:
    client.beta.vector_stores.files.upload_and_poll(
        vector_store_id=vector_store.id,
        file=f
    )

# 创建 Assistant(关联 File Search 工具)
assistant = client.beta.assistants.create(
    model="gpt-4o",
    tools=[{"type": "file_search"}],
    tool_resources={"file_search": {"vector_store_ids": [vector_store.id]}}
)

# 查询
thread = client.beta.threads.create()
client.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="产品的退款政策是什么?"
)
run = client.beta.threads.runs.create_and_poll(
    thread_id=thread.id,
    assistant_id=assistant.id
)
messages = client.beta.threads.messages.list(thread_id=thread.id)
print(messages.data[0].content[0].text.value)

整个上手过程 30 分钟内可以完成,适合快速验证。

九、总结

选型建议一句话版本:

先用 File Search 验证业务价值,中文专业场景或大规模部署时切换到自建 RAG。

不需要从一开始就做完美的自建 RAG,也不需要用 File Search 撑到撑不住。根据当前规模和质量要求做出选择,后续迁移的成本是可控的。

十、相关阅读

在国内访问 OpenAI Assistants API 或自建 RAG 时,YoTradeApi 提供稳定的 API 中转,兼容 OpenAI SDK,修改 base_url 即可使用,无需其他改动。