news 2026/9/8 11:12:54

RAG知识库从零搭建:文档切分、向量检索到部署全流程指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RAG知识库从零搭建:文档切分、向量检索到部署全流程指南

做 RAG 知识库最难的地方,从来不是“知道 RAG 这个词”,而是把一套能回答问题的系统真正跑起来。文档切分丢上下文、Embedding 模型选错导致检索不准、大模型回答出来一堆幻觉,每个环节都能卡住你大半天。

这篇教程就是来解决这些问题的。我会从选型开始,走完环境准备、服务部署、文档导入、向量化、检索问答、接口对接和批量任务的全流程。文章不堆概念,每个步骤都给出可直接照做的命令、代码和验证方法。无论你是想搭个人知识库,还是准备落地一套企业内部文档问答系统,都可以按这套流程走一遍,少走弯路。

1. RAG 知识库核心能力速览

在展开细节之前,先给一张能力速览表,帮助你快速判断 RAG 这套技术方案适不适合你。

能力项说明
解决核心问题让大模型基于自有文档回答问题,减少幻觉,生成内容可溯源
主要技术组成文档加载、文本切分、Embedding 向量化、向量检索、大模型生成
可选框架LangChain、LlamaIndex、Dify、AnythingLLM、FastGPT、QAnything 等
常用向量库Chroma、Milvus、Qdrant、ES、pgvector
常用 Embedding 模型bge-large-zh、bge-m3、m3e 等开源模型
大模型接入方式本地部署开源模型,或调用云端大模型 API
硬件要求纯接口调用方案要求很低;本地跑对话模型建议优先考虑独立显卡
是否支持 API支持,主流框架均提供 HTTP 接口或 SDK
是否支持批量任务支持,文档可批量导入,问答可脚本批量请求
适合场景企业制度问答、产品文档助手、私有资料检索、代码知识库、个人笔记问答

从这张表可以看出,RAG 知识库本身不是一个单独的软件,而是一条技术链路。落地过程中最容易被卡住的不是“大模型生成”,而是前面的“文档切分”和“向量检索”环节。下面我会重点讲这两块。

2. RAG 基础原理与落地难点

2.1 RAG 到底做了什么

RAG 全称是 Retrieval-Augmented Generation,检索增强生成。正常情况下,大模型只能根据训练数据生成内容,你不知道它内部到底学了什么,也不知道它回答有没有依据。RAG 的思路是:在回答前先到自己的知识库里检索相关片段,把检索到的内容作为上下文,再让大模型基于这些内容生成答案。

一句话概括:先查资料,再写回答。

2.2 完整链路拆解

一条标准的 RAG 链路包含五个环节:

  1. 文档加载:读取 PDF、Word、Markdown、HTML、TXT 等格式。
  2. 文本切分:把长文档切成固定长度或语义完整的小块。
  3. 向量化:用 Embedding 模型把文本块转成向量。
  4. 存储与检索:向量写入向量数据库,提问时先做相似度检索。
  5. 生成回答:把检索到的片段拼接进 Prompt,交给大模型生成答案。

每个环节都决定最终效果。很多人做完第一步就认为“知识库跑通了”,但真正测试问答时发现答案完全不对,问题多半出在切分和检索上。

2.3 落地中最容易踩的坑

第一个坑是文档切分不合理。按固定字符数硬切,很容易把一句话、一个表格、一条操作流程拦腰截断,检索时拿到的片段语义不完整,大模型自然回答不好。

第二个坑是 Embedding 模型选错。中英文混杂的文档,如果选一个英文表现好的模型,中文检索效果会明显变差。企业文档建议优先选择中文效果稳定的开源模型。

第三个坑是检索参数不调。默认返回 top_k 个片段,但片段数量过多会混入噪声,过少又会漏掉关键信息。相似度阈值设得太高,很多问题直接查不到。

第四个坑是忽略重排序。第一次向量检索粗筛后,如果直接让大模型生成,混入的无关片段会影响回答质量。加上 Rerank 重排序环节,把最相关的片段排到前面,效果提升非常明显。

