不能。PHP缺乏内置embedding能力、成熟向量数据库驱动及语义感知切分逻辑,仅适合作为流程编排“胶水”,需依赖Python服务或托管API完成切分与向量化。

PHP 8.5.7 能否直接做 RAG 文档切分与向量化?
不能。PHP 本身没有内置的文本嵌入(embedding)能力,也没有成熟的向量数据库驱动或分词切块逻辑——它不是为这类任务设计的语言。你真正需要的是:用 PHP 做流程编排和 API 调度,把耗时、计算密集的切分和向量化交给专用服务(比如 Python 的 langchain + chromadb,或托管 API 如 OpenAI / Ollama / Voyage AI)。PHP 在这里的角色是“胶水”,不是“引擎”。
文档切分必须自己写 str_split 或 preg_split 吗?
不推荐。简单按字符或标点硬切会破坏语义边界,导致 chunk 不可检索。RAG 效果差,90% 源于 bad chunking。你应该:
- 优先用现成的、语义感知的切分器,比如 Python 的
RecursiveCharacterTextSplitter(来自langchain),它会按\n\n→\n→→ 字符逐级回退,保留段落结构 - 若必须 PHP 端预处理,至少按自然段落切(
explode("\n\n", $text)),再对超长段落用wordwrap($para, 256, "\n", true)拆分,而非str_split($text, 256) - 务必保留元数据:原始文件名、页码(如 PDF 提取时)、切块序号,后续召回时靠这个定位来源
向量化环节 PHP 怎么调用外部模型?
走 HTTP API 是唯一可行路径。PHP 用 curl 或 file_get_contents 发请求,关键注意三点:
- OpenAI 的
/v1/embeddings接口要求input是字符串数组,单次最多 2048 token,PHP 传参必须是json_encode(['input' => $chunks]),别漏了Content-Type: application/json - Ollama 本地运行时,默认 endpoint 是
http://localhost:11434/api/embeddings,body 格式是json_encode(['model' => 'nomic-embed-text', 'input' => $chunk])—— 注意它是单条输入,不是批量,循环调用需加usleep(10000)防限流 - 响应体里向量在
$response->embedding(OpenAI)或$response->embedding(Ollama),不是data下,解析前先json_decode($json, true)并检查isset($data['embedding'])
向量存到 MySQL 能行吗?
能存,但不建议用于生产 RAG。MySQL 8.0.30+ 支持 VECTOR 类型和 KNN 搜索,但实际遇到的问题很具体:
立即学习“PHP免费学习笔记(深入)”;
-
INSERT时要把 float 数组转成JSON_ARRAY_PACK或 base64 编码的 binary,PHP 侧得手动pack('f*', ...$vector),读取时再unpack('f*', $binary),极易出错 -
ORDER BY L2_DISTANCE(col, ?) LIMIT 5在千级向量下尚可,万级以上延迟飙升,且不支持过滤(比如“只搜 PDF 来源”) - 真正省心的选择是:用
ChromaDB(HTTP mode)或Qdrant(PHP 客户端有qdrant-php包),它们原生支持 metadata 过滤 + 混合搜索 + 动态 schema
PHP 写入库逻辑很简单:$client->addPoints(...),但前提是你的向量服务已跑起来——别指望仅靠 PHP 和 MySQL 搭出可靠 RAG。



















