接入QAnything的AI问答知识库,可私有化部署的企业级WIKI知识库
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/QAnythingQAnything
云服务地址: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();
}
- 点赞
- 收藏
- 关注作者
评论(0)