下面整个部署流程,都会围绕这些问题展开。

3. 技术栈选型:框架、Embedding、向量库与大模型

选型不追求“最新最热”,而追求能稳定跑通、出问题好排查。下面给出一套比较稳妥的组合,并说明备选方案。

3.1 RAG 框架选择

框架适合场景说明
Dify偏向完整产品化自带 WebUI、知识库管理、工作流编排,适合快速搭建应用
AnythingLLM偏向个人和小组知识库部署简单,文档管理直观,适合先跑通全流程
LangChain + 自建偏向深度定制灵活度最高,需要自己写流程代码
LlamaIndex偏向复杂文档索引对文档结构和索引策略支持更细
FastGPT / QAnything偏向企业知识库交互使用体验更接近产品,需要额外部署服务

如果目标是快速验证 RAG 流程,我建议先用 Dify 或 AnythingLLM 这类自带管理界面的框架;如果目标是做深度定制、嵌入自己的业务系统,再用 LangChain 或 LlamaIndex 自己写链路。

3.2 Embedding 模型选择

Embedding 模型负责把文本转成向量,它的质量直接影响检索准确率。建议从下面几个模型中选:

  • bge-large-zh:中文效果稳定,使用量很大,社区资料多。
  • bge-m3:支持中文、英文和多语言,文本长度支持到 8K,适合长文档。
  • m3e:轻量,部署成本低,适合快速测试。

选择建议:中文为主的企业文档直接选 bge-large-zh 或 bge-m3;如果文档包含大量英文技术资料,优先 bge-m3。

3.3 向量数据库选择

数据量在几十万条向量以内,用 Chroma 就够,部署简单,本地直接跑。数据量大、并发高、需要分布式部署,再考虑 Milvus 或 Qdrant。已经用了 Elasticsearch 的团队,可以直接用 ES 的向量检索能力,减少一套组件。

3.4 大模型选择

大模型决定最终回答质量,接入方式有三种:

  1. 调用云端大模型 API:效果最好、不需要考虑显卡,但数据会离开本地。必须确认数据合规要求是否允许。
  2. 本地部署开源对话模型:数据不出内网,适合企业敏感数据。需要通过 Ollama、vLLM 等方式部署量化模型。
  3. 混合模式:Embedding 本地跑,对话模型走 API,兼顾隐私和效果。

如果只是个人学习验证,调用免费或低成本的云端 API 最省事;如果是企业内部敏感文档,建议本地部署对话模型。

4. 环境准备与硬件门槛

4.1 硬件要求

RAG 链路对硬件的要求是分层的,不是所有环节都必须 GPU。

组件硬件敏感度说明
文档解析与切分CPU 即可
Embedding 向量化低到中小模型 CPU 能跑,大批量文档用 GPU 更快
向量检索数据量不大时 CPU 内存足够
本地对话模型生成7B 量化模型通常需要 6GB 到 8GB 左右显存起步,实际以模型和量化方式为准

具体数值不能一概而论。稳妥的判断是:如果只跑 Embedding 和检索,不本地跑对话模型,普通服务器就够;如果要在本地跑 7B 以上量级的对话模型,建议优先准备独立显卡,显存越大越从容。

4.2 软件环境

虽然不同框架要求不同,但通用依赖基本一致:

  • 操作系统:Linux 服务器最稳,Windows 和 macOS 也能跑通。
  • Python:建议 3.10 及以上。
  • Docker:推荐安装,很多开源 RAG 框架直接提供 docker-compose 一键启动。
  • CUDA:本地跑 GPU 推理时,需要和显卡驱动、PyTorch 版本匹配。
  • 磁盘空间:框架代码、模型文件、向量库、文档资料至少预留 20GB 以上,本地再放对话模型的话按模型大小继续增加。

4.3 通用环境检查清单

# 检查 Docker docker --version docker compose version # 检查 Python python3 --version # 检查显卡驱动(有 N 卡时) nvidia-smi # 检查显存占用 nvidia-smi --query-gpu=memory.total,memory.used,memory.free --format=csv

