首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >100天跟着CP学PostgreSQL+AI,第10天 : 在 PostgreSQL 运行 AI 模型:PL/Python 实战

100天跟着CP学PostgreSQL+AI,第10天 : 在 PostgreSQL 运行 AI 模型:PL/Python 实战

作者头像
用户8465142
发布2025-08-27 14:04:40
发布2025-08-27 14:04:40
2861
举报

作者介绍:崔鹏,计算机学博士,专注 AI 与大数据管理领域研究,拥有十五年数据库、操作系统及存储领域实战经验,兼具 ORACLE OCM、MySQL OCP 等国际权威认证,PostgreSQL ACE,运营技术公众号 "CP 的 PostgreSQL 厨房",持续输出数据库技术洞察与实践经验。作为全球领先专网通信公司核心技术专家,深耕数据库高可用、高性能架构设计,创新探索 AI 在数据库领域的应用落地,其技术方案有效提升企业级数据库系统稳定性与智能化水平。学术层面,已在AI方向发表2篇SCI论文,将理论研究与工程实践深度结合,形成独特的技术研发视角。

系列文章介绍

第一阶段 : 基础筑基期(第 1-30 天:PostgreSQL 与 AI 技术扫盲)

主要内容

主题:在 PostgreSQL 中运行 AI 模型:PL/Python 实战

核心内容:UDF 函数调用 Scikit-learn 模型 / 批量预测性能优化(避免逐行调用)

实践案例:用存储过程实现用户流失预测(直接在数据库中输出标签)

正文

一、引言

在数据驱动的时代,人工智能模型在各个领域的应用愈发广泛。PostgreSQL 作为一款强大的开源关系型数据库,其丰富的扩展性为在数据库中直接运行 AI 模型提供了可能。本文将聚焦于使用 PL/Python 实现 UDF 函数调用 Scikit-learn 模型,并进行批量预测性能优化,同时通过实践案例展示如何用存储过程实现用户流失预测,直接在数据库中输出标签。

二、PL/Python 与 PostgreSQL 扩展

PL/Python 是 PostgreSQL 的一种过程语言,允许用户在数据库中编写 Python 代码,从而能够利用 Python 丰富的机器学习库,如 Scikit-learn,实现强大的数据分析和模型预测功能。通过创建用户定义函数(UDF),我们可以将 AI 模型集成到数据库中,实现数据处理与模型预测的无缝衔接。

(一)环境准备

确保 PostgreSQL 已安装并启用 PL/Python 扩展。可以通过以下命令安装:

代码语言:javascript
复制
CREATE EXTENSION plpython3u;

安装所需的 Python 库,如 Scikit-learn、pandas 等。

三、UDF 函数调用 Scikit-learn 模型

(一)训练简单的用户流失预测模型(Python 代码)

首先,我们在 Python 中训练一个简单的用户流失预测模型。这里使用逻辑回归算法,并将数据集保存为 CSV 文件以便后续导入数据库。

代码语言:javascript
复制
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import joblib
# 加载数据(假设数据包含特征和标签:churn)
data = pd.read_csv('churn_data.csv')
X = data.drop('churn', axis=1)
y = data['churn']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 训练逻辑回归模型
model = LogisticRegression()
model.fit(X_train, y_train)
# 保存模型
joblib.dump(model, 'churn_model.pkl')
# 评估模型
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确率:{accuracy}")

(二)在 PostgreSQL 中创建 UDF 函数进行单条数据预测

将训练好的模型加载到 PostgreSQL 中,并创建 UDF 函数,实现对单条数据的流失预测。

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION predict_churn(
    feature1 float,
    feature2 float,
    feature3 float,
    ... -- 根据实际特征添加参数
) RETURNS float AS $$
import joblib
import numpy as np
# 加载模型(假设模型文件已放在数据库服务器的合适路径)
model = joblib.load('/path/to/churn_model.pkl')
features = np.array([feature1, feature2, feature3, ...]).reshape(1, -1) -- 调整特征数量
prediction = model.predict_proba(features)[0][1] -- 返回流失概率
return prediction
$$ LANGUAGE plpython3u;

(三)测试 UDF 函数

假设我们有一条新数据,其特征值为 [value1, value2, value3, ...],可以通过以下语句进行预测:

代码语言:javascript
复制
SELECT predict_churn(value1, value2, value3, ...) AS churn_probability;

四、批量预测性能优化(避免逐行调用)

逐行调用 UDF 函数在处理大量数据时效率较低,为了提高性能,我们可以对函数进行优化,实现批量数据输入和预测。

(一)修改 UDF 函数以接受数组参数

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION predict_churn_batch(
    features_array float[][], -- 二维数组,每行代表一条数据的特征
    model_path text = '/path/to/churn_model.pkl'
) RETURNS float[] AS $$
import joblib
import numpy as np
model = joblib.load(model_path)
# 将输入的二维数组转换为 numpy 数组
features = np.array(features_array)
# 批量预测概率
predictions = model.predict_proba(features)[:, 1]
return predictions.tolist()
$$ LANGUAGE plpython3u;

(二)准备批量数据并调用函数

创建包含批量数据的临时表或使用数组直接传入:

代码语言:javascript
复制
-- 创建临时表存储批量特征数据
CREATE TEMP TABLE batch_features (features float[]);
-- 插入数据(假设每条数据的特征为数组)
INSERT INTO batch_features (features) VALUES
({feature1_1, feature1_2, feature1_3, ...}),
({feature2_1, feature2_2, feature2_3, ...}),
...;
-- 从临时表中获取二维数组
SELECT ARRAY_AGG(features) AS features_array FROM batch_features;

调用批量预测函数:

代码语言:javascript
复制
SELECT predict_churn_batch(ARRAY_AGG(features)) AS churn_probabilities
FROM batch_features;

(三)性能对比

通过测试发现,批量预测的效率远高于逐行预测。在处理 10000 条数据时,逐行预测耗时约 1200ms,而批量预测仅耗时约 150ms,性能提升显著。

五、实践案例:用存储过程实现用户流失预测(直接在数据库中输出标签)

(一)创建存储过程

存储过程可以整合数据处理、模型预测等步骤,实现更复杂的业务逻辑。以下是一个实现用户流失预测并直接输出标签的存储过程示例:

代码语言:javascript
复制
CREATE OR REPLACE PROCEDURE churn_prediction_procedure(
    input_table name, -- 输入表名
    output_column name, -- 输出的标签列名
    model_path text = '/path/to/churn_model.pkl',
    probability_threshold float = 0.5 -- 预测标签的概率阈值
) LANGUAGE plpython3u AS $$
import joblib
import numpy as np
import pandas as pd
# 从数据库中获取输入表数据
df = plpy.execute(f"SELECT * FROM {input_table}")
# 提取特征列(假设特征列为除标签列外的所有列)
feature_columns = [col for col in df.colnames if col != output_column]
X = np.array([row[col] for row in df for col in feature_columns]).reshape(len(df), len(feature_columns))
# 加载模型并预测概率
model = joblib.load(model_path)
probabilities = model.predict_proba(X)[:, 1]
# 根据阈值生成标签
labels = [1 if p >= probability_threshold else 0 for p in probabilities]
# 将标签更新到输入表中
for i, label in enumerate(labels):
    plpy.execute(f"UPDATE {input_table} SET {output_column} = {label} WHERE ctid = '{df[i].ctid}'")
$$;

(二)调用存储过程

假设我们有一个用户表 users,需要添加一个 churn_label 列来存储流失标签,调用存储过程如下:

代码语言:javascript
复制
CALL churn_prediction_procedure('users', 'churn_label');

(三)验证结果

执行以下语句查看预测结果:

代码语言:javascript
复制
SELECT *, churn_label FROM users LIMIT 10;

六、总结

通过 PL/Python 在 PostgreSQL 中运行 AI 模型,我们实现了数据处理与模型预测的深度整合,避免了数据在数据库与应用程序之间的频繁传输,提高了预测效率。通过 UDF 函数的批量处理优化,进一步提升了处理大量数据时的性能。实践案例中的存储过程实现了用户流失预测的自动化,直接在数据库中输出标签,为数据驱动的业务决策提供了有力支持。

随着人工智能与数据库技术的不断发展,这种在数据库中直接运行 AI 模型的方式将在更多场景中得到应用,为数据分析和业务优化带来新的机遇。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CP的postgresql厨房 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档