前置条件:已部署zabbix7.0
私有化部署ollama或申请deepseek官方api如下:
Ⅰ私有化采用Ollama工具部署DeepSeek-R1模型(物理资源满足需求时参考)
Ollama是一款强大的私有化部署大模型工具,专为简化AI模型的部署和管理而设计,在满足物理资源需求的前提下私有化部署DeepSeek-R1模型时可采用ollama部署,在Linux环境中部署流程参考如下:
① 下载一键安装Ollama脚本并执行:
curl -fsSL http://113.141.80.105:9999/install.sh | sh
② 下载并运行deepseek-r1,按照自己硬件环境选择不同参数量的模型下载并运行即可
ollama run deepseek-r1:14b
DeepSeekR1各版本使用场景及参考硬件配置如下:
Ⅱ 申请DeepSeek-R1官网API(建议)
官方API申请地址:https://platform.deepseek.com/sign_in
推荐大家使用DeepSeek官方API,不仅能提供稳定可靠的服务,而且成本极低,每百万tokens仅需8元。实际测试显示,调用API 30次仅消耗约20,000 tokens,费用约为0.1元,性价比非常高。申请后,请务必妥善保管您的API密钥。
通过集成Zabbix+Maxkb+DeepSeek,可以轻松构建一个Zabbix官方文档的知识库问答系统。该系统能够自动解析和理解Zabbix官方文档内容,并为用户提供精准的问答服务。无论是查找特定配置指南、故障排查步骤,还是获取最佳实践建议,用户只需输入问题,系统即可快速返回准确答案。不仅可以提升信息检索的效率,还大幅减少了运维人员查阅文档的时间,确保问题得以迅速解决,提升整体工作效率。
1.1 系统架构
Zabbix:需提前部署完Zabbix,建议5.0以上版本。
Maxkb:一款基于大语言模型的开源知识库问答系统,支持快速上传文档、自动爬取在线文档,并能无缝嵌入第三方业务系统,为企业提供智能问答和信息管理的高效解决方案。
Deepseek:建议调用deepseek官方api,也可本地采用ollama工具私有部署。
1.2 安装并配置Maxkb
部署环境选用Linux系统,安装Maxkb前请提前安装好Docker,Docker安装Maxkb命令如下:
docker run -d --name=maxkb -p 8080:8080 -v ~/.max
通过浏览器访问 MaxKB:
http://目标服务器 IP 地址:8080
默认登录信息
用户名:admin
默认密码:MaxKB@123..
1.3 配置模型参考一(DeepSeek官方-API)
进入系统管理-模型设置-添加模型列表中,列出了所有可调用模型,选择添加deepseek模型,模型名称填写deepseek-api,模型类型选择大语言模型,基础模型选择“deepseek-chat”,最后将申请到的API Key填入即可。
1.4 配置模型参考二(基于Ollama私有化部署的deepseek)
进入系统管理-模型设置-添加模型列表中,选择添加Ollama模型,名称可填写deepseek-api,模型类型选择大语言模型,基础模型手动输入“deepseek-r1:7b”(以实际部署模型版本为准),API域名填写部署ollama的服务器ip+11434端口号,API Key未设置的话可输入任意字符,点击确定即可。
1.5 新建知识库并配置
点击创建知识库,按需填入知识库名称及描述等必填。
注意创建知识库时您可以选择两种类型:通用型和Web站点型。
通用型允许您上传或手动录入文档。例如,您可以上传本地的Zabbix 7.0手册PDF文件。
Web站点型则可以直接同步网站文本数据。对于Zabbix官方文档,您可以使用以下网址进行同步:https://www.zabbix.com/documentation/7.0/zh/manual
无论选择哪种方式,上传完成后系统将自动进行索引并进行向量化处理。只需等待索引完成即可。
1.6 新建应用并配置
随后,选择“应用”并创建新应用。输入自定义名称和描述后,选择“简单配置”即可快速完成设置。如果需要更复杂的流程,您也可以进行高级编排,但本文不再展开讨论这部分内容。
在设置中,根据实际需求修改AI模型和自定义开场白,并关联已上传的知识库。您可以在参数设置中调整检索模式和召回分段,通过测试不断优化,直至达到满意的效果。
1.7 嵌入至Zabbix前端
您还可以将助手添加到Zabbix前端,以便在页面上随时调用。具体步骤为:进入“应用” -> “Zabbix知识库小助手” -> “概览” -> “嵌入第三方”。
找到浮窗模式,复制所有代码,编辑Zabbix前端文件,根据zabbix安装路径查找,需要编辑page_footer.php和layout.htmlpage.php两个前端文件,具体行数可能因版本不同有所差异,此处仅以笔者环境为例:
vi /usr/share/zabbix/include/page_footer.php +62
在第62行加入
echo ' *******(此处为maxkb中复制的代码)';
vi /usr/share/zabbix/app/views/layout.htmlpage.php +96
在第96行加入
echo ' *******(此处为maxkb中复制的代码)';
最后重启zabbix即可
systemctl restart zabbix-server
layout.htmlpage.php配置文件:
<?php declare(strict_types = 0);
/**
* @var CView $this
* @var array $data
*/
function local_showHeader(array $data): void {
header('Content-Type: text/html; charset=UTF-8');
header('X-Content-Type-Options: nosniff');
header('X-XSS-Protection: 1; mode=block');
if (strcasecmp($data['config']['x_frame_options'], 'null') != 0) {
$x_frame_options = $data['config']['x_frame_options'];
if (strcasecmp($x_frame_options, 'SAMEORIGIN') == 0) {
header('X-Frame-Options: SAMEORIGIN');
}
elseif (strcasecmp($x_frame_options, 'DENY') == 0) {
header('X-Frame-Options: DENY');
}
else {
header('Content-Security-Policy: frame-ancestors '.$x_frame_options);
}
}
echo (new CPartial('layout.htmlpage.header', [
'javascript' => [
'files' => $data['javascript']['files']
],
'stylesheet' => [
'files' => $data['stylesheet']['files']
],
'page' => [
'title' => $data['page']['title']
],
'user' => [
'lang' => CWebUser::$data['lang'],
'theme' => CWebUser::$data['theme']
],
'web_layout_mode' => $data['web_layout_mode'],
'config' => [
'server_check_interval' => $data['config']['server_check_interval']
]
]))->getOutput();
}
function local_showSidebar(array $data): void {
global $ZBX_SERVER_NAME;
if ($data['web_layout_mode'] == ZBX_LAYOUT_NORMAL) {
echo (new CPartial('layout.htmlpage.aside', [
'server_name' => isset($ZBX_SERVER_NAME)? $ZBX_SERVER_NAME : ''
]))->getOutput();
}
}
function local_showFooter(array $data): void {
echo (new CPartial('layout.htmlpage.footer', [
'user' => [
'username' => CWebUser::$data['username'],
'debug_mode' => CWebUser::$data['debug_mode']
],
'web_layout_mode' => $data['web_layout_mode']
]))->getOutput();
}
local_showHeader($data);
echo '<body>';
local_showSidebar($data);
// 嵌入的 JavaScript 代码部分
echo '<script
async
defer
src="http://172.24.222.241:8080/api/application/embed?protocol=http&host=172.24.222.241:8080&token=d12b71b0a5de40c9">
</script>';
echo '<div class="'.ZBX_STYLE_LAYOUT_WRAPPER.
($data['web_layout_mode'] == ZBX_LAYOUT_KIOSKMODE? ' '.ZBX_STYLE_LAYOUT_KIOSKMODE : '').'">';
// Display unexpected messages (if any) generated by the layout.
echo get_prepared_messages(['with_current_messages' => true]);
echo $data['main_block'];
makeServerStatusOutput()->show();
local_showFooter($data);