从项目启动到 Milvus 向量检索,我把 RAG 项目链路又打通了一层

一、今天主要学了什么?

今天的学习内容不是单独某一个知识点,而是围绕我的 SuperBizAgent 智能问答与运维系统,继续把项目工程化链路往下拆。

主要包括这几个方向:

1. Spring Boot 项目依赖管理

今天重点理解了 Maven 里面的 BOM

以前我看到项目里既有:

复制代码
<properties>
    <spring-ai.version>...</spring-ai.version>
</properties>

又有:

复制代码
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>xxx</groupId>
            <artifactId>xxx-bom</artifactId>
            <version>${xxx.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

会觉得很绕。

今天终于明白了:

properties 只是定义版本号变量,BOM 才是真正统一管理一组依赖版本的地方。

也就是说,BOM 更像是一个"版本清单"。

比如 Spring AI、Spring Cloud、Spring AI Alibaba 这类生态组件,通常不是一个单独 jar,而是一整套依赖。如果每个依赖都手动写版本,很容易出现版本不兼容。

所以 BOM 的作用就是:

复制代码
我只指定一个生态版本,
具体里面每个子依赖该用什么版本,
由 BOM 帮我统一管理。

这对后续做 AI Agent 项目很重要,因为 Spring AI 相关依赖版本变化比较快,如果版本没管好,很容易出现代码之前能跑,升级之后接口变了、类找不到、方法不存在的问题。


二、理解了 DevTools:代码改动后自动重启

今天还看到了项目里的这个依赖:

复制代码
spring-boot-devtools

一开始我不太理解,感觉以前项目里也没怎么见过它。

后来理解了,它主要是为了提升开发效率。

它的作用可以简单理解为:

当我修改 Java 代码后,不需要手动停止项目再重新启动,Spring Boot 会自动检测变化,然后帮我重启应用。

不过这个"无感知"不是完全没有等待。

更准确地说:

复制代码
代码改了
↓
项目自动重启
↓
浏览器刷新页面或者重新请求接口时
可能会等一下
↓
但不需要我手动再点一次启动

所以它不是前端那种真正意义上的热更新,而是后端开发中的"自动重启"。

对开发者来说,最大的好处就是:

少做重复操作,改完代码直接重新访问接口即可。


三、Makefile 到底是什么?

今天还重点理解了项目里的 Makefile

之前我以为启动项目就是点 IDEA 的运行按钮,或者执行:

复制代码
mvn spring-boot:run

但这个项目里面用了 Makefile,比如可能会有:

复制代码
make start
make backend
make docker-up

这种命令。

今天我理解到:

Makefile 本质上就是一个"命令脚本集合"。

它不是 Java 项目必须有的东西,而是为了把复杂命令封装起来。

比如原本我要手动执行很多命令:

复制代码
docker compose up -d
mvn clean package
java -jar xxx.jar

如果写进 Makefile,就可以变成:

复制代码
make start

这样更方便,也更适合团队协作。

因为团队里每个人不需要记住一堆复杂命令,只需要知道统一入口。

这也让我理解了公司项目中为什么经常会有一些脚本文件,比如:

复制代码
Makefile
shell 脚本
bat 脚本
docker-compose.yml
CI/CD 配置文件

这些本质上都是为了让项目启动、部署、测试更标准化。


四、Docker Compose:原来 Milvus 不是一个单独容器

今天继续看了 Milvus 的 Docker Compose 配置。

一开始我以为:

Milvus 就是一个单独的向量数据库,启动一个 Milvus 容器就行。

但看了 compose 文件之后发现,Milvus 通常不是孤零零一个服务,它还依赖其他组件,比如:

复制代码
Milvus
etcd
MinIO

可以简单理解为:

复制代码
Milvus:负责向量数据管理和检索
etcd:负责元数据、服务协调
MinIO:负责对象存储,比如存一些底层数据文件

所以 docker-compose.yml 的作用就是:

一次性把 Milvus 运行所需要的一组服务都拉起来。

这让我对 Docker Compose 有了更清晰的认识:

复制代码
Docker 是启动一个容器
Docker Compose 是编排一组容器

对于 Milvus 这种复杂中间件来说,用 Docker Compose 比手动一个个启动容器方便很多。


五、理解了 YAML 里面的 -

今天也顺便理解了 YAML 配置文件里的 -

比如:

复制代码
volumes:
  - ./data:/data

这里的 - 不是减号,而是表示:

这是一个列表元素。

也就是说:

复制代码
volumes:
  - A
  - B
  - C

等价于 Java 里面的:

复制代码
List<String> volumes = List.of("A", "B", "C");

即使只有一个元素,也可以写成列表形式:

复制代码
ports:
  - "19530:19530"

这样做是因为很多配置项本来就支持多个值。

比如端口映射、目录挂载、环境变量、依赖服务等,都可能有多个,所以统一用列表结构更清晰。


六、curl 是什么?它和 Postman、Apifox 有什么关系?

今天还理解了一个经常出现在文档里的工具:curl

以前看到别人写:

复制代码
curl http://localhost:9900/api/test

会觉得有点陌生。

今天理解了:

curl 是一个命令行 HTTP 请求工具,可以用来测试接口。

浏览器其实也能请求接口,但浏览器主要适合测试 GET 请求。

比如访问:

复制代码
http://localhost:9900/api/hello

浏览器可以直接打开。

但是如果是 POST 请求,需要设置请求体、请求头、Content-Type,就不方便了。

比如:

复制代码
curl -X POST http://localhost:9900/api/chat \
  -H "Content-Type: application/json" \
  -d '{"message":"你好"}'

这时候 curl 就很有用了。

而 Postman、Apifox 这种工具,本质上也是帮我们更方便地构造 HTTP 请求。

可以这样理解:

复制代码
curl:命令行方式测试接口
Postman / Apifox:图形化方式测试接口
浏览器:主要适合简单 GET 请求

所以 curl 不是只能测试 GET,它也可以测试:

复制代码
GET
POST
PUT
DELETE
PATCH
上传文件
携带请求头
携带请求体

这对后端开发很重要,因为很多接口不是简单浏览器访问就能测出来的。


七、继续深入 Milvus:Collection 类似 MySQL 的表

今天最后重点看了 Milvus 向量搜索代码。

其中有一个问题是:

查询参数里的 collection 是什么?

今天理解到:

Milvus 里的 Collection,可以类比成 MySQL 里的表。

比如 MySQL 里可能有:

复制代码
user_table
order_table
article_table

而 Milvus 里可能有:

复制代码
document_collection
knowledge_collection
log_collection

每个 Collection 里面存的是一批向量数据。

所以可以简单对应成:

MySQL Milvus
Database Database
Table Collection
Row Entity
Column Field
索引 向量索引
SQL 查询 向量相似度检索

这样一对比就清楚很多。


八、Vector 是什么?为什么查询参数里会有 Vector?

今天还有一个重点问题:

Collection 类似 MySQL 的表,那 Vector 又是什么?

这个其实是 RAG 项目里非常核心的概念。

在 MySQL 里面,我们通常根据字段查询:

复制代码
select * from article where title like '%Milvus%';

但在向量数据库里,不是靠关键词完全匹配,而是靠"语义相似度"。

比如用户问:

复制代码
Milvus 怎么查询相似文本?

系统会先把这句话交给 Embedding 模型,转换成一个向量:

复制代码
[0.12, -0.35, 0.88, 0.04, ...]

这个向量就是 Vector。

然后 Milvus 会拿这个查询向量,去 Collection 里找最相似的向量。

所以这里的 Vector 可以理解为:

用户问题经过 Embedding 模型转换后的"语义坐标"。

它不是普通字符串,也不是数据库字段名,而是一组浮点数。

完整流程大概是:

复制代码
用户输入问题
↓
Embedding 模型把问题转成向量
↓
拿这个向量去 Milvus 的 Collection 中搜索
↓
找到最相似的文档片段
↓
把文档片段交给大模型生成回答

这就是 RAG 在线问答链路的核心。


九、Milvus 最后返回的是一个集合吗?

今天还看了向量搜索服务里的代码,大概会涉及:

复制代码
SearchResults
SearchResultsWrapper
List<SearchResultsWrapper.IDScore>

这里也有一个问题:

最后得到的结果是不是一个集合?

答案是:是的。

Milvus 搜索不是只返回一个结果,而是返回一批最相似的结果。

比如设置 topK = 5,那么 Milvus 会返回最相似的 5 条数据。

可以理解为:

复制代码
[
  文档片段1,相似度分数0.91
  文档片段2,相似度分数0.87
  文档片段3,相似度分数0.82
  文档片段4,相似度分数0.79
  文档片段5,相似度分数0.75
]

所以在 Java 代码里,通常会用 List 接收。

这些结果里面一般会包含:

复制代码
id
score
metadata
文本内容

其中 score 表示相似度分数。

分数越高,说明这个文档片段和用户问题越相关。


十、今天对 RAG 项目链路的理解更完整了

今天学完之后,我对 RAG 项目的链路更加清楚了。

以前只是知道:

复制代码
上传文档
切分文本
向量化
存入向量数据库
查询时召回
交给大模型回答

但今天开始能把它和具体代码对应起来了。

比如:

离线阶段

复制代码
上传文件
↓
保存文件
↓
解析文本
↓
文本切分 chunk
↓
调用 Embedding 模型生成向量
↓
存入 Milvus Collection

在线阶段

复制代码
用户提问
↓
把问题转换成 Vector
↓
Milvus 在 Collection 中做相似度检索
↓
返回 topK 个相似结果
↓
拼接成上下文
↓
交给 LLM 生成最终回答

现在我再看项目中的服务类,就不会觉得它们是割裂的。

比如:

复制代码
VectorEmbeddingService:负责把文本转成向量
VectorSearchService:负责从 Milvus 搜索相似向量
MilvusServiceClient:负责和 Milvus 通信
SearchParam:负责封装搜索参数
SearchResultsWrapper:负责解析搜索结果

这几个类其实正好对应了 RAG 在线检索链路。


十一、今天的面试表达沉淀

如果面试官问:

你这个项目里的 Milvus 是怎么用的?

可以这样回答:

我在项目中使用 Milvus 作为向量数据库,主要用于 RAG 问答中的知识召回。离线阶段会先把用户上传的文档解析、切分,然后调用 Embedding 模型把文本片段转换成向量,存入 Milvus 的 Collection 中。在线查询时,会先把用户问题也转换成向量,然后在指定 Collection 中做相似度检索,返回 topK 个最相关的文档片段,再把这些片段作为上下文交给大模型生成回答。

如果面试官继续问:

Milvus 的 Collection 是什么?

可以回答:

Collection 可以类比成 MySQL 里的表。MySQL 的表存的是结构化数据,而 Milvus 的 Collection 存的是向量数据以及对应的字段信息,比如文本内容、文档 ID、metadata 等。

如果面试官问:

查询时传入的 Vector 是什么?

可以回答:

Vector 是用户问题经过 Embedding 模型转换后的向量表示。它是一组浮点数,用来表示文本语义。Milvus 会拿这个查询向量和库里的文档向量做相似度计算,从而找到语义上最相关的内容。

如果面试官问:

Milvus 返回的结果是什么?

可以回答:

返回的是一组相似结果,一般是 topK 个,每个结果会包含 ID、相似度分数以及我们需要的业务字段。项目中会把这些结果封装成 List,然后提取相关文本片段,作为 RAG 的上下文。


十二、今天的收获

今天最大的收获是,我不再只是从概念上理解 RAG,而是开始从工程实现角度理解它。

以前听到:

复制代码
向量数据库
Embedding
Collection
Vector
topK
相似度搜索

这些词会觉得有点抽象。

但今天结合项目代码之后,我发现它们其实是一个完整链路里的不同环节。

可以总结成一句话:

RAG 的核心不是简单地"接入一个大模型",而是要把文档处理、向量化、向量存储、相似度检索、上下文拼接和大模型生成串成一条稳定的工程链路。

今天虽然学的内容比较杂,但其实都在服务于一个目标:

让我的 SuperBizAgent 项目从"能跑"逐步变成"能讲清楚、能调试、能面试表达"的项目。

这也是我现在准备实习过程中最需要补齐的能力。


结尾

今天的学习让我对项目工程化和 RAG 检索链路都有了更清楚的认识。

从 Maven 依赖管理,到 Docker Compose 部署 Milvus,再到 curl 测试接口,最后深入到 Milvus 的 Collection、Vector 和搜索结果解析,这些内容看起来分散,但其实都是一个 AI Agent 项目真正落地时必须掌握的基础能力。

后面继续推进这个项目时,我会重点把两件事做好:

复制代码
第一,把代码链路真正跑通、调通;
第二,把每一块技术都转化成面试中能讲清楚的话。

这样这个项目才不只是一个学习 Demo,而是能真正放进简历、支撑实习面试的 AI 项目。

相关推荐
AndrewHZ43 分钟前
【LLM技术全景】Transformer架构深度解析:Encoder-Decoder全理解
人工智能·深度学习·语言模型·大模型·llm·transformer·编解码技术
沫儿笙43 分钟前
新能源汽车焊接智能节气装置
人工智能·机器人·汽车
阿昌喜欢吃黄桃43 分钟前
大模型常见参数学习笔记
人工智能·ai·llm·prompt·token
包子BI大数据44 分钟前
2.COZE-RAG知识库搭建
python·ai·aigc
码上有光1 小时前
c++:多态
java·jvm·c++·多态·多态原理
Lumbrologist1 小时前
【C++】零基础入门 · 第 18 节:互斥锁与线程同步
java·开发语言·c++
程序员cxuan1 小时前
太顶了,ChatGPT 要和 Codex 搞一起了。
人工智能·后端·程序员
AIMath~1 小时前
MongoDB数据库,MySQL数据库,Redis数据库,Milvus数据库对比分析与和核心总结
数据库·mysql·mongodb·milvus
weixin_446260851 小时前
ClinEnv:面向Agent的交互式多阶段电子健康记录(EHR)环境
人工智能