如果 nvidia-smi 命令不存在,说明显卡驱动没有装好;如果 Docker 不存在,先安装 Docker。后面启动服务前的所有前置问题,基本都能靠这几条命令查出来。

5. 本地部署:用 Docker 拉起一套 RAG 服务

有了前面的准备,现在开始部署。下面以自带管理界面的开源框架为例说明通用部署流程。不同版本目录结构可能有变化,但思路一致。

5.1 基于 docker-compose 启动

先给出一份通用的 docker-compose 模板,实际使用时需要按具体项目替换镜像名、端口和目录挂载:

version: "3.8" services: rag-app: image: your-rag-image:v1.0 container_name: rag-app ports: - "7861:7861" volumes: - ./models:/root/models - ./data:/root/data - ./vector_store:/root/vector_store environment: - EMBEDDING_MODEL=/root/models/bge-large-zh - LLM_BASE_URL=http://host.docker.internal:11434 - VECTOR_STORE=chroma - DEFAULT_TOP_K=5 restart: unless-stopped

这份模板不要直接复制使用,需要根据你选择的框架调整。比如 Dify 的 docker 目录下会自带一份完整的 docker-compose.yml,启动方式通常是:

cd dify/docker cp .env.example .env docker compose up -d

如果是 AnythingLLM,同样进入 docker 目录配置 .env 文件后执行 docker compose up -d。启动完成后,用浏览器访问本地端口,看到登录页或初始化引导页,说明服务起来了。

5.2 验证服务是否正常

服务启动后,首先检查容器状态:

docker ps

找到对应容器,确认状态是 Up。然后看日志里有没有报错:

docker logs -f rag-app

日志中常见的错误包括端口被占用、模型文件路径不存在、数据库连接失败。处理完这些后再刷新页面。

5.3 启动方式汇总

框架类型启动方式说明
自带 Docker 编排docker compose up -d最省心,适合生产和管理界面类框架
Python 脚本启动python app.py适合源码安装的轻量框架
Ollama + 客户端先启动 Ollama,再连接知识库本地大模型推荐方式
一键脚本./start.sh 或双击 start.bat部分整合包提供

部署完成后,接下来的核心工作就是把文档灌进知识库。

6. 知识库构建流程:导入、分块、向量化与入库

服务界面能打开,知识库还是空的。文档从上传到可被检索,需要经过四条处理流程。这一步直接决定 RAG 最终效果。

6.1 准备测试文档

先用一份结构清晰的 Markdown 或 Word 文档做测试,内容包含标题、段落、列表、表格。不要一上来就灌几百个 PDF。测试文档建议覆盖常见的制度说明类内容,比如操作流程、Q&A、规则条款,这样方便后续验证回答是否准确。

6.2 文档导入

在 WebUI 中创建知识库,然后上传测试文档。大多数框架支持 PDF、DOCX、Markdown、TXT、HTML。

批量导入场景下,也可以通过脚本调用上传接口:

import os import requests from pathlib import Path input_dir = Path("./docs") upload_url = "http://127.0.0.1:7861/api/upload" for file_path in input_dir.glob("*.pdf"): with open(file_path, "rb") as f: resp = requests.post( upload_url, files={"file": f}, data={"knowledge_base_id": "your-kb-id"}, timeout=120, ) print(file_path.name, resp.status_code, resp.json())

注意 knowledge_base_id 需要先通过界面或接口创建知识库后获取,不同框架的字段名可能不同。

6.3 文本分块

文本切分是 RAG 效果好坏的分水岭。推荐切分策略:

  • 优先按标题和段落结构切分,保持语义完整。
  • 没有明显结构的文档,用固定 chunk_size + overlap 的方式,常见设置是 300 到 800 字符,重叠 50 到 100 字符。
  • 包含表格和代码块的文档,尽量做到表格不被拆开。

如果框架支持自定义分隔符,可以把\n\n\n、句号、分号都加入分隔符列表。分块太小,上下文不完整;分块太大,检索噪声高。

