第11课

File Search:从资料里找答案

把讲义、规则或笔记放进资料库,让 AI 先检索,再回答。

本课项目:AI班级资料问答机器人

学习重点:文件检索、资料依据、只回答资料中内容。工具重点:File Search。

OpenAI AI编程第11课封面
AI 工具地图

OpenAI 项目工具栈

页面里加入 OpenAI、Node.js、Python 和 JSON 图标,帮助学生把 AI 能力、后端调用、脚本实验和结构化输出放在同一条学习路线里理解。

学习路线

阶段入口与周课入口

先用阶段卡片看清大方向,再用周课卡片进入具体项目。每节课都保留理论、例子、Node.js、Python、练习和自测,学生可以直接按卡片推进。

OpenAI 项目地图

阶段入口

第01阶段:AI应用基础与 OpenAI 入门

先看懂 AI 应用的工作流程,再完成第一次 API 调用,最后学会写清楚提示词。

进入学习

第02阶段:让 AI 输出程序能读懂的结果

AI 不只要会说话,还要按固定格式交答案,这样程序才能稳定处理。

进入学习

第03阶段:Function Calling:让 AI 调用函数

AI 负责理解语言,函数负责精确计算;两者配合,结果更可靠。

进入学习

第04阶段:多模态应用:文字 + 图片

把图片也交给 AI 看,再让它用清楚的文字或 JSON 结果回答。

进入学习

第05阶段:内置工具:Web Search 与 File Search

需要最新消息时查网页;需要班级资料时查文件。先找资料,再回答。

进入学习

第06阶段:前后端 AI 应用开发

把 AI 能力做成网页:前端收集输入,后端保护密钥,页面展示结果。

进入学习

第07阶段:AI Agent、安全与成本

Agent 会按步骤完成任务,但你要给它工具、边界、检查规则和预算意识。

进入学习

第08阶段:毕业项目发布会

把前面学过的提示词、JSON、函数、检索、网页和安全设计合在一个作品里。

进入学习

周课入口

第10课:Web Search:让 AI 查询最新信息

当问题需要最新资料时,让 AI 先搜索,再根据来源回答。

进入学习

第11课:File Search:从资料里找答案

把讲义、规则或笔记放进资料库,让 AI 先检索,再回答。

进入学习

11.1 今天你要完成什么

File Search 像一个会翻资料的助手。它应该优先根据你提供的文件回答,而不是随便编。

本课闯关:完成“AI班级资料问答机器人”,并用 3 组输入测试它。

11.2 核心理论

理论不是背概念,而是帮你判断项目为什么这样设计。下面这些规则会在代码里反复出现。

11.3 课堂讲解

这一课的项目是“AI班级资料问答机器人”,重点是“文件检索、资料依据、只回答资料中内容”。你可以把它当成一个小实验:先给它一个清楚输入,再观察代码里哪些地方用到了 File Search。课堂里我们不会一上来就追求复杂功能,而是先把最小版本做出来。最小版本跑通以后,你再改输入、改提示词、改输出格式,变化就会看得很清楚。

这几课让 AI 学会先查资料再回答。它不是只靠记忆说话,而是用网页或文件作为依据。

本课有一条很实用的学习线索:先问“用户到底给了什么”,再问“程序希望拿到什么”。比如你可以试这些输入:作业什么时候交?;请根据班级规则说迟交怎么办;资料里有没有提到项目评分标准?。这些输入故意有简单的,也有容易出问题的。正常输入能帮你确认功能;短输入、空输入、奇怪输入能帮你发现系统边界。

写代码时建议你分三轮。第一轮只跑通官方调用,不加自己的想法;第二轮把输入换成自己的例子,看看结果是否还合理;第三轮才开始改结构,比如增加字段、加错误提示、做网页交互。这个顺序有点慢,但很稳。真正浪费时间的不是慢,而是一下子改太多,最后不知道错在哪里。

资料里没有的内容,不要让 AI 编。说“没有找到”不是失败,而是诚实的系统行为。

理论部分要和代码一起看。比如“输入契约”不是一个漂亮词,它在代码里就是长度检查、必填字段、表单校验;“输出契约”也不是空话,它在代码里就是 JSON Schema、固定字段或页面渲染规则。你每写一行检查代码,都是在告诉系统:什么结果可以接受,什么结果需要退回去重新处理。

课堂里可以把同桌当成第一个用户。你把项目跑给同桌看,让对方换一个输入,观察系统会不会乱。很多问题都是别人随手一试才出现的,比如输入太短、问题太模糊、连续点击按钮、图片看不清。能处理这些小麻烦,作品就会从“我电脑上能跑”变成“别人也能用”。

最后做复盘时,不要只写“我学会了调用 API”。可以写得更具体:我学会了怎样限制输入,怎样让输出固定,怎样判断结果不可靠,怎样把报错变成用户看得懂的提示。这样的复盘有用,因为下一课你真的会再次用到它。

课堂讨论题

11.4 先看例子

先把例子看懂,再动手写代码。你不需要一次记住所有概念,先能说清楚“输入是什么、输出是什么、程序要检查什么”。

资料例子

班级规则:作业每周日晚上 8 点前提交。

问题例子

作业什么时候交?

答案例子

根据班级规则,作业需要在每周日晚上 8 点前提交。如果你不确定本周是否有特殊安排,请再问老师。

