zyplayer-doc是一款适合企业和个人使用的WIKI知识库管理工具,提供在线化的知识库管理功能,专为私有化部署而设计,最大程度上保证企业或个人的数据安全,可以完全以内网的方式来部署使用它。
您也可以将其作为企业产品的说明文档来使用,支持一键将整个空间的内容开放到互联网,提供有不同风格的开放文档页样式可供选择,以及适配了在手机端、小程序中文档的展示,省去为产品的说明文档而定制开发系统的成本。
安装知识库系统
1. 下载Java并安装
版本号:JAVA 1.8
及以上,本项目使用JAVA语言开发,启动时会依赖JAVA的运行时环境
2. 安装数据库依赖
私有化部署后应用产生的所有数据都存储在自己的MySQL数据库中,数据库安装成功后,需要手动创建一个库:create database zyplayer_doc;
3. 下载安装文件
到官网可下载最新版安装文件:https://doc.zyplayer.com/#/integrate/zyplayer-doc/install,同时也可使用Docker或宝塔进行安装
4. 修改配置并启动
修改文件夹下的 application.properties
里面的数据库链接和帐号密码,双击文件夹下的 startup.bat
启动项目,启动后访问:http://127.0.0.1:8083 ,默认账号:zyplayer 密码:123456
文档的编写
在知识库首页新建空间,进入空间即可新建文档进行编辑,也可以上传或新建Office文档进行在线协同编辑
接入QAnything实现AI问答
服务的接入
可通过私有化部署的方式,或者使用QAnything云服务,将应用信息填入到系统中,并开启内部文档或开放问答的启用开关
QAnything
开源地址:https://github.com/netease-youdao/QAnything
QAnything
云服务地址:https://ai.youdao.com/console/#/service-singleton/qanything
在空间中启用
在空间的设置页中将 AI知识库同步
开关开启,等待同步完成后在空间的高级搜索和开放文档页面即会出现AI问答选项
在文集中启用
只需要将文集引用到的空间全部开启 AI知识库同步
,文集搜索界面则会出现AI问答选项
AI问答限流
在AI问答配置处可配置问答限流,可按 用户或全系统
配置 每天/每小时/每分钟
的问答次数限制,防止恶意刷量。
API开放问答接口
可通过开放接口的方式实现指定空间或文集进行问答,可用于智能客服等场景使用
同步请求地址:http://127.0.0.1:8083/openApi/v1/ai/chats/sync
,请求代码示例:
public static void main(String[] args) { // 组装请求参数 Map<String, Object> paramMap = new HashMap<>(); paramMap.put("space", "uta2JteQtykCil4b0ePSMp"); paramMap.put("question", "zyplayer-doc文档管理系统是什么?"); paramMap.put("salt", UUID.randomUUID()); // 加密参数 String privateKey = "MIICeAIBAxxxxxxxxDMKVrlHqf"; String content = JSON.toJSONString(paramMap); String sha256 = SecureUtil.sha256(content); RSA rsaPrivate = SecureUtil.rsa(privateKey, null); String encrypt = rsaPrivate.encryptHex(sha256, KeyType.PrivateKey); // 发送请求 String url = "http://127.0.0.1:8083/openApi/v1/ai/chats/sync"; String body = HttpUtil.createPost(url).form("content", content).form("encrypt", encrypt).execute().body(); System.out.println(body); }
流式请求地址:http://127.0.0.1:8083/openApi/v1/ai/chats/stream
,请求代码示例:
public static void main(String[] args) { CountDownLatch latch = new CountDownLatch(1); Map<String, Object> paramMap = new HashMap<>(); paramMap.put("space", "uta2JteQtykCil4b0ePSMp"); paramMap.put("question", "zyplayer-doc文档管理系统是什么?"); paramMap.put("salt", UUID.randomUUID()); // 加密参数 String privateKey = "MIICeAIBAxxxxxxxxDMKVrlHqf"; String content = JSON.toJSONString(paramMap); String sha256 = SecureUtil.sha256(content); RSA rsaPrivate = SecureUtil.rsa(privateKey, null); String encrypt = rsaPrivate.encryptHex(sha256, KeyType.PrivateKey); // 发送请求 Map<String, Object> bodyMap = new HashMap<>(); bodyMap.put("content", content); bodyMap.put("encrypt", encrypt); WebClient webClient = WebClient.create("http://127.0.0.1:8083"); Flux<AiChatStreamResult> eventStream = webClient.post() .uri("/openApi/v1/ai/chats/stream") .bodyValue(bodyMap) .retrieve() .bodyToFlux(AiChatStreamResult.class); Disposable disposable = eventStream.timeout(Duration.ofSeconds(60)).subscribe(data -> { // 在这里处理每次获取到的数据 if (Objects.equals(data.getName(), "response")) { logger.info("message: {}", data.getMessage()); } else if (Objects.equals(data.getName(), "complete")) { logger.info("sourceList: {}", data.getSourceList()); } else if (Objects.equals(data.getName(), "failed")) { logger.info("failed: {}", data.getErrMsg()); } }, error -> { // 处理错误 logger.error("ChatStream error", error); latch.countDown(); }, () -> { // 处理流结束事件 logger.info("ChatStream complete"); latch.countDown(); }); try { // 最多等待60秒 latch.await(60, TimeUnit.SECONDS); } catch (InterruptedException e) { logger.error("等待超时:{}", e.getMessage()); } disposable.dispose(); }