6.4 向量化与入库

切分完成后,知识库会调用 Embedding 模型把每个文本块转成向量,并写入向量数据库。这一步有几个观察点:

  • 大批量文档时本阶段耗时较长,建议用脚本异步处理。
  • CPU 和 GPU 的 Embedding 速度差异明显,大批量导入可以观察耗时。
  • 入库后可以在界面查看“文档分段”数量,确认和源文档预期的块数一致。

向量化完成后,在知识库界面能看到每个文档的分段预览,这也能帮助你快速判断切分是否合理。

6.5 入库成功标准

  • 知识库中能看到文档状态为已完成或可用。
  • 分段列表能看到切分后的文本内容。
  • 用一个包含文档关键信息的查询词直接测试召回,能返回相关片段。

满足这三条,说明知识库构建流程已经打通。

7. RAG 问答效果验证与检索调优

7.1 第一轮问答测试

在对话界面选择刚才的知识库,输入一个需要引用文档具体细节的问题。比如你的测试文档里有报销流程,就问“报销流程是什么”。判断标准有三个:

  • 回答内容是否来自文档,而不是模型胡编。
  • 回答下方是否能显示引用的文档片段。
  • 如果文档里没有对应信息,模型是否明确说“未找到相关信息”。

如果第一轮回答不理想,先不要急着换大模型,多数情况下问题出在检索环节。

7.2 检索参数调整

参数作用调整建议
top_k召回片段数量从 3 到 5 起步,调大后观察答案是否更完整
相似度阈值低于阈值的片段丢弃一开始设低一点,避免查不到,再逐步提高
rerank 开关第二次精排有条件就开启,能明显提升答案质量
prompt 模板控制回答格式要求模型只依据上下文回答,未找到就说明未找到

每改一次参数,用同一组测试问题重新验证,不要边看边随手改。建议准备 5 到 10 条测试问题,做成测试集,每次调整后逐个测试并记录结果。

7.3 典型效果问题对应策略

现象可能原因处理方式
答非所问检索到的片段不相关降低 top_k,检查切分是否破坏了语义
找不到答案相似度阈值太高降低阈值,检查文档是否已成功向量化
回答明显来自模型臆想上下文不够或 prompt 约束弱调整 prompt 要求只依据给定内容作答
回答内容割裂切分粒度太小增加 chunk_size 或按标题结构切分
多文档混淆检索到多个不相关片段开启 rerank 精排,限制知识库范围

7.4 判断 RAG 是否真的生效

有一个很有效的验证方法:关闭 RAG 功能,直接问同一个问题;再开启 RAG,问同一个问题。如果两者回答差异明显,RAG 才真正生效。如果开启 RAG 后回答和直接问大模型差不多,说明检索链路仍需要优化。这个对比测试建议在部署完成后必做一次。

8. 接口 API 与批量任务接入

知识库跑通后,下一步通常是接入自己的业务系统。主流 RAG 框架都提供 HTTP API 或 SDK,下面给出一套通用的调用示例。

8.1 对话接口调用示例

import requests BASE_URL = "http://127.0.0.1:7861" KB_ID = "your-knowledge-base-id" payload = { "knowledge_base_id": KB_ID, "question": "根据文档说明,这个流程的注意事项是什么?", "top_k": 5, "stream": False, "temperature": 0.2, } resp = requests.post(f"{BASE_URL}/api/chat", json=payload, timeout=120) result = resp.json() # 一般会返回答案和引用片段 print(result["answer"]) print(result.get("references"))

该示例是通用风格,具体字段名和路径需要参考你所用框架的接口文档。测试时先用固定参数跑通,再进入业务对接。

8.2 批量问答示例

企业场景中,经常需要一次性对几百条问题做批量验证。常见做法是准备一个 CSV 文件,逐行请求接口:

