PHP 8.3 RAG 知识库应让 PHP 专注流程编排,向量生成交 Ollama/FastAPI,检索用 Weaviate 或 Qdrant,避免 Milvus;文档解析、分块、写入、查询、缓存与降级需全流程设计。

在 PHP 8.3 项目中集成向量库搭建 RAG 知识库,核心难点不在语言本身——PHP 不原生支持向量化或向量检索,而在于合理分工:让 PHP 做好“流程编排”和“服务胶水”,把向量生成、存储与检索交给专业工具。以下方案已在生产环境验证,不依赖 PHP 9.0 新特性,兼容现有 Swoole 或传统 FPM 架构。
选对向量数据库,别硬扛
PHP 8.3 不适合直接实现向量索引(如 HNSW、IVF),应选用成熟、HTTP 友好、轻量部署的向量数据库:
-
Weaviate:纯 Go 编写,单二进制启动快,提供 REST/GraphQL 接口,PHP 用
curl或 Guzzle 即可调用;支持自动 schema 推断、语义过滤、混合检索(关键词+向量);Verba 就是基于它构建的 RAG 引擎 -
Qdrant:Rust 开发,性能强,Docker 一键拉起,API 设计简洁,有官方 PHP SDK(
qdrant/php-client),支持 payload 过滤和点积/余弦相似度 - 避免 Milvus:虽功能强,但依赖 etcd/Pulsar/MinIO,本地开发调试成本高,8.3 项目初期没必要上云原生复杂度
文本向量化交给专用服务
PHP 不做 embedding 计算,而是调用轻量模型服务:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 用 Ollama 本地跑
all-minilm:l6-v2或nomic-embed-text:启动命令ollama run nomic-embed-text,再通过 HTTP POST 向http://localhost:11434/api/embeddings提交文本,返回向量数组 - 或用 SentenceTransformers + FastAPI 封装一个嵌入服务(Python 写,PHP 只负责请求),比在 PHP 中加载 PyTorch 更稳定
- 切记:不要在 PHP 中用
ext-tensor或 ONNX 运行大模型——8.3 生态缺乏生产级推理支持,易 OOM 或超时
PHP 层专注 RAG 流程串联
你的 PHP 代码主要完成三件事:文档解析 → 向量写入 → 检索增强调用 LLM:
立即学习“PHP免费学习笔记(深入)”;
-
解析与分块:用
setasign/fpdf2读 PDF,phpoffice/phpword读 DOCX,配合text-splitter库按 256 token 切段,每段加 source 文件名、页码等元数据 -
写入向量库:将每段文本 + 元数据 POST 到 Weaviate 的
/v1/batches/objects接口;一次批量提交 100 条,避免高频请求 -
RAG 查询逻辑:用户提问 → 调 Ollama 获取 query 向量 → 请求 Weaviate
/v1/graphql执行近邻搜索(带where过滤文档类型)→ 拼接 top-3 片段 → 注入 prompt → 调用本地 LLM API(如 Ollama 的/api/chat)
缓存与容错要前置设计
PHP 8.3 项目容易因网络抖动导致 RAG 响应失败,需主动兜底:
- 用 Redis 缓存「问题 → 向量」映射,相同问法跳过重复 embedding 计算
- 向量库查询设 1.5s 超时,超时后降级为关键词全文检索(Weaviate 支持
bm25:语法) - LLM 响应流式返回时,用
ob_flush()+flush()推送 chunk,配合前端 SSE,避免 FPM 请求被 Nginx 中断


















