如何借助MindsDB实现OpenAI基于自有问答表作答(PHP环境)
实现方案:PHP + MindsDB + OpenAI 基于自有问答表回答问题
一、先解决MindsDB模型创建失败问题(核心前提)
要让OpenAI基于你的问答表回答,首先得在MindsDB中完成数据连接和RAG模型创建:
- 连接你的业务数据库
在MindsDB Studio或CLI中执行SQL,将你的问答数据表接入MindsDB(以MySQL为例):
- 连接你的业务数据库
CREATE DATABASE my_qna_db WITH ENGINE = 'mysql', PARAMETERS = { "host": "你的数据库IP", "port": 3306, "user": "数据库用户名", "password": "数据库密码", "database": "存储问答表的库名" };
执行后验证连接:SELECT * FROM my_qna_db.your_qna_table LIMIT 1;,能返回数据则连接成功。
- 创建OpenAI驱动的问答模型
先确保MindsDB已配置OpenAI密钥(可在MindsDB设置页或通过SQL配置),然后创建模型:
- 创建OpenAI驱动的问答模型
CREATE MODEL mindsdb.qna_chatbot PREDICT answer USING engine = 'openai', model_name = 'gpt-3.5-turbo', api_key = '你的OpenAI API密钥', prompt_template = '基于以下已知问答内容回答用户问题:{{your_qna_table.question}} -> {{your_qna_table.answer}}。用户问题:{{question}}。请严格基于提供的内容回答,不要添加外部信息。', question_column = 'question', answer_column = 'answer';
替换your_qna_table为你的数据表名,执行后等待模型状态变为complete,可通过SELECT * FROM mindsdb.models WHERE name='qna_chatbot';查看状态。
二、PHP服务端调用MindsDB实现问答
PHP端可通过两种方式调用MindsDB模型,任选其一即可:
方式1:通过MySQL协议调用(用PDO)
MindsDB兼容MySQL协议,直接用PDO连接调用:
<?php // 连接MindsDB(默认端口47335) $dsn = 'mysql:host=localhost;port=47335;dbname=mindsdb'; $username = 'mindsdb'; $password = ''; // 若MindsDB配置了密码则填写 try { $pdo = new PDO($dsn, $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 获取用户问题(示例从POST获取,可根据业务调整) $userQuestion = $_POST['user_question'] ?? ''; if (empty($userQuestion)) { throw new Exception('请输入问题'); } // 调用MindsDB模型生成回答 $sql = "SELECT answer FROM mindsdb.qna_chatbot WHERE question = :question"; $stmt = $pdo->prepare($sql); $stmt->bindParam(':question', $userQuestion); $stmt->execute(); $result = $stmt->fetch(PDO::FETCH_ASSOC); $answer = $result['answer'] ?? '暂无匹配的回答内容'; // 返回JSON结果给前端 header('Content-Type: application/json'); echo json_encode(['answer' => $answer]); } catch(PDOException $e) { header('Content-Type: application/json'); echo json_encode(['error' => '服务端错误:' . $e->getMessage()]); } catch(Exception $e) { header('Content-Type: application/json'); echo json_encode(['error' => $e->getMessage()]); } ?>
方式2:通过HTTP API调用(用cURL)
若更习惯HTTP请求,直接调用MindsDB的API接口:
<?php $userQuestion = $_POST['user_question'] ?? ''; if (empty($userQuestion)) { echo json_encode(['error' => '请输入问题']); exit; } $apiUrl = 'http://localhost:47334/api/sql/query'; // MindsDB默认HTTP端口47334 $payload = [ 'query' => "SELECT answer FROM mindsdb.qna_chatbot WHERE question = '$userQuestion'" ]; $ch = curl_init($apiUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload)); $response = curl_exec($ch); curl_close($ch); $result = json_decode($response, true); $answer = isset($result['data'][0]['answer']) ? $result['data'][0]['answer'] : '暂无匹配的回答内容'; header('Content-Type: application/json'); echo json_encode(['answer' => $answer]); ?>
三、关键注意事项
- 确保MindsDB服务正常运行,端口(47335/47334)未被防火墙拦截
- OpenAI API密钥需有可用额度,且模型权限正常
- 问答表的字段名要与模型创建时的
question_column、answer_column严格对应 - 若模型创建仍失败,查看MindsDB日志(默认路径
/var/log/mindsdb/)排查具体错误
内容的提问来源于stack exchange,提问作者MANIKANDAN A
相关产品推荐
相关产品推荐