import csv import requests import time BASE_URL = "http://127.0.0.1:7861" KB_ID = "your-knowledge-base-id" with open("questions.csv", "r", encoding="utf-8") as f: reader = csv.DictReader(f) questions = list(reader) with open("answers.csv", "w", encoding="utf-8", newline="") as f: writer = csv.writer(f) writer.writerow(["question", "answer", "references", "status"]) for item in questions: question = item["question"] try: resp = requests.post( f"{BASE_URL}/api/chat", json={ "knowledge_base_id": KB_ID, "question": question, "top_k": 5, "stream": False, }, timeout=120, ) data = resp.json() writer.writerow([ question, data.get("answer", ""), data.get("references", ""), "ok", ]) except Exception as e: writer.writerow([question, "", "", f"error: {e}"]) time.sleep(0.5)

批量任务一定要加 sleep 限速和异常捕获,避免瞬时请求量过大导致服务崩溃。跑完批量后,检查 error 行数,针对失败问题单独重试。

8.3 批量任务工程化建议

  • 输入与输出分开目录管理,避免覆盖测试数据。
  • 输出 CSV 中加入问题编号和状态列,方便后续人工复核。
  • 批量任务结束后统计成功率和平均响应时长。
  • 长文本大文档批量处理时,可以分批执行,每批 50 到 100 条。
  • 接口服务建议开启认证,限制只允许内网访问,避免端口暴露到公网。

9. 资源占用与性能观察

9.1 显存占用怎么看

如果本地部署了对话模型或 Embedding 模型,部署完成后建议持续观察显存变化。

watch -n 1 nvidia-smi

重点观察推理阶段的显存峰值和空闲阶段显存。空闲显存和峰值显存的差值,反映了任务对显存的真实需求。一次问答的峰值显存受上下文长度影响很大,知识库检索到的片段越多、用户问题越长,上下文越长,显存占用越高。

9.2 CPU 与 GPU 推理差异

Embedding 模型比较小,CPU 也能跑,但大批量文档向量化时 GPU 速度快很多。本地对话模型生成阶段,CPU 可以跑,但响应速度会慢很多。实际延迟取决于模型参数量、量化方式和硬件条件,先用一个简单问题测试首 token 响应时长,再决定是否升级硬件。

9.3 降低资源占用的通用手段

  • 使用量化模型,比如 4bit 量化,大幅降低显存占用。
  • 缩短上下文,检索片段数量不必贪多。
  • 批量文档向量化时限制并发数,避免内存打满。
  • 对话模型空闲时释放显存,或使用按需加载的服务。
  • 定期清理向量库中已删除文档产生的残留向量。

9.4 端口冲突与进程残留

启动多个框架时,经常遇到端口被占用。排查方式:

# 查看端口占用 lsof -i :7861 # 查看相关进程 ps aux | grep python

如果服务退出后进程残留,直接 kill 对应进程。多次启动失败时,先检查端口和日志,再动代码。

10. 常见问题与排查清单

下表汇总了 RAG 知识库部署和运行阶段最常见的问题:

问题现象可能原因排查方式解决方案
启动后页面打不开端口被占用或服务未启动检查 docker ps 和日志更换端口或重启服务
Embedding 模型下载失败网络不通或地址变更查看启动日志检查模型下载源,或手动下载放到指定目录
文档导入后检索不到内容向量化未完成查看文档分段状态等待任务完成,或重新触发向量化
回答质量差切分不合理或未开 rerank查看检索到的片段调整 chunk_size,开启重排序
显存不足模型太大或量化等级低nvidia-smi 查看显存换小模型、量化模型或降低并发
Dify 升级后无法保存知识库,修改知识库时提示 Internal Server Error数据库或向量库版本与代码不匹配查看容器日志,检查数据库迁移状态先备份数据,再执行数据库迁移;确认向量库连接配置正确;必要时回滚到上一稳定版本
API 调用失败参数名不对或服务未开启用 curl 直接请求接口对照接口文档校准参数
批量任务卡住并发过高或单条请求超时查看服务日志,检查超时设置降低并发,增加 sleep,设置请求超时

Dify 升级后出现的 Internal Server Error,在社区中比较常见,通常不是业务代码问题,而是升级后数据库表结构或向量索引没有同步更新。遇到时不要反复点击保存,先看日志,再处理迁移,避免知识库元数据损坏。

