十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

用Claude Code搭建本地向量搜索引擎:从原理到工程实践

用Claude Code搭建本地向量搜索引擎:从原理到工程实践 在 AI 编程助手逐步普及的今天Claude Code 已经不只是“聊天生成代码”的工具它可以在终端里读取项目结构、执行命令、修改多个文件甚至把一个完整的小项目从零搭起来。向量搜索引擎就是一个很适合用来验证这套工作流的题目它既有数据模型、又有索引写入、又有查询接口还涉及相似度计算和性能取舍边界清晰闭环完整。这篇文章围绕“用 Claude Code 搭建一个本地向量搜索引擎”展开从准备工作、数据建模、索引写入、查询服务到问题排查给出可以直接落地的思路和代码。整个过程可以用 Claude Code 辅助完成也可以手动复现重点在于理解每一步为什么要这样设计。1. 先搞清楚向量搜索引擎在解决什么问题Claude Code 在这里能做什么1.1 什么是向量搜索引擎传统搜索引擎的核心是关键词匹配用户输入“苹果”系统去倒排索引里找包含“苹果”的文档然后按相关性排序。这种方式对精确词、专有名词效果不错但遇到同义词、口语化表达、跨语言查询时效果会明显下降。向量搜索引擎换了一种思路。它先把文本、图片或其他数据通过嵌入模型转换成固定维度的数值向量例如 384 维或 768 维。语义相近的内容在向量空间中距离也更近。用户输入查询语句后系统同样把查询转换成向量然后在向量数据库里查找与查询向量距离最近的记录返回最相似的若干条结果。这里的关键点在于搜索依据的是“语义相似度”不是“字面匹配”。所以即使用户没有搜到原文中的关键词只要意思接近结果也能被召回。1.2 Claude Code 在项目里的角色Claude Code 是一个终端环境下的 AI 编程助手。它不只是一个代码补全插件而是可以读取本地项目、执行 shell 命令、创建和修改文件、运行测试并在多轮对话中维护上下文。搭建向量搜索引擎涉及到的文件很多包括数据准备脚本、向量化脚本、存储层、查询 API、配置文件、测试用例等人工一步步写不是不行但用 Claude Code 辅助可以更快地完成原形搭建。不过要注意Claude Code 不能替代工程师做技术决策。它可以帮助生成代码但“用什么向量模型”“用哪种相似度算法”“数据量大概多大”“是否需要持久化”“接口返回结构如何设计”这些问题仍然需要开发者自己判断。把它理解成一个高效的结对编程伙伴更符合实际。1.3 这套方案适合什么场景本文给出的方案适合以下场景本地小批量文档的语义检索比如几百到几万条笔记、文章片段、商品描述。学习向量检索原理想用一个可运行的最小系统观察整体流程。给团队做技术验证在引入正式向量数据库之前先验证语义搜索效果是否符合预期。想熟悉 Claude Code 在真实项目中的协作方式用一个小而完整的项目来练习。如果数据量达到千万级别或者对查询性能有极高要求本文的轻量实现并不适合应该直接考虑专门的向量数据库或云服务。2. 环境准备先对齐 Python、依赖和 Claude Code 环境避免后面反复踩坑2.1 说明在开始写代码前优先把环境确认好。向量搜索引擎涉及不少依赖如果 Python 版本、pip 源、模型下载方式不一致很容易出现代码写完了但环境跑不起来的情况。2.2 环境检查清单推荐使用 Python 3.10 或 3.11尽量避免 Python 3.8 以下版本因为部分嵌入模型库对旧版本支持不友好。项目推荐配置说明操作系统macOS / Linux / Windows本文命令以 macOS/Linux 终端为例Python3.10 或 3.11过低版本可能出现依赖编译失败包管理工具pip 或 uvuv 安装依赖速度更快但需要额外安装向量索引库FAISS CPU 版适合本地学习和中小规模检索嵌入模型sentence-transformers 中的小型模型首次运行会下载模型文件Web 框架FastAPI Uvicorn用于提供 HTTP 查询接口Claude Code终端安装并完成登录授权用于辅助生成、修改和解释代码2.3 安装核心依赖建议创建一个新的虚拟环境避免污染系统级 Python。python3 -m venv .venv source .venv/bin/activate pip install --upgrade pip然后安装依赖。pip install fastapi uvicorn sentence-transformers faiss-cpu numpy pandas这些依赖各自的作用fastapi和uvicorn用来提供 HTTP 服务。sentence-transformers负责把文本转成向量。faiss-cpu负责存储向量并执行相似度检索。numpy用于向量数据的基本操作。pandas不是必须但处理 CSV 数据时很方便。如果安装faiss-cpu遇到网络问题可以切换 pip 镜像源pip install faiss-cpu -i https://pypi.tuna.tsinghua.edu.cn/simple这里要注意不要为了追求速度跳过虚拟环境。后期如果依赖版本冲突一个干净的虚拟环境能省下大量排查时间。2.4 安装并验证 Claude CodeClaude Code 的安装方式可能随版本变化但整体流程是安装 CLI 工具、登录授权、在一个项目目录中启动终端会话。npm install -g anthropic-ai/claude-code安装完成后进入项目目录运行claude如果这是第一次运行通常需要进行账号登录或 API Key 配置。不同版本的具体交互不一样建议以官方提示为准。注意Claude Code 不是必须的。即使不安装它本文的所有代码也可以手动完成。安装它的价值是让 AI 辅助你生成代码、解释报错、重构文件从而加快开发速度。2.5 准备测试数据没有任何数据向量搜索引擎就没有意义。准备一份简单的文本数据集作为示例。id,title,content 1,Redis 缓存穿透,缓存中不存在且数据库中也不存在的数据导致请求直接打到数据库 2,MySQL 索引失效,对索引列使用函数或隐式类型转换可能导致索引失效 3,Docker 容器日志,容器默认日志驱动可能撑满磁盘需要配置日志轮转 4,Kubernetes Pod 调度,节点资源不足或存在污点会影响 Pod 调度结果 5,Python GIL,全局解释器锁影响多线程 CPU 密集任务的并行效果把文件保存为data/documents.csv。这份数据量很小目的是先把流程跑通后续再替换成真实数据。3. 系统设计向量搜索引擎由哪几个模块组成数据如何流动3.1 整体流程向量搜索引擎的核心流程可以分成四个阶段读取原始文本数据。用嵌入模型将文本转换成向量。把向量写入索引结构并保存元数据。接收查询把查询文本向量化在索引中检索最近邻返回结果。下图描述的是逻辑流程不需要在项目里实现图形界面。原始文本 - 嵌入模型 - 向量特征 - FAISS 索引 - 查询向量 - 相似度检索 - 结果返回3.2 文件结构规划为了让 Claude Code 更容易理解和维护项目建议从开始就规划清晰的文件结构。vector-search/ ├── data/ │ └── documents.csv ├── src/ │ ├── embed.py │ ├── build_index.py │ ├── search.py │ └── api.py ├── models/ │ └── index.bin ├── requirements.txt └── README.md每个文件的职责embed.py封装文本向量化逻辑加载嵌入模型。build_index.py读取 CSV生成向量构建 FAISS 索引保存到磁盘。search.py提供本地搜索函数供命令行或 API 调用。api.pyFastAPI 服务对外提供 HTTP 查询接口。models/index.bin保存构建好的向量索引。这样的结构足够简单也能明确区分“构建索引”和“查询索引”两个阶段。3.3 关键设计取舍在选择具体组件时需要理解几个权衡点为什么用 FAISSFAISS 是 Meta 开源的向量检索库支持 CPU、GPU提供精确检索和近似检索。对本地学习和中小规模数据集FAISS CPU 版本足够。为什么用小型嵌入模型首次下载快CPU 上推理速度也更快。如果追求更好的语义效果可以换成更大的模型但内存和耗时都会增加。为什么用 FastAPI它自带 API 文档、请求参数校验适合快速把检索能力暴露成 HTTP 服务。这些取舍不是绝对的。真实项目里完全可以用其他向量数据库替代 FAISS也可以把嵌入服务独立部署。这里的选择是为了让最小系统先跑起来。4. 核心实现文本向量化、索引构建和查询接口4.1 实现文本向量化模块embed.py的核心任务是加载模型并提供一个to_vector函数。# src/embed.py from sentence_transformers import SentenceTransformer _model None _model_name sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 def get_model(): global _model if _model is None: _model SentenceTransformer(_model_name) return _model def to_vector(text: str): model get_model() embedding model.encode(text, normalize_embeddingsTrue) return embedding.tolist()这里做了两件重要的事情使用模块级全局变量缓存模型避免每次请求都重新加载模型。模型加载非常耗时如果放在查询接口里反复加载服务性能会非常差。对向量做了归一化。归一化后计算欧式距离和计算余弦相似度的结果排序一致后续使用 FAISS 的IndexFlatIP内积索引时可以直接用内积衡量相似度。4.2 实现索引构建脚本索引构建脚本负责把 CSV 文档转换成向量并写入 FAISS。# src/build_index.py import csv import os import numpy as np import faiss from embed import to_vector DATA_PATH data/documents.csv INDEX_PATH models/index.bin def load_documents(path): documents [] with open(path, newline, encodingutf-8) as f: reader csv.DictReader(f) for row in reader: documents.append({ id: row[id], title: row[title], content: row[content], }) return documents def build_index(): documents load_documents(DATA_PATH) vectors [] for doc in documents: text f{doc[title]} {doc[content]} vector np.array(to_vector(text), dtypefloat32) vectors.append(vector) matrix np.vstack(vectors) dimension matrix.shape[1] index faiss.IndexFlatIP(dimension) index.add(matrix) os.makedirs(models, exist_okTrue) faiss.write_index(index, INDEX_PATH) metadata_path INDEX_PATH .meta.json with open(metadata_path, w, encodingutf-8) as f: import json json.dump(documents, f, ensure_asciiFalse, indent2) print(f索引构建完成{len(documents)} 条文档向量维度 {dimension}) if __name__ __main__: build_index()这段代码的关键点拼接了title和content作为向量化输入让标题中的信息也参与语义表示。使用IndexFlatIP即暴力内积检索。数据量不大的时候这个索引最简单、最精确不会出现近似检索的召回损失。把原始文档元数据单独保存为 JSON因为 FAISS 索引里只存向量 ID 和向量本身不存原文。查询到向量后还要通过元数据找到原始内容。这里有个容易出现的问题FAISS 使用float32数组如果直接用 Python 的list添加会报类型错误。上面的代码已经用np.array(..., dtypefloat32)做了转换实际项目中不要漏掉这一步。4.3 实现本地搜索函数search.py提供可复用的检索函数。# src/search.py import json import numpy as np import faiss from embed import to_vector INDEX_PATH models/index.bin def load_index(): index faiss.read_index(INDEX_PATH) with open(INDEX_PATH .meta.json, r, encodingutf-8) as f: metadata json.load(f) return index, metadata def search(query: str, top_k: int 3): index, metadata load_index() query_vector np.array(to_vector(query), dtypefloat32).reshape(1, -1) scores, indices index.search(query_vector, top_k) results [] for score, idx in zip(scores[0], indices[0]): doc metadata[idx] results.append({ id: doc[id], title: doc[title], content: doc[content], score: float(score), }) return results if __name__ __main__: query 多线程性能受到什么限制 results search(query) for r in results: print(r[title], r[score])查询流程中需要注意index.search返回两个数组一个是分数一个是索引位置。索引位置对应元数据列表的下标。如果top_k大于文档总数FAISS 会自动截断不会报错但返回数量会少于预期。score是内积相似度。归一化向量后内积范围在 -1 到 1 之间值越大表示越相似。4.4 实现 HTTP 查询接口为了把搜索能力暴露给其他系统用 FastAPI 封装一层接口。# src/api.py from fastapi import FastAPI, Query from pydantic import BaseModel from search import search as search_fn app FastAPI(title本地向量搜索引擎) class SearchResult(BaseModel): id: str title: str content: str score: float class SearchResponse(BaseModel): query: str results: list[SearchResult] app.get(/search, response_modelSearchResponse) def search_endpoint(q: str Query(..., description查询文本), top_k: int Query(3, ge1, le20)): raw_results search_fn(q, top_ktop_k) results [SearchResult(**r) for r in raw_results] return SearchResponse(queryq, resultsresults)启动接口服务uvicorn src.api:app --reload --port 8000访问curl http://localhost:8000/search?q缓存穿透怎么办top_k3FastAPI 会自动提供交互式文档页面浏览器访问http://localhost:8000/docs可以调试接口。4.5 用 Claude Code 辅助生成代码时的提问方式如果使用 Claude Code 辅助实现不建议直接让它一次性输出全部项目而是分阶段提问。可以这样描述任务“请读取当前目录下的 data/documents.csv 文件了解字段结构。”“帮我写一个 Python 模块使用 sentence-transformers 将文本转成 384 维向量。”“写一个脚本把 CSV 内容向量化后存入 FAISS 索引并输出索引路径。”“新增一个 FastAPI 接口接收 q 和 top_k 参数返回搜索结果 JSON。”按阶段让 AI 生成代码再手动检查比一次性生成整个项目更可控。Claude Code 可以看到项目里的文件内容回答会更贴合实际目录。5. 参数说明和模型选择这决定检索效果和资源占用5.1 嵌入模型参数的影响文本向量化的质量直接决定搜索效果。如果向量本身没有准确表达语义后面检索算法再好也没用。常用的几个模型维度模型向量维度特点paraphrase-multilingual-MiniLM-L12-v2384支持多语言轻量适合快速验证all-MiniLM-L6-v2384英文效果好体积小BAAI/bge-small-zh-v1.5512中文检索效果好体积适中BAAI/bge-large-zh-v1.51024中文效果更强资源占用更大如果数据以中文为主建议优先尝试BAAI/bge-small-zh-v1.5。在embed.py中只要修改_model_name即可切换模型但要注意重新构建索引。5.2top_k参数top_k控制返回多少条结果。该值越大召回越多但噪音也可能更多。如果用户只看前几条结果建议设置为 5 或 10如果是做召回阶段后续还有精排模型可以设置 20 到 100。5.3 归一化对检索结果的意义在to_vector中设置了normalize_embeddingsTrue这意味着所有向量长度都是 1。在此基础上FAISS 的IndexFlatIP计算的内积等价于余弦相似度。这样有两个好处分数范围稳定便于设置阈值。可以使用内积索引检索速度和内存表现更可控。如果换用不归一化的向量仍然可以用IndexFlatIP但是分数含义会发生变化排序可能偏向向量模长更大的文档实际使用时要注意。5.4 是否需要重新训练向量模型不要一上来就训练自己的嵌入模型。对大多数业务场景使用开源预训练模型已经足够。只有当你发现领域词汇特别专业、通用模型效果明显不佳并且你已经收集到足够的标注数据时才需要考虑微调模型。微调嵌入模型不是简单任务需要准备正负样本对并设计合理的训练流程。6. 运行验证从命令行到 HTTP 接口逐步确认效果6.1 先验证向量维度运行一段小脚本确认模型可以正常加载并输出指定维度的向量。python -c from src.embed import to_vector; v to_vector(测试文本); print(len(v))预期输出是 384。如果输出其他数字说明模型维度变了需要看索引维度是否一致。6.2 构建索引并检查输出运行python -m src.build_index正常会看到类似输出索引构建完成5 条文档向量维度 384同时models/目录下会出现index.bin和index.bin.meta.json。6.3 测试语义搜索效果运行python -m src.search如果输入的是“多线程性能受到什么限制”预期返回结果应包含 “Python GIL” 这条记录。即使查询文本里没有出现“GIL”这个英文词语义搜索也能把它召回这正是向量搜索区别于关键词搜索的关键。6.4 验证 HTTP 接口启动服务uvicorn src.api:app --reload --port 8000浏览器访问http://localhost:8000/docs查看接口文档。调用/search接口传入参数q数据库查询慢怎么办观察返回结果是否包含 MySQL 索引相关的文档。注意不要只验证 200 状态码还要检查返回结果的相关性和排序。向量搜索引擎是否好用核心指标是语义召回是否准确而不是接口是否可访问。6.5 性能测试的简单方法数据量增大后可以用time命令观察查询耗时的变化。time curl http://localhost:8000/search?q测试top_k5初次查询会包含模型加载时间后续查询模型已缓存耗时主要来自向量化和索引检索。如果发现查询越来越慢可以考虑把模型加载移到服务启动阶段而不是首次请求时。如果数据量超过几十万条把IndexFlatIP换成IndexIVFFlat。增加缓存层对高频查询结果做短期缓存。7. 常见问题排查从模型报错到结果为空逐一定位7.1model名称不被识别在配置 Claude Code 或嵌入模型时如果提示is not a model this version of Claude Code recognizes通常有两个原因使用的模型名称拼写有误。当前 Claude Code 版本不支持该模型名称需要更新版本或改为使用配置的默认模型。处理方式检查模型参数是否写错。运行claude --version查看版本。按官方文档更新到较新版本。如果只是临时验证使用默认模型而不是指定自定义模型名。不要随意把网络搜索中看到的模型名直接填进配置模型名称要来自官方文档或环境实际支持的列表。7.2 FAISS 维度不一致现象构建索引时正常但查询时报维度错误。原因建索引和查询时使用了不同的嵌入模型或者不同模型输出维度不同。检查方式打印建索引和查询时的dimension确认两边一致。解决方式统一_model_name重新构建索引再启动查询服务。7.3 查询结果为空FAISS 的检索结果为空通常不是因为索引空而是元数据下标对不上或top_k设置异常。检查路径确认index.bin.meta.json是否存在且非空。打印indices数组看返回的下标是否在元数据长度范围内。如果是在接口层返回空检查SearchResult的字段名是否和元数据字段完全一致。7.4 首次运行模型下载失败SentenceTransformer首次运行会从 Hugging Face Hub 下载模型。网络不稳定时容易失败。处理方式使用国内镜像源hf-mirror.com下载模型。手动提前下载模型到本地修改_model_name为本地路径。重新运行脚本模型下载成功后会自动缓存到本地。7.5 服务启动慢FastAPI 服务启动后第一次请求特别慢是因为模型还没加载。解决方式在api.py中使用 FastAPI 的启动事件提前加载模型。from contextlib import asynccontextmanager from fastapi import FastAPI import embed asynccontextmanager async def lifespan(app: FastAPI): embed.get_model() yield app FastAPI(title本地向量搜索引擎, lifespanlifespan)这样服务启动时就会把模型加载到内存第一次请求不再等待模型加载。7.6Array must be contiguous或类型错误FAISS 对numpy数组的存储连续性有要求。从列表转换出的数组一般没问题但如果对数组做了切片、转置等操作可能出现非连续内存。处理方式在使用前显式调用np.ascontiguousarray()并确保 dtype 是float32。matrix np.ascontiguousarray(matrix, dtypefloat32)8. 用 Claude Code 高效协作拆任务、看上下文、做检查8.1 分阶段任务是关键Claude Code 在长对话里能记住不少上下文但一个清晰的项目还是应该分阶段推进。推荐的阶段划分环境准备和项目骨架。数据加载和文本向量化。索引构建。本地检索验证。API 封装。结果优化和错误处理。每个阶段完成后再进入下一阶段这样出问题时定位范围更小。8.2 让 AI 读文件而不是凭空提问Claude Code 的优势在于可以读取当前项目文件。提问时尽量提供文件路径“读取src/build_index.py告诉我索引构建步骤里有哪些潜在问题。”“查看data/documents.csv的字段写一个数据清洗脚本。”“改造src/api.py增加一个基于关键词的搜索接口作为对比。”这样得到的回答比抽象提问更贴合项目实际。8.3 用 AI 生成测试用例搜索功能写完后可以让 Claude Code 生成一组测试数据覆盖不同场景同义词查询。中英文混合查询。空查询。不存在领域的查询。然后人工判断搜索结果是否符合预期。这类测试用例对验证向量模型效果很有价值。9. 性能优化和扩展方向从最小系统走向可用系统9.1 索引结构升级当数据量达到几十万条以上暴力检索的耗时和内存都会变得不可接受。这时可以从IndexFlatIP升级到IndexIVFFlat。IndexIVFFlat的核心思想是先把向量空间划分为多个簇查询时只搜索最相关的几个簇从而减少计算量。代价是召回率下降。可以通过nprobe参数控制搜索多少个簇nprobe越大召回越高耗时也越长。nlist 100 quantizer faiss.IndexFlatIP(dimension) index faiss.IndexIVFFlat(quantizer, dimension, nlist, faiss.METRIC_INNER_PRODUCT) index.train(matrix) index.add(matrix) index.nprobe 10使用IndexIVFFlat前必须调用train而且训练数据和要索引的数据最好来自同一分布。如果数据量不够大训练效果反而不好。9.2 增加向量持久化以外的整体设计当前方案把元数据保存在 JSON 文件里。数据量变大后JSON 文件加载到内存会占用大量资源更适合引入真实数据库存储文档元数据例如 SQLite、PostgreSQL 或 MongoDB。FAISS 只负责向量检索业务字段交给数据库管理。检索流程变成查询向量在 FAISS 中找到候选 ID。用候选 ID 到数据库查询完整信息。返回结果。这样避免把大字段全部塞进内存。9.3 缓存和并发控制如果同一查询反复出现可以在服务层增加简单缓存。但要注意语义搜索的查询变化非常多缓存命中率通常不如关键词搜索高。更实际的做法是缓存热点结果。为不同用户设置相似度阈值。对高延迟查询做超时控制和日志记录。9.4 扩展方向完成最小系统后可以继续尝试这些方向增加文件上传接口支持 Word、PDF 文档解析后入库。加入增量更新机制不需要每次全量重建索引。对比多个嵌入模型在同一数据集上的召回效果。加入粗排加精排流程先向量召回再用交叉编码器精排。接入专门的向量数据库例如 Milvus、Qdrant观察架构变化。这些方向都围绕同一个核心在理解和优化向量检索流程的基础上逐步引入工程化组件。10. 最佳实践和可复用清单10.1 项目落地时的实践建议在实际项目中不要把向量搜索引擎想成“一个脚本搞定”。至少要关注这几个层面数据质量原始文本是否干净是否包含重复内容是否经过编码统一。模型选型不同模型的多语言能力、领域效果差异很大先用小模型验证流程再换大模型对比效果。索引更新全量重建索引在数据量小时没问题但数据量大或更新频繁时要设计增量更新机制。监控记录查询耗时、空结果率、单条查询召回的相似度分数。权限如果接口上线要考虑接口鉴权避免被任意调用消耗资源。10.2 环境检查清单搭建和运行前按顺序检查以下项目[ ] 是否已创建 Python 虚拟环境并在其中安装依赖 [ ] sentence-transformers 是否能成功加载模型 [ ] FAISS 是否能正常读取和写入索引文件 [ ] CSV 文件的编码是否为 UTF-8表头是否与代码一致 [ ] 构建索引和查询是否使用同一个嵌入模型 [ ] 查询向量是否为 float32 数组 [ ] 元数据 JSON 是否和索引文件同时生成 [ ] API 服务启动后是否提前加载模型 [ ] 查询结果中关联的元数据字段是否完整 [ ] 对大文本是否做了长度限制或截断10.3 用表格整理问题现象和排查关键字问题现象可能原因检查关键字处理建议首次请求很慢模型延迟加载model loaded使用 FastAPI lifespan 启动时加载查询结果排序异常向量未归一化normalize_embeddings向量化时开启归一化索引维度报错模型不一致dimension统一模型后重建索引下载模型失败网络无法访问模型源Hugging Face Hub配置镜像或本地模型路径返回结果与查询无关模型不适合当前语种中文/英文效果换多语言模型或中文模型数据量增大后查询变慢使用暴力检索IndexFlatIP换 IVF 索引或向量数据库服务启动后占用内存过高模型常驻内存内存占用预估模型大小调整实例规格构建索引时 OOM一次性加载全部向量内存溢出分批写入索引10.4 给新手的练习建议这个项目适合作为向量检索入门练习建议按照下面顺序做先用 5 条数据跑通全流程。把 CSV 数据扩展到 1000 条观察构建和查询耗时的变化。换一个不同语言模型对比同一查询的返回结果。把索引类型从IndexFlatIP改成IndexIVFFlat对比召回差异。给 API 增加一个“只搜索标题”和“标题正文”的开关理解哪些信息参与向量化对结果的影响。每一步都围绕同一个核心问题向量从哪里来、存到哪里去、怎么查最合适。把这条链路理解清楚之后使用任何向量数据库都会事半功倍。11. 写在最后这个项目教会我们什么用 Claude Code 搭建向量搜索引擎表面上得到的是一套可以运行的代码实际上经历了一次完整的工程闭环从需求拆解、环境准备、数据建模到系统验证和问题排查。这种“AI 辅助 人工把控”的开发方式会越来越接近真实工作中的状态。对开发者来说最大的收获不是 FAISS 和 FastAPI 的 API 用法而是弄清楚向量检索的基本流程和取舍逻辑。只要掌握了数据如何被向量化、向量如何被索引、查询如何被召回未来无论切换到何种向量数据库、何种文本模型都能快速上手。下一步可以做的就是把手里的技术笔记、产品反馈、知识库文档用这套流程建一个可以实际使用的本地语义搜索工具。数据量不需要太大先从 1000 条开始跑通后再逐步增加数据、优化模型和调整检索策略。
返回列表