本地大模型搭配CMS,网站AI问答功能开发
想在网站上加入AI问答功能,又不想依赖外部API?用本地大模型搭配CMS自己开发,既能保护数据隐私,又能省去调用费用。这篇教程从零开始,带你完成环境搭建、接口编写到CMS嵌入的全过程,最终实现一个能回答访客问题的智能问答模块。
## 先搞清楚:你的服务器能跑得动吗
本地大模型对硬件有要求,动手前先确认配置。
- **CPU**:建议4核以上,支持AVX指令集。
- **内存**:至少8GB,推荐16GB。7B参数模型量化后约需4-6GB内存。
- **硬盘**:预留10GB以上空间存放模型文件。
- **操作系统**:Ubuntu 20.04/22.04或CentOS 7+,本文以Ubuntu 22.04为例。
如果服务器配置较低,可以选择更小的模型(如Qwen2.5-1.5B或Phi-3-mini),运行速度会快很多。
## 部署本地大模型推理服务
我们选用Ollama作为推理引擎,它安装简单,支持多种开源模型。
### 安装Ollama
在终端执行以下命令:
```bash
curl -fsSL https://ollama.com/install.sh | sh
```
安装完成后,启动服务并设置开机自启:
```bash
sudo systemctl enable ollama
sudo systemctl start ollama
```
验证服务是否正常:
```bash
curl http://localhost:11434/api/tags
```
如果返回JSON格式的模型列表(可能为空),说明服务已运行。
### 下载并测试模型
拉取一个轻量级中文模型,例如Qwen2.5-7B的量化版本:
```bash
ollama pull qwen2.5:7b
```
下载完成后,测试模型是否能正常回答:
```bash
ollama run qwen2.5:7b "你好,请介绍一下你自己"
```
看到模型返回文本,说明本地大模型已就绪。
## 编写AI问答接口
CMS需要通过网络请求调用模型,我们写一个简单的PHP接口作为中转。
在网站根目录创建`ai_api.php`,内容如下:
```php
'消息不能为空']);
exit;
}
$data = [
'model' => 'qwen2.5:7b',
'prompt' => $userMessage,
'stream' => false
];
$ch = curl_init('http://localhost:11434/api/generate');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
$answer = $result['response'] ?? '抱歉,暂时无法回答。';
echo json_encode(['answer' => $answer]);
```
**注意**:`qwen2.5:7b`需替换为你实际拉取的模型名称。接口文件应放在网站可访问目录,但建议通过Nginx限制只允许内部调用或添加简单鉴权。
## 在CMS中嵌入问答界面
不同CMS嵌入方式不同,这里以通用方法为例,在主题模板中添加一个问答区块。
### 添加前端HTML和JavaScript
在需要显示问答的页面模板中,加入以下代码:
```html
```
如果使用WordPress,可以将这段代码放入主题的`functions.php`中通过短代码输出,或直接编辑模板文件。
### 样式微调
简单加一些CSS让界面更友好:
```css
#ai-chat { border: 1px solid #ddd; padding: 15px; border-radius: 8px; max-width: 600px; }
#chat-messages { height: 300px; overflow-y: auto; margin-bottom: 10px; background: #f9f9f9; padding: 10px; }
#chat-input { width: 70%; padding: 8px; }
#ai-chat button { padding: 8px 20px; }
```
## 避坑指南:这些地方容易出错
- **模型响应慢**:7B模型在CPU上生成128个token可能需要10-20秒。如果访客等待时间过长,可以换用更小模型,或限制回答长度(在API请求中加`"num_predict": 128`)。
- **接口超时**:PHP默认执行时间可能只有30秒,在`ai_api.php`开头加`set_time_limit(120);`。
- **跨域问题**:如果前端和接口不同域,需要在接口中添加`header('Access-Control-Allow-Origin: *');`,但建议指定具体域名。
- **内存不足**:Ollama运行中若报内存错误,尝试量化等级更高的模型,如`qwen2.5:7b-q4_K_M`。
- **安全风险**:接口不要暴露敏感信息,避免被恶意调用。可以加一个简单的token验证,或限制IP访问。
## 验证效果与后续优化
完成以上步骤后,访问包含问答界面的页面,输入问题测试。如果AI能正确回答,说明本地大模型搭配CMS的网站AI问答功能已开发成功。
若回答不理想,可以从这些方面优化:
- **调整提示词**:在`ai_api.php`的prompt前加上系统指令,例如“你是一个网站客服助手,请用简洁的中文回答”。
- **启用流式输出**:将`stream`设为`true`,前端用EventSource接收,实现打字机效果,提升体验。
- **知识库增强**:如果需要回答特定领域问题,可以结合RAG技术,先从网站内容中检索相关段落,再交给模型生成答案。
**关键结论**:本地大模型搭配CMS开发AI问答,核心是让Ollama提供推理API,CMS通过PHP中转调用,前端用JavaScript交互。整个过程不依赖外部服务,数据完全自主可控。
## 常见疑问
**问:一定要用Ollama吗?**
答:不是。也可以用LocalAI、FastChat等,原理类似。Ollama安装最简单,适合新手。
**问:模型回答速度太慢怎么办?**
答:优先换用更小的模型(如1.5B参数),或者升级服务器CPU/内存。GPU加速效果显著,但成本较高。
**问:CMS有缓存插件会影响吗?**
答:问答接口是动态请求,通常不会被缓存。但如果页面本身被缓存,确保问答区块通过AJAX加载,而不是静态输出。
**问:如何限制每个访客的提问频率?**
答:可以在`ai_api.php`中基于IP或session做简单计数,例如每分钟最多5次,防止滥用。
按照本文步骤操作,你应该已经让网站拥有了一个本地AI问答功能。过程中如果遇到报错,先检查Ollama服务是否运行、模型名称是否正确、PHP的curl扩展是否开启。