你可以替换成这些输入

11.5 完整代码实现

下面同时给出 Node.js 和 Python 两套完整最小实现。先任选一种原样跑通,再改输入、改提示词、改输出格式。

Node.js 运行方式

  1. 新建文件 lesson-11.mjs,把下面完整代码放进去。
  2. 在终端运行:npm init -y
  3. 安装依赖:npm install openai
  4. 设置环境变量 OPENAI_API_KEY。Windows PowerShell 示例:$env:OPENAI_API_KEY="你的密钥"
  5. 运行:node lesson-11.mjs
  6. 再新建一个 class_rules.txt,写入几条班级规则。

Node.js 完整代码

import fs from "fs";
import OpenAI from "openai";

const client = new OpenAI();
const MODEL = process.env.OPENAI_MODEL || "gpt-5.5";

const filePath = "class_rules.txt";

if (!fs.existsSync(filePath)) {
  fs.writeFileSync(
    filePath,
    [
      "班级规则",
      "1. 作业需要在每周日晚上 8 点前提交。",
      "2. 如果作业迟交,需要在下节课前补交。",
      "3. 项目展示需要说明:目标、输入、输出、测试记录。",
      "4. API Key 不能写进前端代码,也不能发截图。",
    ].join("\n"),
    "utf8"
  );
}

const uploadedFile = await client.files.create({
  file: fs.createReadStream(filePath),
  purpose: "assistants",
});

const vectorStore = await client.vectorStores.create({
  name: "class_rules_knowledge_base",
});

await client.vectorStores.files.create(vectorStore.id, {
  file_id: uploadedFile.id,
});

async function waitForVectorStoreReady(vectorStoreId) {
  for (let i = 0; i < 20; i++) {
    const files = await client.vectorStores.files.list({
      vector_store_id: vectorStoreId,
    });
    const statuses = files.data.map((file) => file.status);
    if (statuses.length > 0 && statuses.every((status) => status === "completed")) {
      return;
    }
    if (statuses.some((status) => status === "failed")) {
      throw new Error("文件处理失败,请检查文件格式。");
    }
    await new Promise((resolve) => setTimeout(resolve, 1000));
  }
  throw new Error("文件处理超时,请稍后重试。");
}

await waitForVectorStoreReady(vectorStore.id);

const response = await client.responses.create({
  model: MODEL,
  input: "作业什么时候交?如果资料里没有答案,请直接说没有找到。",
  tools: [
    {
      type: "file_search",
      vector_store_ids: [vectorStore.id],
    },
  ],
});

console.log(response.output_text);

Python 运行方式

  1. 新建文件 lesson-11.py,把下面完整代码放进去。
  2. 建议新建虚拟环境后再安装依赖。
  3. 安装依赖:pip install openai
  4. 设置环境变量 OPENAI_API_KEY。Windows PowerShell 示例:$env:OPENAI_API_KEY="你的密钥"
  5. 运行:python lesson-11.py
  6. 代码会自动创建 class_rules.txt,也可以自己改成课堂资料。

Python 完整代码

from openai import OpenAI
from pathlib import Path
import os
import time

client = OpenAI()
MODEL = os.getenv("OPENAI_MODEL", "gpt-5.5")

file_path = Path("class_rules.txt")

if not file_path.exists():
    file_path.write_text(
        "\n".join([
            "班级规则",
            "1. 作业需要在每周日晚上 8 点前提交。",
            "2. 如果作业迟交,需要在下节课前补交。",
            "3. 项目展示需要说明:目标、输入、输出、测试记录。",
            "4. API Key 不能写进前端代码,也不能发截图。",
        ]),
        encoding="utf-8",
    )

with file_path.open("rb") as f:
    uploaded_file = client.files.create(file=f, purpose="assistants")

vector_store = client.vector_stores.create(name="class_rules_knowledge_base")

client.vector_stores.files.create(
    vector_store_id=vector_store.id,
    file_id=uploaded_file.id,
)


def wait_for_vector_store_ready(vector_store_id):
    for _ in range(20):
        files = client.vector_stores.files.list(vector_store_id=vector_store_id)
        statuses = [item.status for item in files.data]
        if statuses and all(status == "completed" for status in statuses):
            return
        if any(status == "failed" for status in statuses):
            raise RuntimeError("文件处理失败,请检查文件格式。")
        time.sleep(1)
    raise RuntimeError("文件处理超时,请稍后重试。")


wait_for_vector_store_ready(vector_store.id)

response = client.responses.create(
    model=MODEL,
    input="作业什么时候交?如果资料里没有答案,请直接说没有找到。",
    tools=[
        {
            "type": "file_search",
            "vector_store_ids": [vector_store.id],
        }
    ],
)

print(response.output_text)

11.6 跟着做

  1. 准备一份短资料,例如班级规则。
  2. 让 AI 先检索资料,再回答。
  3. 提示词中写明:资料没有就说没有找到。
  4. 测试一个资料中有答案的问题。
  5. 再测试一个资料中没有答案的问题。

11.7 常见错误

排查顺序:先看输入,再看提示词,再看输出格式,最后看程序逻辑。

11.8 课后练习

  1. 用一页自己的学习笔记做问答机器人。
  2. 准备 3 个能答的问题和 1 个不能答的问题。
  3. 不能答时输出:资料中没有找到。

11.9 自测清单