第1天:先把 RAG 的基础设施跑起来
第一天先不碰向量检索和问答,先用 Docker Compose 把 FastAPI、PostgreSQL、OpenSearch、Airflow 和 Ollama 跑起来。

这套项目最后会用到 RAG 、向量检索、任务调度和本地模型,但第一天先不碰这些功能,先把运行环境搭起来。
原因很简单。一个 AI Demo 只接模型接口当然很快,但只要准备长期往下做,数据库、搜索、定时任务、日志和服务状态这些东西都绕不过去。与其做到一半再补,不如一开始就把基础服务放好。
这次会用到 FastAPI 、 PostgreSQL 、 OpenSearch 、 Airflow 、 Ollama,统一用 Docker Compose 启动。
FastAPI 负责对外提供接口;论文标题、摘要、正文和其他信息放在 PostgreSQL;搜索交给 OpenSearch;每天抓论文这种任务以后放到 Airflow;Ollama 负责本地模型。第一天 Ollama 只要求服务能起来,不需要急着下载大模型。
整个项目准备分 7 篇做
- 把基础服务跑起来。
- 抓论文,处理 PDF 、限流、重试和去重。
- 用 OpenSearch 做 BM25 搜索。
- 做文档切片、 Embedding 和混合检索。
- 接本地模型,完成 RAG 。
- 加 Redis 和 Langfuse 。
- 最后再加 LangGraph 和 Telegram 。
今天只做第一步。
环境准备
README 里要求 Python 3.12 以上,同时需要 Docker Desktop 和 UV 。机器最好有 8GB 以上内存,并留出至少 20GB 磁盘空间。
项目拉下来以后:
cd production-agentic-rag-course
cp .env.example .env
uv sync
Windows PowerShell 下可以把第二条换成:
Copy-Item .env.example .env
.env 暂时不用改太多,现在主要是本地运行。后面用到外部 Embedding 、 Langfuse 或 Telegram 时,再加相应配置。
密钥、 Token 之类也别直接写到代码里,更不要提交到 Git 。
启动
直接执行:
docker compose up --build -d
第一次会下载镜像,时间可能稍长。
启动以后先看:
docker compose ps
不过这里要注意,容器显示 Up 只能说明进程起来了,并不能说明里面的服务已经可以正常访问,所以还得继续检查。
先打开:
http://localhost:8000/docs
这是 FastAPI 自动生成的接口文档。
如果健康检查接口是:
/api/v1/health
可以直接测试:
curl http://localhost:8000/api/v1/health
如果你拿到的代码版本路径不一样,就在 /docs 页面搜 health,没必要自己猜。
接着看 OpenSearch:
curl http://localhost:9200
有正常返回就行。
Airflow 打开:
http://localhost:8080
OpenSearch Dashboards:
http://localhost:5601
Ollama:
http://localhost:11434
这几个地址最好都实际访问一次。
Ollama 暂时不用拉大模型
第一天只检查服务,不要求本地模型已经下载。
如果想顺手测试,可以先拉一个小模型:
make ollama-pull MODEL=llama3.2:1b
make ollama-test MODEL=llama3.2:1b
用 1B 做环境测试已经够了。现在直接拉 8B 、 14B 没什么意义,还会白占磁盘和内存。
Docker 这里有两个地方容易搞混
第一个是地址
比如你在自己电脑浏览器里访问 FastAPI,用:
localhost:8000
但 FastAPI 如果也运行在 Docker 里,它访问 PostgreSQL 时一般不能写 localhost。
因为对 FastAPI 容器来说,localhost 指的是它自己。
容器之间通过 Compose 创建的网络通信,通常直接使用服务名。假设数据库服务叫 postgres,连接地址里就应该写 postgres。
这个问题后面很容易遇到:浏览器明明能访问接口,但程序就是连接不上数据库。先查这里通常没错。
第二个是数据卷
普通执行:
docker compose down
只是停止容器,数据库和 OpenSearch 的数据不会因此消失。
但:
docker compose down --volumes
会把 Volume 一起删除。
如果 PostgreSQL 和 OpenSearch 的数据都放在 Volume 里,这条命令基本相当于把本地数据也重置了。
所以服务起不来时,不要习惯性执行 down --volumes。除非本来就是准备清空环境。
出问题先看日志
例如 API 不正常:
docker compose logs --tail=100 api
OpenSearch 有问题就看 OpenSearch 的日志。
比较常见的情况就是端口占用、配置写错、数据库地址不对,或者 Docker 分配的内存不够。
常用的几个端口是:
8000
8080
5432
9200
5601
11434
电脑本身如果已经安装了 PostgreSQL,5432 就很容易冲突;8080 也经常被其他程序占用。
Windows 用户另外还要注意,PowerShell 、 CMD 、 Git Bash 和 WSL 的命令并不完全一样。有时候提示“命令不存在”,只是 Shell 不一样,并不是项目有问题。
今天做到这里就可以
第一天不用做问答,也不用做 Embedding 和向量检索。
能确认下面几件事就算结束:
- Docker Compose 正常启动;
- FastAPI 文档能打开;
- 健康检查正常;
- PostgreSQL 、 OpenSearch 、 Airflow 和 Ollama 都能正常运行。
最后再试一下:
docker compose down
docker compose up -d
确认重新启动也没有问题。
后面的论文入库、全文搜索、向量搜索和 RAG 都建立在这些服务上。今天看起来没做什么 AI 功能,但基础环境稳定以后,后面会省不少排查问题的时间。