想用 Python 做一轮有出处的文档问答,可以先把文件放进 OpenAI vector store,再在 Responses API 中启用 File Search。这里的“RAG 智能体”只执行检索和回答,不会自动审批、修改业务系统或代替人工核对依据。示例使用虚构制度文件,运行会调用付费 API;请先确认账号可用模型与计费。
准备一份可检查的输入
在空目录创建 policy.txt,写入:《差旅制度 2026》:华东地区经理级住宿上限为每晚 600 元。华南地区经理级上限为每晚 550 元。 这只是演示数据,不是实际企业制度。用 python -m pip install -U openai 安装当前版 Python 包,并在运行环境设置 OPENAI_API_KEY;不要把密钥写进脚本或上传的文档。

创建向量库并等待文件处理
OpenAI Retrieval 官方文档提供 vector_stores.create 和 vector_stores.files.upload_and_poll 的 Python 调用。后者会等待上传后的处理阶段,仍应检查返回对象的状态。
from openai import OpenAI
client = OpenAI()
store = client.vector_stores.create(name="travel-policy-demo")
with open("policy.txt", "rb") as source:
indexed = client.vector_stores.files.upload_and_poll(
vector_store_id=store.id, file=source
)
print("vector_store_id:", store.id)
print("file_status:", indexed.status)
预期能看到一个 vs_ 开头的 ID 和已完成的文件状态;若处理失败或超时,先检查文件内容、格式和账号权限,不要继续把空库的回答当成检索结果。记录这个向量库 ID,后续清理演示资源时也要用到它。
发问并分开核对答案与检索结果
OpenAI File Search 官方文档说明该托管工具在 Responses API 中通过 file_search 和向量库 ID 启用;include=["file_search_call.results"] 可把检索结果纳入响应。下面的模型名是 2026 年 10 月文档示例值;若账户不支持,选用当前文档中本账户可用且支持 File Search 的模型。
response = client.responses.create(
model="gpt-6-astra",
input="根据上传的制度,华东经理住宿上限是多少?请指出文件出处;找不到就说找不到。",
tools=[{"type": "file_search", "vector_store_ids": [store.id]}],
include=["file_search_call.results"],
)
print(response.output_text)
for item in response.output:
print(item.model_dump_json(indent=2))
预期答案应指出“每晚 600 元”并关联 policy.txt。检查输出中的 file_citation 是否指向这份文件,再看 file_search_call.results 是否真的包含相应原文;引用标记和检索命中是两项不同证据。再问“华北经理上限是多少”:样例文件没有这一项,理想结果是说明无法从文件确认。若答案有数字而检索结果没有对应条款,应判为未通过,先查文件是否已索引、是否用对向量库以及问题是否过于含糊。
本文代码依官方接口编写,未使用读者的 API Key 执行;模型输出、引用格式与费用以实际账户和当时接口为准。不要把上传含有个人或商业敏感信息的真实文件作为首次测试。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/29910.html