超越 ChatGPT:使用 OpenAI API 可以构建的秘密且出人意料的强大功能
大多数人想到 OpenAI API 时,会想象一个文本框:有人输入问题,人工智能返回答案。从技术上说这没错,但这几乎没有触及 API 真正能做的事情。
我在 AlexanderMirvis.com 和 BrooklynNotaryNinjas.com 上以不同的方式使用 OpenAI。我不把人工智能当成网站角落里一个独立的聊天机器人,而是可以让它成为实际软件的一部分。OpenAI 可以在网页发布前检查网页、生成元数据、分析上传的文档、协助进行医学和法律研究、驱动客户服务对话、自动化重复性工作、监控服务器、分析网络安全日志、转录电话、生成语音回复、搜索私有文档集合,并通过受控函数与我的应用程序的其他部分通信。
真正的关键在于理解:OpenAI API 不必成为应用程序本身。它可以成为应用程序内部的智能。
传统的 PHP 应用程序可能包含如下逻辑:
if ($documentType === 'affidavit') {
// Do something
}
启用人工智能的应用程序可以走得更远。我可以向 OpenAI 提供一份上传的文档,并要求它识别文档类型、提取重要日期、识别涉及的人员、总结发生的事情、找出缺失的信息,然后将所有内容作为 PHP 可以处理的结构化数据返回。
这使 OpenAI 从文本生成器变成了更接近智能软件组件的东西。
构建一个中央 OpenAI 函数
对于 PHP 应用程序,我更喜欢使用一个与 OpenAI API 通信的中央服务器端函数。这样,网站的其他部分在需要人工智能时都可以调用该函数。
API 密钥应始终保留在服务器上。绝不能将其放在发送到访客浏览器的 JavaScript 中。
<?php
function openaiResponse(array $payload): array
{
$apiKey = getenv('OPENAI_API_KEY');
if (!$apiKey) {
throw new RuntimeException('OPENAI_API_KEY is not configured.');
}
$ch = curl_init('https://api.openai.com/v1/responses');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey,
'Content-Type: application/json'
],
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_TIMEOUT => 120
]);
$raw = curl_exec($ch);
if ($raw === false) {
throw new RuntimeException(curl_error($ch));
}
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($raw, true);
if ($status >= 400) {
throw new RuntimeException(
$data['error']['message'] ?? 'OpenAI request failed.'
);
}
return $data;
}
基本请求可以这样编写:
$response = openaiResponse([
'model' => 'gpt-5',
'input' => 'Explain what a New York notarial acknowledgment is.'
]);
echo $response['output'][0]['content'][0]['text'] ?? '';
具体模型可以根据任务、期望的速度、推理要求和成本进行更改。重要的架构决策是,所有请求都通过我的服务器完成。浏览器与我的 PHP 应用程序通信,由我的应用程序决定允许执行的操作,然后服务器才与 OpenAI 通信。
这样,我就能控制身份验证、速率限制、安全性、日志记录、权限、计费,以及模型究竟被允许访问哪些信息。
使用 OpenAI 生成标题、元数据并分析每个页面
AlexanderMirvis.com 上最有用的 OpenAI 集成之一是自动进行内容和 SEO 分析。每次发布内容时,我不必再手动编写标题标签、元描述、关键词列表和搜索描述,OpenAI 可以检查实际文章并自动提出这些内容。
关键在于,我并不一定希望 OpenAI 以对话方式回答我。我希望我的 CMS 能够接收可直接存储到数据库中的数据。
例如,我可能希望得到如下所示的响应:
{
"title": "建议的页面标题",
"meta_description": "建议的描述",
"keywords": [
"关键词一",
"关键词二"
],
"seo_score": 84,
"problems": [
"元描述过于含糊"
],
"recommendations": [
"添加更有力的引言段落"
]
}
我可以向 API 请求结构化输出,而不是任意的散文式文本。
$pageText = strip_tags($pageHtml);
$response = openaiResponse([
'model' => 'gpt-5',
'instructions' => '
你是 AlexanderMirvis.com 的 SEO 分析引擎。
分析所提供的网页。
不要使用标题党手法。
不要捏造事实。
标题必须准确描述文章。
检查:
标题,
主题清晰度,
搜索意图,
关键词使用情况,
文章结构,
内部链接机会,
可读性,
元数据质量
以及看起来重复的部分。
',
'input' => $pageText,
'text' => [
'format' => [
'type' => 'json_schema',
'name' => 'seo_analysis',
'strict' => true,
'schema' => [
'type' => 'object',
'properties' => [
'title' => [
'type' => 'string'
],
'meta_description' => [
'type' => 'string'
],
'keywords' => [
'type' => 'array',
'items' => [
'type' => 'string'
]
],
'seo_score' => [
'type' => 'integer',
'minimum' => 0,
'maximum' => 100
],
'problems' => [
'type' => 'array',
'items' => [
'type' => 'string'
]
],
'recommendations' => [
'type' => 'array',
'items' => [
'type' => 'string'
]
]
],
'required' => [
'title',
'meta_description',
'keywords',
'seo_score',
'problems',
'recommendations'
],
'additionalProperties' => false
]
]
]
]);现在,CMS 可以自动保存结果,而不再需要我手动复制粘贴。
$analysisJson =
$response['output'][0]['content'][0]['text'];
$seo = json_decode($analysisJson, true);
$stmt = $pdo->prepare("
UPDATE posts
SET
meta_title = ?,
meta_description = ?,
seo_score = ?
WHERE id = ?
");
$stmt->execute([
$seo['title'],
$seo['meta_description'],
$seo['seo_score'],
$postId
]);
我可以将这项功能扩展得远不止生成标题。OpenAI 可以检查标题、标题层级、正文、图片描述、URL 别名、分类、关键词、内部链接,甚至判断文章是否真正兑现了标题所作的承诺。
我的 CMS 可以显示类似这样的内容:
SEO SCORE: 82 / 100
Strong Points:
The article clearly explains the main subject.
The primary topic appears early.
The heading structure is logical.
Problems:
The meta description is too generic.
There is no internal link to a related article.
Two headings discuss nearly identical material.
Suggested Title:
How Remote Online Notarization Actually Works in New York
在发布前自动分析文章
另一个实用技巧是将 OpenAI 直接连接到发布工作流。CMS 无需我记得点击 AI 按钮,而是在页面状态从草稿变为已发布时自动进行分析。
if ($oldStatus === 'draft' && $newStatus === 'published') {
$seo = analyzePageWithOpenAI($post);
saveSeoAnalysis(
$post['id'],
$seo
);
if ($seo['seo_score'] < 60) {
createAdminWarning(
'This article has significant SEO problems.'
);
}
}
此时,OpenAI 就成了发布流程的一部分,而不再是独立于 CMS 之外的工具。
使用 OpenAI 生成内容
内容生成可能是 OpenAI 最显而易见的用途,但同时也是最容易实施不当的功能之一。让人工智能简单地“写一篇关于网络安全的文章”,通常会生成千篇一律的内容,因为几乎没有为模型提供任何编辑指导。
更好的方法是提供一份编辑规范,说明网站、受众、语调、格式要求和事实限制。
对于 AlexanderMirvis.com,我可以使用类似这样的提示:
$prompt = <<<PROMPT
为 AlexanderMirvis.com 撰写一篇详细的文章。
主题:
{$topic}
受众:
对技术感兴趣、但可能不是软件工程师的读者。
要求:
使用普通段落。
用通俗易懂的英语解释技术概念。
包含实际示例。
避免虚构引语。
不要编造统计数据。
在适当的地方使用标题。
仅在确实有帮助时加入代码。
不要让文章听起来像营销文案。
返回适合插入 CMS 文章正文的 HTML。
不要包含 html、head 或 body 标签。
PROMPT;
$response = openaiResponse([
'model' => 'gpt-5',
'input' => $prompt
]);
对于 BrooklynNotaryNinjas.com,指令则可以完全不同。
$prompt = <<<PROMPT
为 BrooklynNotaryNinjas.com 创建一篇面向消费者的信息文章。
主题:
{$topic}
用简单易懂的语言解释这一主题。
不要提供法律建议。
区分公证员的职责与律师的职责。
不要声称公证能够证明文件内容的真实性。
不要编造法律要求。
当某项要求不确定时,明确说明应当独立进行核实。
使用完整的段落。
PROMPT;
模型可能相同,但这些指令会将其转变为完全不同的应用。
我还可以为 CMS 提供 Rewrite、Expand、Shorten、Simplify、Make Technical、Generate FAQ、Generate Summary、Generate SEO、Translate、Analyze Arguments 和 Identify Claims That Need Verification 等单独的 AI 功能。
这实际上将 OpenAI 变成了一个智能编辑工具栏。
上传文档供 AI 分析
文档分析是 OpenAI API 尤其有用的领域。网站可以允许用户上传 PDF、Word 文档或其他受支持的文件,然后要求 OpenAI 分析其中的实际内容。
这对于医疗记录、法律文件、合同、诉状、事故报告、研究论文、宣誓书、文字记录、发票、商业记录、保险文件、保单以及许多其他类型的文件都很有用。
第一步是将文件上传到 OpenAI。
<?php
function uploadToOpenAI(string $path): array
{
$apiKey = getenv('OPENAI_API_KEY');
$ch = curl_init(
'https://api.openai.com/v1/files'
);
$post = [
'purpose' => 'user_data',
'file' => new CURLFile(
$path,
mime_content_type($path),
basename($path)
)
];
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiKey
],
CURLOPT_POSTFIELDS => $post
]);
$raw = curl_exec($ch);
if ($raw === false) {
throw new RuntimeException(
curl_error($ch)
);
}
curl_close($ch);
return json_decode($raw, true);
}
上传完成后:
$file = uploadToOpenAI(
$_FILES['document']['tmp_name']
);
$fileId = $file['id'];
然后就可以将上传的文件提供给模型。
$response = openaiResponse([
'model' => 'gpt-5',
'input' => [
[
'role' => 'user',
'content' => [
[
'type' => 'input_file',
'file_id' => $fileId
],
[
'type' => 'input_text',
'text' => '
分析此文档。
识别:
1. 文档类型。
2. 重要日期。
3. 重要人物或实体。
4. 主要事实发现。
5. 内部不一致之处。
6. 重要缺失信息。
7. 值得进一步调查的问题。
将文档中包含的事实与
你的解读分开。
'
]
]
]
]
]);
这远远超出了普通的文本提取。该应用程序并不是简单地读取 PDF 中的文字,而是要求 OpenAI 理解这些文字在上下文中的含义。
医疗记录分析
一个显而易见的应用场景是医疗记录审查。一份大型医疗档案可能包含急诊室记录、诊断影像、手术报告、物理治疗记录、医生检查记录、用药记录以及分散在数百页甚至数千页中的后续治疗建议。
我可以指示 OpenAI 将这些记录整理成按时间顺序排列的医疗时间线。
创建按时间顺序排列的医疗时间线。
对于每次就诊,确定:
日期
医疗服务提供者
主诉
诊断
客观检查结果
影像学检查
医疗程序
药物
限制事项
后续复诊建议
另行确定:
既往病情
新发病情
诊断变化
治疗缺口
相互矛盾的陈述
未解决的建议
不要对患者作出诊断。
明确区分有记录的事实
与分析性观察。
这可以将大量医疗记录转化为更易于审阅的内容。
人工智能不应取代医生、律师或合格的专家,但它对于组织资料、创建时间线、比较文档以及识别值得人工审查的问题而言,可以非常有用。
法律研究与案件分析
同样的架构也可以用于法律文件。与其只是要求 OpenAI 总结诉状,我可以要求它将案件整理成特定类别。
以法律研究助理的身份审阅这些材料。
创建:
事实背景
程序经过
所提出的问题
可能相关的法律
支持各方立场的证据
反对各方立场的证据
未解决的事实问题
潜在研究主题
不要编造案件或引文。
明确指出任何需要
独立法律研究的问题。
这为实际研究提供了起点,同时减少了手动整理文件所需的时间。
创建 Word 文档和 PDF 报告
我通常更倾向于让 OpenAI 创建分析内容,而由我自己的应用程序控制最终文档。这样我就能控制品牌元素、页眉、页码、免责声明、字体排版和布局。
架构如下:
上传的文档
|
v
OpenAI 分析
|
v
结构化 JSON
|
v
PHP
|
v
Word 文档或 PDF
例如,OpenAI 可以返回:
{
"title": "医疗记录审查",
"summary": "摘要放在这里",
"timeline": [],
"findings": [],
"questions": []
}
然后,PHP 可以使用 PHPWord 创建 Word 文档。
composer require phpoffice/phpword
use PhpOffice\PhpWord\PhpWord;
use PhpOffice\PhpWord\IOFactory;
$phpWord = new PhpWord();
$section = $phpWord->addSection();
$section->addTitle(
'医疗记录分析',
1
);
$section->addText(
$analysis['summary']
);
$section->addTitle(
'时间顺序',
2
);
foreach ($analysis['timeline'] as $entry) {
$section->addText(
$entry['date'] . ' - ' .
$entry['provider'],
['bold' => true]
);
$section->addText(
$entry['summary']
);
}
$section->addTitle(
'重要发现',
2
);
foreach ($analysis['findings'] as $finding) {
$section->addListItem($finding);
}
$writer = IOFactory::createWriter(
$phpWord,
'Word2007'
);
$writer->save(
__DIR__ . '/reports/analysis.docx'
);
可以使用 Dompdf 等库创建 PDF。
composer require dompdf/dompdf
use Dompdf\Dompdf;
$html = '
<h1>文档分析</h1>
<p>' .
htmlspecialchars($analysis['summary']) .
'</p>
';
foreach ($analysis['findings'] as $finding) {
$html .=
'<p>' .
htmlspecialchars($finding) .
'</p>';
}
$pdf = new Dompdf();
$pdf->loadHtml($html);
$pdf->render();
file_put_contents(
__DIR__ . '/reports/analysis.pdf',
$pdf->output()
);
这样就将智能与呈现分离开来。OpenAI 负责创建分析,而我自己的软件则决定成品的具体外观。
将私人文档转变为 AI 知识库
如果我有数百或数千份文档,每次回答问题都反复附加每个文件,会非常低效。相反,可以将文档存储在可搜索的知识系统中,并根据其含义进行检索。
这通常称为检索增强生成,即 RAG。
对于 BrooklynNotaryNinjas.com,私有知识集合可以包含服务说明、公司流程、公证参考资料、海牙认证信息、内部指示、客户常见问题以及网站文档。
然后,聊天机器人在回答客户问题时可以搜索这些记录。
$response = openaiResponse([
'model' => 'gpt-5',
'tools' => [
[
'type' => 'file_search',
'vector_store_ids' => [
getenv(
'NOTARY_VECTOR_STORE_ID'
)
]
]
],
'input' =>
'What documents do I need for this service?'
]);
其结果与通用聊天机器人有本质区别。通用聊天机器人了解一般信息。构建得当的企业聊天机器人可以搜索专属于该企业的信息。
BrooklynNotaryNinjas.com 上的 OpenAI 聊天机器人
当聊天机器人能够与实际网站进行交互,而不是简单地生成答案时,其实用性会大幅提升。
我可以提供经过严格控制的服务器端函数,例如:
- get_service_price
- get_business_hours
- lookup_session_status
- check_document_requirements
- create_support_ticket
- find_available_notary
AI 可以判断何时需要调用其中某个函数,而实际操作则由 PHP 执行。
$tools = [
[
'type' => 'function',
'name' => 'get_service_price',
'description' =>
'从网站数据库中获取当前价格。',
'strict' => true,
'parameters' => [
'type' => 'object',
'properties' => [
'service' => [
'type' => 'string'
]
],
'required' => [
'service'
],
'additionalProperties' => false
]
]
];
如果有人询问:
办理海牙认证需要多少钱?
模型无需猜测,也不必依赖过时的训练信息。它可以从我的应用程序中请求实际价格。
$stmt = $pdo->prepare(
'SELECT price
FROM services
WHERE slug = ?'
);
$stmt->execute([
'apostille'
]);
$price = $stmt->fetchColumn();
数据库仍然是权威来源。OpenAI 负责处理对话。
记住对话内容
实用的聊天机器人还需要上下文。如果有人先说他们需要办理海牙认证,随后又说文件将送往西班牙,他们不应该被要求再次解释所有内容。
$response = openaiResponse([
'model' => 'gpt-5',
'previous_response_id' =>
$_SESSION['openai_response_id'] ?? null,
'input' => $userMessage
]);
$_SESSION['openai_response_id'] =
$response['id'];
这样,对话就可以自然地进行:
USER:
我需要办理海牙认证。
ASSISTANT:
文件将送往哪个国家?
USER:
西班牙。
模型能够理解,西班牙指的是上一条消息中提到的海牙认证申请。
自动化:让 OpenAI 无需点击按钮即可运行
OpenAI API 连接到自动化系统后,价值尤其突出。服务器可以自动执行任务,而不必手动反复要求模型执行相同的任务。
例如,Linux cron 作业可以每天晚上分析新发布的文章。
0 3 * * * /usr/bin/php /home/site/scripts/ai-audit.php
PHP 脚本可以找出所有尚未审核的内容。
$posts = $pdo->query("
SELECT *
FROM posts
WHERE ai_reviewed = 0
AND status = 'published'
")->fetchAll();
foreach ($posts as $post) {
$analysis =
analyzePageWithOpenAI($post);
saveAnalysis(
$post['id'],
$analysis
);
markReviewed(
$post['id']
);
}
这样一来,AlexanderMirvis.com 就拥有了一个自动化编辑审核器。
同样的思路也可以用于 BrooklynNotaryNinjas.com,以分析未回答的问题、对支持请求进行分类、总结文档、检测重复的常见问题、提出知识库改进建议、翻译已批准的内容以及总结客户对话。
AI 决定需要做什么,PHP 执行操作
最强大的应用模式之一,是让 OpenAI 解读用户的意图,同时由常规软件执行实际操作。
USER
|
v
OPENAI
|
v
FUNCTION REQUEST
|
v
MY PHP CODE
|
v
DATABASE OR BUSINESS LOGIC
|
v
OPENAI
|
v
USER
假设有人对 Brooklyn Notary Ninjas 说:
我有一份需要寄往西班牙的文件,而且我需要明天有人来办理。
OpenAI 可能会判断,该应用需要识别服务类型、检查可用性、获取价格并说明相关要求。
AI 可以请求调用这些函数,但不应获得不受限制的数据库访问权限。
我可能会允许调用:
check_availability
但我绝不会向模型提供类似以下这样的函数:
execute_arbitrary_sql这是被称为最小权限原则的安全理念的 AI 版本。
使用 OpenAI 进行网络安全防护
我使用 OpenAI 的最实用方式之一,是将其用于网络安全和服务器监控。AlexanderMirvis.com 和 BrooklynNotaryNinjas.com 都是面向公众的网站,这意味着服务器会持续暴露在扫描器、自动化漏洞探测、伪造的 WordPress 请求、凭据攻击、恶意机器人以及试图定位配置文件的攻击面前。
任何运营公共 Web 服务器的人都会很快发现,互联网实际上有多么嘈杂。
服务器日志可能包含:
185.234.219.32 "GET /wp-login.php" 404
185.234.219.32 "GET /wp-admin/" 404
185.234.219.32 "GET /.env" 403
185.234.219.32 "GET /.git/config" 403
185.234.219.32 "GET /phpmyadmin/" 404
人类管理员一眼就能看出,这可能不是有人随意浏览网站。某个程序正在系统性地搜索常见的管理界面和机密配置文件。
我仍然使用防火墙、Fail2Ban、速率限制和应用安全规则等传统安全工具。OpenAI 不会取代这些系统。相反,我可以将 OpenAI 放在它们之上,作为一个分析层。
传统安全工具回答的问题是:
此请求是否匹配已知的安全规则?
OpenAI 可以帮助回答:
这整个活动模式看起来代表什么?
将原始服务器日志转化为安全情报
我不必手动阅读数千条 Apache、Nginx、PHP、SSH 或应用程序日志条目,而是可以将这些日志中可疑的部分发送给 OpenAI 进行防御性分析。
from pathlib import Path
logfile = Path(
"/var/log/nginx/access.log"
)
with logfile.open(
"r",
encoding="utf-8",
errors="ignore"
) as f:
lines = f.readlines()
recent = lines[-1000:]
log_text = "".join(recent)
然后,我可以让 OpenAI 检查这些活动。
from openai import OpenAI
client = OpenAI()
response = client.responses.create(
model="gpt-5",
instructions="""
你正在协助进行防御性
网络安全监控。
分析提供的 HTTP 访问日志。
识别可能表明以下情况的活动:
凭据攻击、
漏洞扫描、
WordPress 探测、
环境文件探测、
Git 仓库探测、
SQL 注入尝试、
路径遍历、
命令注入、
可疑用户代理、
过度枚举、
抓取、
或异常请求模式。
不要仅凭一次失败请求
就认定某个 IP 是恶意的。
区分正常流量与
值得调查的活动。
仅提供防御性建议。
""",
input=log_text
)
print(response.output_text)
与其亲自阅读一千条日志,不如接收一份事件摘要,其中说明某个地址在几秒钟内请求了 WordPress 管理页面、一个环境文件、一个 Git 配置文件以及 phpMyAdmin。
更重要的是,模型可以告诉我,所提供的日志仅显示了尝试访问,还是有证据表明访问已经成功。
关联不同的日志
服务器很少只有一个有用的安全日志。我可能正在检查 Web 服务器日志、PHP 错误、应用程序日志、SSH 身份验证日志、Fail2Ban 事件、防火墙活动、数据库错误以及 CMS 登录尝试。
一次攻击在每个系统中的表现可能不同。
WEB LOG:
重复请求 /admin/login
APPLICATION LOG:
二十次管理员登录失败
FAIL2BAN:
IP 已加入封禁列表
AUTH LOG:
来自同一地址的
SSH 身份验证失败
分别查看每个来源可能会掩盖更大的模式。OpenAI 可以帮助我将它们关联起来。
security_event = f"""
WEB SERVER LOG
---------------
{web_log}
APPLICATION LOG
---------------
{application_log}
SSH LOG
---------------
{ssh_log}
FAIL2BAN LOG
---------------
{fail2ban_log}
"""
随后即可对这些合并后的事件进行分析。
response = client.responses.create(
model="gpt-5",
instructions="""
充当防御性安全分析师。
关联这些服务器日志中的事件。
判断这些事件是否看起来具有关联性。
输出:
执行摘要
时间线
源 IP 地址
目标服务
可疑请求
成功请求
失败请求
可能的攻击技术
支持该评估的证据
反对该评估的证据
建议采取的防御措施
除非所提供的日志给出了证据,
否则绝不要声称已经发生入侵。
""",
input=security_event
)
这种区分极其重要。有人请求 /.env 并不意味着他们已经获取了该文件。如果服务器返回 HTTP 403,则安全控制措施很可能阻止了访问。
在不使用 WordPress 的网站上检测 WordPress 探测
AlexanderMirvis.com 使用自定义 CMS,但自动化扫描器并不知道这一点。机器人仍会请求诸如 /wp-login.php、/wp-admin/、/xmlrpc.php 和 /wp-config.php 之类的 WordPress 路径。
这会产生一个有用的安全信号。如果网站不使用 WordPress,合法用户基本没有理由请求这些管理路径。
$suspiciousPaths = [
'/wp-login.php',
'/wp-admin',
'/wp-config.php',
'/xmlrpc.php',
'/.env',
'/.git',
'/phpmyadmin'
];
$requestUri =
$_SERVER['REQUEST_URI'];
foreach ($suspiciousPaths as $path) {
if (
stripos(
$requestUri,
$path
) !== false
) {
logSecurityEvent([
'ip' =>
$_SERVER['REMOTE_ADDR'],
'path' =>
$requestUri,
'user_agent' =>
$_SERVER[
'HTTP_USER_AGENT'
] ?? '',
'timestamp' =>
time()
]);
break;
}
}
创建安全事件数据库
我不会立即封禁每一位请求可疑内容的访客,而是记录事件,并随着时间推移检查其行为。
CREATE TABLE security_events (
id BIGINT UNSIGNED
AUTO_INCREMENT
PRIMARY KEY,
ip_address VARCHAR(45)
NOT NULL,
event_type VARCHAR(100)
NOT NULL,
request_uri TEXT,
user_agent TEXT,
risk_score INT
DEFAULT 0,
ai_summary TEXT,
created_at DATETIME
NOT NULL
);
随后,OpenAI 可以检查与同一地址关联的多个事件,并判断这些活动看起来是意外行为、异常行为,还是符合自动化侦察的特征。
为安全事件评定风险分数
网络安全分析器不再返回一段文字,而是可以返回结构化信息。
{
"risk_score": 82,
"classification": "automated_reconnaissance",
"confidence": 0.91,
"indicators": [
"WordPress 探测",
"环境文件探测",
"Git 配置探测"
],
"recommended_action": "temporary_block"
}
可以明确指示模型保持保守。
response = client.responses.create(
model="gpt-5",
instructions="""
出于防御性网络安全目的,
分析此服务器活动。
将风险从 0 到 100 进行评分。
采取保守的评估方式。
单个 404 请求通常
应获得较低的分数。
对已知机密文件、
管理接口或漏洞利用
路径的重复请求
应提高分数。
对敏感资源的成功响应
应予以特别关注。
""",
input=events,
text={
"format": {
"type": "json_schema",
"name": "security_analysis",
"strict": True,
"schema": {
"type": "object",
"properties": {
"risk_score": {
"type": "integer",
"minimum": 0,
"maximum": 100
},
"classification": {
"type": "string"
},
"confidence": {
"type": "number"
},
"indicators": {
"type": "array",
"items": {
"type": "string"
}
},
"recommended_action": {
"type": "string"
}
},
"required": [
"risk_score",
"classification",
"confidence",
"indicators",
"recommended_action"
],
"additionalProperties": False
}
}
}
)
这样,OpenAI 就能为实际的安全仪表板提供数据,而不是简单地产生一个人类必须手动解读的答案。
OpenAI 与 Fail2Ban
Fail2Ban 仍然是自动响应重复恶意活动的优秀工具。OpenAI 可以通过执行不同的任务来对其进行补充。
日志事件
|
v
确定性规则
|
v
OPENAI 分析
|
v
风险评分
|
v
策略引擎
|
v
FAIL2BAN 或防火墙
策略引擎极其重要。OpenAI 可能会建议临时阻止,但我的应用程序会确定该建议是否符合实际的执行规则。
if (
analysis["risk_score"] >= 90
and event_count >= 10
):
action = "temporary_block"
elif analysis["risk_score"] >= 60:
action = "watch"
else:
action = "log"
模型提供解释。我的软件负责执行。
安全的自动化防火墙操作
如果我自动执行临时防火墙操作,我不会允许模型创建任意 Shell 命令。相反,应用程序会调用预定义的安全函数。
import subprocess
import ipaddress
def block_ip(ip):
address =
ipaddress.ip_address(ip)
subprocess.run(
[
"/usr/local/sbin/security-block",
str(address)
],
check=True
)
我绝不会做类似这样的事情:
os.system(ai_generated_command)
允许模型生成的文本直接以 root 身份执行,会造成明显的安全问题。
安全的设计是:
OpenAI 建议:
临时阻止
应用程序将其转换为:
预定义且经过验证的
防火墙操作
检测 SSH 凭据攻击
SSH 身份验证日志是另一个有用的信息来源。
root 用户从 203.0.113.91 登录失败
admin 用户从 203.0.113.91 登录失败
来自 203.0.113.91 的无效用户 oracle
来自 203.0.113.91 的无效用户 postgres
来自 203.0.113.91 的无效用户 ubuntu
传统的安全工具可以统计尝试次数。OpenAI 可以帮助解释其模式。
例如,它可能识别出,来源正在尝试多个常见的管理员用户名,并且该序列符合自动化 SSH 用户名枚举或凭据猜测的特征。
当所提供的证据中似乎没有成功身份验证时,它也应明确说明这一点。
分析 PHP 错误以发现安全问题
并非每个安全问题都源于攻击者。有时,应用程序本身会泄露不应公开的信息。
PHP Warning:
file_get_contents(
/home/user/private/config.php
):
Permission denied
PHP Fatal error:
Uncaught PDOException:
SQLSTATE[HY000] [1045]
Access denied for user...
OpenAI 日志分析系统可以识别与安全相关的问题,例如暴露文件系统路径、日志中出现数据库详细信息、凭据被意外记录、生产环境中出现堆栈跟踪、不安全的上传处理、反复的身份验证失败以及权限问题。
response = client.responses.create(
model="gpt-5",
instructions="""
Review these PHP production logs.
Look for security-relevant problems.
Identify:
filesystem path disclosure,
database information disclosure,
credentials accidentally logged,
stack traces,
unsafe upload handling,
authentication problems,
SQL errors,
permission failures,
and repeated application errors.
Prioritize findings by severity.
""",
input=php_log
)
检测 SQL 注入探测
HTTP 日志有时会包含试图操纵数据库查询的可疑 URL。
/products.php?id=4%27%20OR%201=1--
或者:
/search?q=%27%20UNION%20SELECT
重要的并不只是识别出该请求类似 SQL 注入。我希望我的系统调查该请求前后发生了什么。
有用的问题包括:请求是否被阻止、PHP 是否产生了数据库错误、响应大小是否发生了异常变化、请求是否收到成功响应、同一来源是否尝试了多个有效载荷,以及相关数据库错误是否在大致相同的时间发生。
这样就能进行有价值的安全分析,而不是简单地发出“检测到 SQL 注入”的警报。
检测秘密文件和路径遍历探测
扫描器经常搜索不应公开访问的文件。
../../../../etc/passwd
/.env
/.git/config
/config.php
/backup.zip
/database.sql
/.aws/credentials
与其创建五十条单独的警告,我的安全系统可以将相关请求归并为单个事件。
事件 #2841
来源:
185.234.219.32
持续时间:
47 秒
请求数:
63
类别:
秘密文件发现
存储库探测
配置发现
备份文件枚举
成功获取的敏感响应:
无
风险:
高
自动操作:
IP 已暂时阻止
自动生成网络安全事件报告
OpenAI 对于将原始技术证据整理成易读的事件报告也非常有用。
最终报告可以包括事件摘要、检测时间、受影响的主机、源地址、时间线、观察到的技术手段、触发的安全控制、活动成功或失败的证据、遏制措施以及建议的后续行动。
prompt = f"""
Prepare a technical cybersecurity incident report
based only on the evidence below.
Do not invent events.
Explicitly distinguish:
attempted access,
blocked access,
successful access,
and unknown outcomes.
LOG DATA:
{incident_logs}
"""
report = client.responses.create(
model="gpt-5",
input=prompt
)
随后,可以使用与医疗或法律文档分析所采用的同一报告系统,将生成的分析转换为 Word 文档或 PDF。
安全事件
|
v
日志收集
|
v
OPENAI 分析
|
v
事件时间线
|
v
Word 或 PDF 报告
监控我的自定义 CMS
由于 AlexanderMirvis.com 使用自定义 CMS,我可以记录应用程序特有的安全事件,而这些事件在普通的 Web 服务器访问日志中通常无法清晰显示。
securityLog(
'ADMIN_LOGIN_FAILURE',
[
'username' => $username,
'ip' =>
$_SERVER['REMOTE_ADDR']
]
);
其他安全事件可能包括:
- ADMIN_LOGIN_SUCCESS
- ADMIN_LOGIN_FAILURE
- PASSWORD_CHANGED
- USER_CREATED
- USER_DELETED
- FILE_UPLOADED
- EXECUTABLE_UPLOAD_BLOCKED
- PAGE_DELETED
- DATABASE_EXPORT
- API_KEY_SETTING_CHANGED
- PERMISSION_CHANGED
- HONEYPOT_TRIGGERED
这为 OpenAI 提供了关于应用程序内部正在发生什么的详细得多的信息。
例如,假设系统看到:
03:02 管理员登录成功
03:03 API 密钥已更改
03:04 创建了新管理员
03:05 删除了 87 篇文章
03:06 导出数据库
每项操作从技术上讲都可能经过了该账户的授权,但这一连串操作非常不寻常。上下文分析器可以识别出这种模式,并提高风险级别。
行为基线与异常检测
另一个有趣的用途,是将当前行为与正常活动进行比较。
例如,我的系统可能知道,正常的管理员活动通常包括偶尔编辑页面,以及在正常工作时间发布文章。
然后它看到:
凌晨 4:16
管理员已通过身份验证
之前从未见过的 IP 地址
修改了 312 个页面
上传了 14 个 PHP 文件
已发起数据库导出
即使没有触发任何传统特征,这种组合也值得立即关注。
OpenAI 可以解释为何该行为与预期基线不同,并提供事件摘要供审核。
监控文件完整性
文件完整性监控也可以成为系统的一部分。
inotifywait \
-m \
-r \
/home/site/public_html \
-e modify,create,delete,move
如果服务器突然报告:
CREATE shell.php
CREATE wp-admin.php
MODIFY index.php
CREATE .htaccess
DELETE security.php
这种组合显然比普通的内容更新更令人担忧。
安全分析器可以立即生成警告,说明公共目录中出现了意外的 PHP 文件,同时重要的应用程序文件也被修改。
自然语言安全搜索
安全事件存储后,我可以使用 OpenAI 提供自然语言报告。
我不必手动构造 SQL 查询,而是可以询问:
显示上个月同时尝试过 WordPress 路径和 .env 文件的扫描器。
或者:
是否有任何成功请求来自后来被封禁的 IP 地址?
或者:
本周最常见的攻击模式是什么?
不应向 AI 提供不受限制的 SQL 访问权限。相反,它可以调用受控的报告函数,例如:
search_security_events
并传入结构化参数:
{
"start_date": "2026-08-29",
"end_date": "2026-08-30",
"minimum_risk": 70,
"event_types": [
"reconnaissance",
"credential_attack"
]
}
我的应用程序负责构造并执行 SQL 查询。OpenAI 永远不会获得执行任意 SQL 的权限。
每日自动安全简报
我还可以自动生成每日网络安全摘要。
0 7 * * * /usr/bin/python3 /opt/security/daily-report.py
该脚本可以收集前一天的安全活动,并请求 OpenAI 识别真正值得关注的事件。
每日服务器安全报告
已分析的请求:
184,293
高风险来源:
17
已自动阻止:
12
最常见的活动:
WordPress 漏洞扫描
第二常见的活动:
环境文件探测
凭据攻击:
3
成功入侵的证据:
在所提供的遥测数据中未检测到
重要事件:
某个地址探测了众多管理路径,
随后尝试进行 SSH 身份验证。
这比手动阅读数千条单独的安全事件有用得多。
减少安全警报疲劳
安全监控面临的最大问题之一就是警报疲劳。如果每个失败的请求都会生成一条紧急警告,管理员最终会停止关注。
AI 辅助的分诊可以帮助将事件分为信息、低、中、高和严重等类别。
if analysis["risk_score"] >= 90:
send_critical_alert()
elif analysis["risk_score"] >= 70:
add_to_security_dashboard()
else:
archive_event()
这样,电子邮件、短信或推送通知就可以留给真正需要立即关注的事件。
绝不要给予 AI 根访问权限
在整个架构中,最重要的网络安全规则之一是:应该允许模型分析远多于它被允许控制的内容。
我绝不会对 AI 系统说:
这是我的服务器日志。弄清楚发生了什么,并执行你认为必要的任何 Linux 命令。
相反,我会仅暴露范围有限的函数,例如:
- block_ip
- unblock_ip
- query_ip_history
- read_recent_logs
- disable_user_session
- invalidate_web_session
- quarantine_uploaded_file
- create_security_alert
模型可能会请求:
{
"ip": "185.234.219.32",
"duration": 3600
}
我的应用程序会对其进行验证。
import ipaddress
def request_block(ip, duration):
address =
ipaddress.ip_address(ip)
if duration > 86400:
raise ValueError(
"Maximum automatic block is 24 hours."
)
create_firewall_block(
str(address),
duration
)
AI 永远不会获得不受限制的 root shell。
使用 OpenAI 进行语音转文本
OpenAI 还可以处理语音,这又开创了一个重要的自动化类别。
例如,可以自动将录制的语音留言转录成文字。
from openai import OpenAI
client = OpenAI()
with open("caller.wav", "rb") as audio:
transcription =
client.audio.transcriptions.create(
model="gpt-4o-transcribe",
file=audio
)
print(transcription.text)
随后可以对该转录文本进行分析。
response = client.responses.create(
model="gpt-5",
input=f"""
Analyze this telephone message.
Extract:
caller intent,
requested service,
urgency,
unanswered questions,
and recommended follow-up.
Transcript:
{transcription.text}
"""
)
print(response.output_text)
这样,语音留言就变成了结构化的业务信息,而不再只是一段留在邮箱中的音频录音。
文本转语音
这个过程也可以反向进行。OpenAI 可以将文本转换为语音音频。
from openai import OpenAI
client = OpenAI()
with client.audio.speech.with_streaming_response.create(
model="gpt-4o-mini-tts",
voice="cedar",
input="""
Thank you for calling.
Tell me what kind of document
you need notarized.
"""
) as response:
response.stream_to_file(
"response.mp3"
)
这就构成了 AI 电话助理的基本架构:
来电者讲话
|
v
语音转文字
|
v
OPENAI 推理
|
v
文字响应
|
v
文字转语音
|
v
来电者听到响应
将 OpenAI 与 FreePBX 集成
当 OpenAI 连接到 Asterisk 或 FreePBX 时,这会变得特别有趣。我可以将相同的基础设施用于客户服务助手、非工作时间电话系统、内部支持热线,或用于接听来电的反诈骗蜜罐——我开玩笑地称之为 Troll Bot。
总体架构如下:
来电
|
v
FREEPBX / ASTERISK
|
v
自定义目的地
|
v
录制来电者
|
v
OPENAI 转录
|
v
OPENAI 响应
|
v
OPENAI 语音
|
v
ASTERISK 播放响应
简化的 Asterisk context 可能如下所示:
[ai-trollbot]
exten => s,1,Answer()
same => n,Playback(custom/hello-ai)
same => n,Record(
/tmp/caller.wav,
3,
10
)
same => n,System(
/usr/bin/python3
/opt/trollbot/respond.py
/tmp/caller.wav
)
same => n,Playback(
/tmp/ai-response
)
same => n,Hangup()
Python 程序可以转录来电者的语音。
import sys
from openai import OpenAI
client = OpenAI()
audio_file = sys.argv[1]
with open(audio_file, "rb") as f:
transcript =
client.audio.transcriptions.create(
model="gpt-4o-transcribe",
file=f
)
caller_text = transcript.text
然后,OpenAI 可以生成响应。
reply = client.responses.create(
model="gpt-5",
instructions="""
你是一个自动化的反诈骗
蜜罐,负责接听呼入的
电话线路。
绝不要索要密码、
银行信息、社会安全号码、
身份验证代码或其他敏感信息。
绝不要威胁来电者。
保持对话无害。
表现得略微困惑,并带有一点幽默感。
回复保持简短。
""",
input=caller_text
)
answer = reply.output_text
然后可以将响应转换为语音。
with client.audio.speech.with_streaming_response.create(
model="gpt-4o-mini-tts",
voice="cedar",
input=answer
) as speech:
speech.stream_to_file(
"/tmp/ai-response.mp3"
)
然后可以将音频转换为适合电话系统的 WAV 文件。
ffmpeg \
-y \
-i /tmp/ai-response.mp3 \
-ar 8000 \
-ac 1 \
/tmp/ai-response.wav
“捣蛋鬼机器人”
“捣蛋鬼机器人”实际上是一次将电话基础设施连接到人工智能推理系统的实验。我仅将这一概念用于呼入电话、反诈骗蜜罐、内部测试及其他合法用途,而不是用于未经请求或骚扰性的呼出电话。
从理论上讲,一通诈骗电话可能会产生如下对话:
CALLER:
您好,先生,我是微软技术支持。
BOT:
太好了。是哪一个微软?
我家里有好几扇窗户,
其中一扇一下雨就卡住。
CALLER:
不,先生,我说的是您电脑上的 Windows。
BOT:
哦。
那就合理多了。
厨房的窗户没有
键盘。
这个笑话很有趣,但其背后的工程技术更加令人感兴趣。Asterisk 实际上已经成为人工智能推理系统的电话接口。
实时语音与 SIP
前一种方法通过录音、转录、生成回答并播放新的音频文件来工作。这可能会引入明显的延迟。
更复杂的设计使用实时音频通信。
SIP CALL
|
v
FREEPBX
|
v
REALTIME VOICE SESSION
|
v
OPENAI
|
v
LIVE SPOKEN RESPONSE
实时系统可以检测某人何时开始和停止说话,以显著更低的延迟进行响应,并且可能允许在 AI 说话时打断它。
与反复录制完整的音频片段相比,这能带来更加自然的电话体验。
为不同分机设置不同的 AI 个性
另一个有趣且实用的功能,是为不同的电话分机设置不同的 AI 指令。
Extension 700
Professional receptionist
Extension 701
After-hours assistant
Extension 702
Spam-call honeypot
Extension 703
Internal technical support
Extension 704
Notary FAQ assistant
所有这些分机都可以使用相同的 OpenAI 基础设施。只需更改它们的指令和允许使用的功能即可。
接待员可能被允许查询营业时间和预约可用情况,而反诈骗蜜罐则完全无法访问任何业务功能。
AI 个性很容易创建。权限则需要更加谨慎地考虑。
先将 OpenAI 用作分类器,再将其用作写作者
人工智能一个常被忽视的用途是分类。
假设一位客户写道:
我有出生证明,现在要搬到海外,他们告诉我这份证明需要认证。
在生成任何回复之前,OpenAI 可以先对请求进行分类。
{
"intent": "apostille",
"confidence": 0.94,
"urgency": "normal",
"requires_human": false
}
这样,应用程序就知道应该由哪个工作流程来处理该请求。
这意味着客户不需要理解我网站的内部结构。他们只需用日常语言说明自己的需求即可。
构建 AI 流水线,而不是编写巨型提示词
另一个有用的技巧是,将复杂的工作拆分为多个 AI 阶段,而不是使用一个庞大的提示词。
文档分析流程可能如下所示:
分类文档
|
v
提取人员和日期
|
v
建立时间线
|
v
识别不一致之处
|
v
创建研究问题
|
v
生成最终报告
出版工作流程也可以采用类似的方式:
起草文章
|
v
语法分析
|
v
SEO 分析
|
v
识别事实性陈述
|
v
生成元数据
|
v
内部链接建议
|
v
人工审核
|
v
发布
将工作拆分为独立阶段,可以让系统更易于测试、调试和改进。
将 AI 判断与数据库事实分开
这是构建可靠 OpenAI 应用程序时最重要的经验之一。
人工智能非常擅长处理以下问题:
- 这个人可能是什么意思?
- 这属于哪个类别?
- 哪些信息似乎缺失?
- 应该如何解释?
- 这些记录中的哪一部分似乎相关?
- 接下来我应该调查什么?
- 如何概括这些信息?
对于以下交易信息,人工智能不应被视为权威来源:
- 这位客户支付了多少钱?
- 预约是什么时候?
- 当前服务价格是多少?
- 发票是否确实已经支付?
- 该用户当前拥有何种权限?
这些答案应当存储在数据库中。
模型负责解读问题。我的应用程序负责检索事实。
隐私与安全是架构的一部分
任何分析医疗记录、法律文件、业务记录或安全日志的系统,都需要从一开始就将隐私纳入设计考量。
当只有一份文档相关时,我不需要发送完整的用户资料。不再需要的临时上传文件应予以删除。敏感文档不应出现在普通调试日志中。API 密钥应保留在服务器上。公共知识集合和私有知识集合应保持分离。
同样的原则也适用于网络安全。OpenAI 可能能够分析服务器日志,但这并不意味着模型应自动接收这些日志中包含的每个凭据、会话令牌、密钥或配置值。
在提交日志进行分析之前,在实际可行的情况下,可以对敏感数据进行脱敏或标准化处理。
OpenAI 真正会把我的网站变成什么
一旦这些系统结合起来,OpenAI 就不再只是新奇事物。
AlexanderMirvis.com 可以成为一个 AI 辅助的出版、研究和网络安全平台。文章可以生成、审阅、总结、翻译、评分并添加元数据。上传的文档可以转化为时间线和报告。定制 CMS 可以监控自身的安全事件。服务器日志可以自动分析,可疑活动可以汇总为安全事件。
BrooklynNotaryNinjas.com 可以成为一个 AI 辅助的业务平台。聊天机器人可以使用受控的公司知识回答问题,从数据库中检索实时信息,对客户请求进行分类,解释流程,协助处理上传的文档,并引导人们找到正确的服务。
同一套 OpenAI 基础设施还可以扩展到 FreePBX。电话语音会转换为文本,模型判断来电者的意图,获批准的功能可以检索信息,然后将生成的回答以语音形式播放给来电者。
与此同时,网络安全系统可以持续检查幕后发生的事情。Web 服务器日志、CMS 事件、SSH 活动、防火墙操作、应用程序错误和文件变更都可以共同构成更完整的服务器安全图景。
最重要的经验是,OpenAI 不应控制一切。
OpenAI 负责解读。我的应用程序负责决策。
OpenAI 负责推理。我的数据库始终是权威来源。
OpenAI 提议采取行动。我的服务器决定这些行动是否获准执行。
OpenAI 分析安全事件。我的安全策略决定是否拦截某些内容。
OpenAI 生成内容。我的 CMS 决定发布哪些内容。
OpenAI API 的真正强大之处就在于此。
它并不只是被放进网站里的 ChatGPT。
它成为一个推理层,位于人类语言、文档、数据库、网站、电话系统、网络安全工具和普通软件之间。
一旦我开始这样看待 OpenAI,可能性就远不止是让 AI 写点东西。它变成了一种能够帮助操作、分析、自动化并保护系统本身的工具。