PHP不生成笔记,只负责调用AI、存储结果和切分重组;AI理解语义并生成Anki卡片,PHP仅清洗格式、统一换行符、提取Q&A对并确保标签紧贴A末尾。

PHP 本身不生成笔记,它只做三件事:把原始文本喂给 AI、把返回结果存下来、按需切分重组。想靠 file_put_contents() 直接产出知识卡片,得先明确谁在“理解”——是 PHP 还是 AI?答案永远是后者。
PHP 调用 OpenAI / Ollama 生成卡片时,必须手动构造 messages 结构
别信 SDK 自动拼 messages 数组。OpenAI 的 /chat/completions 接口要求 messages 是严格数组,每项含 role 和 content。常见错误是把整段提示词当 content 丢进去,却漏掉 role: "user",导致返回空或格式错乱。
- 正确写法:
["role" => "user", "content" => "请将以下文字转为Anki Q&A格式:..."] - 若要保留原文语义精度,
content里不要塞指令+文本混合体;先用一个请求让 AI 提炼要点,再用第二个请求转格式 - Ollama 本地调用走
http://localhost:11434/api/chat,body 同样要带messages,但model字段必须显式传"phi-3"或"llama3",漏了会 404
生成 Anki 兼容卡片时,PHP 只负责清洗和分隔,不参与语义判断
AI 返回的 “Q: … A: … #tag” 文本常混有 Markdown、编号、多余空行。PHP 的任务不是“理解哪句是问题”,而是用 preg_split() 或 explode() 拆出成对字段,并确保换行符统一为 \n —— Anki 导入 CSV 时只认 LF,Windows 的 CRLF 会导致字段错位。
- 用
str_replace(["\r\n", "\r"], "\n", $raw)预处理 - 匹配
Q:和A:建议用preg_match_all('/Q:(.*?)A:(.*?)(?=#|\n\n|\z)/s', $clean, $matches),避免跨段捕获 - 标签部分(
#chapter2)必须紧贴 A 内容末尾,中间不能有空格,否则 Anki 解析失败
本地运行模型时,proc_open() 启动失败的典型原因
直接 exec('ollama run phi-3') 必卡死,因为 ollama CLI 默认交互式等待 stdin,而 PHP 不提供 TTY。要用 proc_open() 显式接管流控,否则进程挂起,超时后 proc_terminate() 也杀不干净。
立即学习“PHP免费学习笔记(深入)”;
- 必须配
['pipe' => ['r', 'w', 'w']],其中第三个w是 stderr,用来捕获 “loading model…” 日志 - 写完 prompt 后要
fclose($pipes[0]),否则模型等不到 EOF 不响应 - 读取前设
stream_set_timeout($pipes[1], 30),避免模型加载慢时 PHP 死等
最易被忽略的是:AI 生成的卡片质量取决于输入文本的颗粒度。扔进一整章 PDF,得到的 Q&A 往往跨概念、缺上下文锚点;而按小节切分 + 标注页码区间(如“P45–P48”),才能让 AI 输出可追溯、可验证的卡片。PHP 不解决这个问题,但它能帮你自动化切分和批量提交——这才是它该干的活。



















