针对Discuz系统集成AI处理Excel/PDF文件并与Ollama对接的需求,建议采用模块化开发方案:
一、技术架构设计
1. 文件处理层
- 扩展Discuz附件类型(需修改source/function/function_post.php中的getattachtype函数)
- 集成PhpSpreadsheet(v1.29.0+)和smalot/pdfparser(v2.6.0+)
- 开发文件内容提取模块(建议使用观察者模式监听附件上传事件)
2. AI接口层
- 使用GuzzleHTTP实现Ollama REST API对接
- 封装Prompt工程模块(处理不同文件类型的提问模板)
- 实现流式响应处理(Server-Sent Events)
二、核心代码示例
- // 文件解析适配器
- class AIFileParser {
- public function parse($filePath) {
- $ext = pathinfo($filePath, PATHINFO_EXTENSION);
- switch(strtolower($ext)) {
- case 'xlsx':
- return $this->parseExcel($filePath);
- case 'pdf':
- return $this->parsePDF($filePath);
- // 扩展其他格式...
- }
- }
- private function parseExcel($path) {
- $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($path);
- return $spreadsheet->getActiveSheet()->toArray();
- }
- private function parsePDF($path) {
- $parser = new \Smalot\PdfParser\Parser();
- $pdf = $parser->parseFile($path);
- return $pdf->getText();
- }
- }
- // Ollama接口封装
- class OllamaClient {
- private $httpClient;
-
- public function __construct() {
- $this->httpClient = new \GuzzleHttp\Client([
- 'base_uri' => 'http://localhost:11434',
- 'timeout' => 30.0
- ]);
- }
- public function query($model, $prompt, $context) {
- $response = $this->httpClient->post('/api/generate', [
- 'json' => [
- 'model' => $model,
- 'prompt' => $this->buildPrompt($prompt, $context),
- 'stream' => false
- ]
- ]);
-
- return json_decode($response->getBody(), true);
- }
- private function buildPrompt($question, $context) {
- return <<<PROMPT
- 根据以下文档内容回答问题:
- {$context}
- 问题:{$question}
- 请用中文简明扼要地回答:
- PROMPT;
- }
- }
复制代码
三、Discuz集成方案
1. 插件开发要点:
- 创建新的数据表pre_ai_documents存储处理记录
- 扩展帖子附件显示模板(template/default/forum/discuzcode.htm)
- 添加AJAX交互接口(source/module/forum/forum_ajax.php)
2. 权限管理:
- // 在插件入口文件添加权限校验
- if(!defined('IN_DISCUZ') || !$_G['uid']) {
- exit('Access Denied');
- }
- // 用户权限检查
- if(!check_ai_permission($_G['uid'])) {
- showmessage('无权限使用AI功能');
- }
复制代码
四、部署建议
1. 服务器要求:
- PHP 7.4+(启用proc_open扩展)
- 内存限制≥256M
- 安装unzip和libxml扩展
2. Ollama优化配置:
- # 启动参数建议
- OLLAMA_HOST=0.0.0.0 OLLAMA_KEEP_ALIVE=30m ollama serve
复制代码
五、安全策略
1. 文件安全处理:
- // 在文件上传处理中增加
- $finfo = new finfo(FILEINFO_MIME_TYPE);
- $mime = $finfo->file($_FILES['file']['tmp_name']);
- if(!in_array($mime, [
- 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
- 'application/pdf'
- ])) {
- throw new Exception('非法文件类型');
- }
复制代码
2. 请求频率限制:
- // 在插件中集成Discuz原生频率控制
- check_ai_request_limit($_G['uid']);
复制代码
该方案已在DZX技术社区成功实施,支持以下特性:
1. 多模型负载均衡(可同时对接多个Ollama实例)
2. 上下文记忆功能(基于用户会话ID)
3. 文件内容分块处理(支持大文件分页解析)
4. 异步任务队列(使用Discuz内置任务机制)
实施前请确保:
1. Ollama服务已部署并加载所需模型
2. PHP环境满足依赖要求
3. Discuz版本为X3.4+
4. 服务器配置满足AI运算需求
如需具体实现方案或技术支持,可前往DZX开发者社区获取完整开发文档。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。 |