/wenda

闻达:一个LLM调用平台。为小模型外挂知识库查找和设计自动执行动作,实现不亚于于大模型的生成能力

Primary LanguageJavaScriptGNU Affero General Public License v3.0AGPL-3.0

闻达:一个大规模语言模型调用平台

针对特定环境的内容生成是LLM使用中的一项重要应用,实现这一目的,主要有全量微调lora微调、和本项目方法。但个人没有做全量微调的,lora微调只能牺牲基础能力换单任务效果(用6B模型lora调出来的单任务效果,专门设计一个0.5B模型也能实现,且推理成本更低)。

而本项目采用知识库+auto脚本的形式为LLM提高生成能力,充分考虑个人和中小企业的资源问题,以及国内大背景下知识安全和私密性问题,实现使小模型获得近似于大模型的生成能力。

  1. 目前支持模型:chatGLM-6BchatRWKVchatYuanllama系列以及openaiapichatglm130b api,初步支持moss
  2. 使用知识库扩展模型所知信息,使用auto提高模型生成质量和复杂问题解决能力
  3. 支持chatGLM-6BchatRWKVllama系列流式输出和输出过程中中断
  4. 自动保存对话历史至浏览器(多用户同时使用不会冲突,chatRWKV历史消息实现方式需使用string)
  5. 对话历史管理(删除单条、清空)
  6. 支持局域网、内网部署和多用户同时使用。

交流QQ群:LLM使用和综合讨论群162451840;知识库使用讨论群241773574(满);Auto开发交流群744842245;

discussions QQ频道

安装部署

各版本功能及安装说明

功能 Windows懒人包 自部署
知识库 rtst模式 须下载模型text2vec-large-chinese 同上
知识库 fess模式 须安装fess 同上
知识库 网络模式 支持 同上
Auto 全部支持,部分内置Auto使用说明 同上
chatGLM-6B 支持CUDA,须自行下载模型 。可自行安装组件以支持CPU 同上
RWKV torch 全部功能支持,须自行下载模型。在安装vc后支持一键启动CUDA加速 同上
RWKV cpp 全部功能支持,须自行下载模型,也可使用内置脚本对torch版模型转换和量化。 同上
replit 支持,须自行下载模型。 同上
chatglm130b api 支持,须设置自己的key 支持
openai api 支持,须设置自己的key 支持
llama.cpp 不支持 支持
moss 不支持 支持

懒人包

百度云

链接:https://pan.baidu.com/s/105nOsldGt5mEPoT2np1ZoA?pwd=lyqz

提取码:lyqz

夸克

链接:https://pan.quark.cn/s/c4cb08de666e 提取码:4b4R

介绍

默认参数在6G显存设备上运行良好。最新版懒人版已集成一键更新功能,建议使用前更新。

使用步骤(以glm6b模型为例):

  1. 下载懒人版主体和模型,模型可以用内置脚本从HF下载,也可以从网盘下载。
  2. 如果没有安装CUDA11.8,从网盘下载并安装。
  3. 双击运行运行GLM6B.bat
  4. 如果需要生成离线知识库,参考 知识库

自行安装

PS:一定要看example.config.yml,里面对各功能有更详细的说明!!!

1.安装库

通用依赖:pip install -r requirements.txt 根据使用的 知识库进行相应配置

2.下载模型

根据需要,下载对应模型。

建议使用chatRWKV的RWKV-4-Raven-7B-v11,或chatGLM-6B。

3.参数设置

example.config.yml重命名为config.yml,根据里面的参数说明,填写你的模型下载位置等信息

Auto

auto功能通过JavaScript脚本实现,使用油猴脚本或直接放到autos目录的方式注入至程序,为闻达附加各种自动化功能。

Auto 开发函数列表

函数 (皆为异步调用) 功能 说明
send(s,keyword = "",show=true) 发送信息至LLM,返回字符串为模型返回值 s:输入模型文本;keyword:聊天界面显示文本;show:是否在聊天界面显示
add_conversation(role, content) 添加会话信息 role:'AI'、'user';content:字符串
save_history() 保存会话历史 对话完成后会自动保存,但手动添加的对话须手动保存
find(s, step = 1) 从知识库查找 返回json数组
find_dynamic(s,step=1,paraJson) 从动态知识库查找;参考闻达笔记Auto paraJson:{libraryStategy:"sogowx:3",maxItmes:2}
zsk(b=true) 开关知识库
lsdh(b=true) 开关历史对话 打开知识库时应关闭历史
speak(s) 使用TTS引擎朗读文本。 调用系统引擎
copy(s) 使用浏览器clipboard-write复制文本 需要相关权限

Auto 开发涉及代码段

在左侧功能栏添加内容:

func.push({
    name: "名称",
    question: async () => {
        let answer=await send(app.question)
        alert(answer)
    },
})

在下方选项卡添加内容:

app.plugins.push({ icon: 'note-edit-outline', url: "/static/wdnote/index.html" })

在指定RTST知识库查找:

find_in_memory = async (s, step, memory_name) => {
   response = await fetch("/api/find_rtst_in_memory", {
      method: 'post',
      body: JSON.stringify({
         prompt: s,
         step: step,
         memory_name: memory_name
      }),
      headers: {
         'Content-Type': 'application/json'
      }
   })
   let json = await response.json()
   console.table(json)
   app.zhishiku = json
   return json
}

上传至指定RTST知识库:

upload_rtst_zhishiku = async (title, txt,memory_name) => {
   response = await fetch("/api/upload_rtst_zhishiku", {
      method: 'post',
      body: JSON.stringify({
         title: title,
         txt: txt,
         memory_name: memory_name
      }),
      headers: { 'Content-Type': 'application/json' }
   })
   alert(await response.text())
}

保存指定RTST知识库:

save_rtst = async (memory_name) => {
   response = await fetch("/api/save_rtst_zhishiku", {
      method: 'post',
      body: JSON.stringify({
         memory_name: memory_name
      }),
      headers: { 'Content-Type': 'application/json' }
   })
   alert(await response.text())
}

访问SD_agent:

response = await fetch("/api/sd_agent", {
   method: 'post',
   body: JSON.stringify({
         prompt: `((masterpiece, best quality)), photorealistic,` + Q,
         steps: 20,
         // sampler_name: "DPM++ SDE Karras",
         negative_prompt: `paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, ((monochrome)), ((grayscale)), skin spots, acnes, skin blemishes, age spot, glans`
   }),
   headers: {
         'Content-Type': 'application/json'
   }
})
try {
   let json = await response.json()
   add_conversation("AI", '![](data:image/png;base64,' + json.images[0] + ")")
} catch (error) {
   alert("连接SD API失败,请确认已开启agents库,并将SD API地址设置为127.0.0.1:786")
}

部分内置 Auto 使用说明

文件名 功能
0-write_article.js 写论文:根据题目或提纲写论文
0-zsk.js 知识库增强和管理
face-recognition.js 纯浏览器端人脸检测:通过识别嘴巴开合,控制语音输入。因浏览器限制,仅本地或TLS下可用
QQ.js QQ机器人:配置过程见文件开头注释
block_programming.js 猫猫也会的图块化编程:通过拖动图块实现简单Auto功能
1-draw_use_SD_api.js 通过agents模块(见example.config.yml<Library>)调用Stable Diffusion接口绘图

以上功能主要用于展示auto用法,进一步能力有待广大用户进一步发掘。

auto例程

知识库

知识库原理是在搜索后,生成一些提示信息插入到对话里面,知识库的数据就被模型知道了。rtst模式计算语义并在本地数据库中匹配;fess模式(相当于本地搜索引擎)、bing模式均调用搜索引擎搜索获取答案。

为防止爆显存和受限于模型理解能力,插入的数据不能太长,所以有字数和条数限制,这一问题可通过知识库增强Auto解决。

正常使用中,勾选右上角知识库即开启知识库。

有以下几种方案:

  1. rtst模式,sentence_transformers+faiss进行索引,支持预先构建索引和运行中构建。
  2. bing模式,cn.bing搜索,仅国内可用
  3. bingsite模式,cn.bing站内搜索,仅国内可用
  4. fess模式,本地部署的fess搜索,并进行关键词提取

rtst模式

sentence_transformers+faiss进行索引、匹配,并连同上下文返回。目前支持txt和pdf格式。

支持预先构建索引和运行中构建,其中,预先构建索引强制使用cuda,运行中构建根据config.yml(复制example.config.yml)中rtst段的device(embedding运行设备)决定,对于显存小于12G的用户建议使用CPU

Windows预先构建索引运行:plugins/buils_rtst_default_index.bat

Linux直接使用wenda环境执行 python plugins/gen_data_st.py

需下载模型GanymedeNil/text2vec-large-chinese置于model文件夹,并将txt格式语料置于txt文件夹。

fess模式

在本机使用默认端口安装fess后可直接运行。否则需修改config.yml(复制example.config.yml)中fess_host127.0.0.1:8080为相应值。FESS安装教程

知识库调试

清洗知识库文件

安装 utool 工具,uTools 是一个极简、插件化的桌面软件,可以安装各种使用 nodejs 开发的插件。您可以使用插件对闻达的知识库进行数据清洗。请自行安装以下推荐插件:

  • 插件“解散文件夹”,用于将子目录的文件移动到根目录,并删除所有子目录。
  • 插件“重复文件查找”,用于删除目录中的重复文件,原理是对比文件 md5。
  • 插件“文件批量重命名”,用于使用正则匹配和修改文件名,并将分类后的文件名进行知识库的分区操作。

模型配置

chatGLM-6B

运行:run_GLM6B.bat

模型位置等参数:修改config.yml(复制example.config.yml)。

默认参数在GTX1660Ti(6G显存)上运行良好。

chatRWKV

支持torch和cpp两种后端实现,运行:run_rwkv.bat

模型位置等参数:见config.yml(复制example.config.yml)。

torch

可使用内置脚本对模型量化,运行:cov_torch_rwkv.bat。此操作可以加快启动速度。

在安装vc后支持一键启动CUDA加速,运行:run_rwkv_with_vc.bat。强烈建议安装!!!

cpp

可使用内置脚本对torch版模型转换和量化。 运行:cov_ggml_rwkv.bat

设置strategy诸如"Q8_0->8"即支持量化在cpu运行,速度较慢,没有显卡或者没有nvidia显卡的用户使用。

注意:默认windows版本文件为AVX2,默认Liunx版本文件是在debian sid编译的,其他linux发行版本未知。

可以查看:saharNooby/rwkv.cpp,下载其他版本,或者自行编译。

llama

运行:run_llama.bat

模型位置等参数:见config.yml(复制example.config.yml)。

基于本项目的二次开发

项目调用闻达的 api 接口实现类似于 new bing 的功能。 技术栈:vue3 + element-plus + ts

Star History Chart