11. 企业级落地实践与合规建议

11.1 从最小可运行版本开始

第一次搭建先做最小闭环:一个知识库、一份测试文档、一个对话模型、一条 API 调用。验证通过后,再逐步增加文档量级和功能。不要把几十个系统一次性接进来,出现问题很难定位。

11.2 工程化目录管理

建议把模型文件、文档素材、向量库数据、输出结果分开管理。

rag-project/ ├── models/ # 模型文件 ├── docs/ # 原始文档 ├── vector_store/ # 向量数据库数据 ├── outputs/ # 批量测试结果 └── logs/ # 运行日志

这样备份、迁移、回滚都更清晰。每次升级前先备份 vector_store 和数据库。

11.3 访问控制与数据脱敏

企业知识库往往包含内部制度、合同模板、客户资料等敏感信息。部署前应确认:

  • 内部敏感数据是否允许接入外部大模型 API。如果不能,使用本地部署方案。
  • 上传到知识库的文档是否已做脱敏处理,比如手机号、身份证号、银行账号。
  • 接口服务是否设置访问令牌,是否限制只允许内网访问。
  • 知识库是否需要按部门做隔离,不同角色可访问的文档范围不同。

11.4 版权与授权说明

企业知识库中引用的文档、手册、合同、图片和代码,需要有明确的来源和授权。不要将未经授权获取的文档上传到公共模型服务。生成内容若用于对外发布,需要人工复核,避免引用到含版权问题的片段。

11.5 效果评估与持续优化

建议建立一套简单的效果评估集,固定 20 到 30 条业务问题,在每次更换 Embedding 模型、调整切分参数、更换大模型后,用同一套问题重新测试。没有量化指标,RAG 的优化永远只能靠感觉。

12. 总结与扩展方向

这套流程走下来,你应该已经完成了一个可用、可调、可接入业务系统的 RAG 知识库。值得先验证的功能有三个:文档切分是否语义完整、检索召回是否准确、开启 RAG 后和直接问大模型的回答是否有明显差异。最容易踩的坑也在三个地方:切分不合理、Embedding 模型不合适、Dify 升级后没做迁移导致知识库保存报错。

后续扩展方向很多。如果文档量大且关系复杂,可以研究 GraphRAG 和图数据库;如果需要让模型自主决定查哪个知识库、查几次,可以研究 Agentic RAG;如果检索结果仍然不准,可以引入 rerank 模型做二次精排。这些进阶玩法都建立在基础链路稳定运行的基础上。先把最基本的一条链路跑稳,再考虑花式扩展。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/8 11:09:13

.NET上位机开发避坑指南:字节序与大小端详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/8 11:08:58

【计算机毕业设计单片机案例】基于 STM32 的生理参数超限声光语音提示系统设计 基于 STM32 的便携式健康体征采集报警装置设计(013207)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

作者头像 李华
网站建设 2026/9/8 11:07:30

C++哈希表原理与性能调优:从unordered_map到底层机制

1. 先从一道面试题说起:为什么哈希表能做到O(1)查找不管是新手还是写了几年C的老兵,哈希表都是绕不开的一个话题。它出现在你刷题的第一百道题目里,出现在系统设计的技术选型里,也出现在面试官随口的追问里。我刚工作那会儿&#…

作者头像 李华
网站建设 2026/9/8 11:06:02

AI设计构建的CLI战术游戏Shove:从代码到可玩的完整闭环

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/8 11:05:13

FPGA入门必做项目:数字钟Verilog实现与仿真踩坑全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/8 11:03:16

FastAPI单元测试实战:TestClient与依赖隔离全攻略

接手项目大半年,我每天干得最多的事不是写新接口,而是给同事的FastAPI代码补单元测试。为什么?上线后接口被外部调用方在群里连续的滋味,真不想再体验第二次。等到生产环境炸了再回头补测试,成本翻三倍不说&#xff0c…

作者头像 李华