Skip to content

ylsdamxssjxxdd/eva

Repository files navigation

机体

直观的大模型应用软件:机体 (qt5+llama.cpp)

[ 中文 | English ]

视频介绍 https://www.bilibili.com/video/BV15r421h728/?share_source=copy_web&vd_source=569c126f2f63df7930affe9a2267a8f8

特点

  • 轻量
    • 机体没有其它依赖组件,就是一个exe程序
  • 兼容性
    • 最低支持32位windows7
    • 具有编译到(linux,macos,android)的潜力
  • 直观
    • 清晰的展示大模型预测下一个词的过程
    • 输出区的内容就是模型的全部现实
  • 多功能 (全都有就是效果不咋地)
    • 本地模型,在线模型,api服务,智能体,多模态
    • 知识库问答,代码解释器,软件控制,文生图,声转文
    • 模型量化,模型评测

快速开始

  1. 下载一个机体
  1. 下载一个gguf格式模型
  1. 装载!
  • 点击装载按钮,选择一个gguf模型载入内存
  1. 发送!
  • 在输入区输入聊天内容,点击发送

功能介绍

  1. 对话模式
  • 机体的默认模式,在输入区输入聊天内容,模型进行回复
  • 可以事先约定好角色
  • 可以使用挂载的工具,但是会影响模型智力
  • 可以上传csv格式的题库进行测试
  • 可以按f1截图,按f2进行录音,截图和录音会发送给多模态或whisper模型进行相应处理
  1. 补完模式
  • 在输出区键入任意文字,模型对其进行补完,这是机体所有功能实现的基础
  1. 服务模式
  • 机体成为一个开放api端口的服务,也可以在网页上进行聊天,但是挂载的工具失效
  1. 链接状态
  • 机体可以链接到其它api服务的对话端点,不需要装载模型也能运行
  1. 知识库
  • 用户可以上传文档,经过嵌入处理后成为模型的知识库,挂载后可供模型调用
  1. 文生图
  • 可以使用sd模型绘制图像,挂载后可供模型调用
  1. debug模式
  • 下一个词的预测由用户手动控制,可以获取更多模型运行的信息
  1. ...

源码编译

  1. 配置环境
  1. 克隆源代码
git clone https://github.com/ylsdamxssjxxdd/eva.git
  1. 根据CMakeLists.txt文件中的说明修改相应配置
  2. 编译

行动纲领

  • 装载流程
    • 【ui】->用户点击装载->选择路径->发送设置参数->【bot】->处理参数->发送重载信号->【ui】->预装载->装载中界面状态->发送装载信号->【bot】->开始装载->发送装载动画信号->装载完重置->发送装载完成信号->【ui】->加速装载动画->装载动画结束->滚动动画开始->动画结束->强制解锁->触发发送->发送预解码(只解码不采样输出)指令->【bot】->预解码系统指令->发送解码完毕信号->【ui】->正常界面状态->END
  • 发送流程
    • 【ui】->用户点击发送->模式/标签/内容分析->对话模式的话->推理中界面状态->发送输入参数->发送推理信号->【bot】->预处理用户输入->流式循环输出->循环终止->发送推理结束信号->【ui】->正常界面状态->END
  • 约定流程
    • 【ui】->用户点击约定->展示最近一次配置->点击确认->记录用户配置->发送约定参数->【bot】->记录用户配置->发送约定重置信号->【ui】->触发界面重置->发送重置信号->【bot】->初始化模型运行所需组件->发送重置完成信号->【ui】->如果系统指令变化则预解码->END
  • 设置流程
    • 【ui】->用户点击设置->展示最近一次配置->点击确认->记录用户配置->发送设置参数->【bot】->记录用户配置->分析配置变化->END/发送重载信号/发送设置重置信号->【ui】->预装载/触发界面重置->END
  • 预解码图像流程
    • 【ui】->用户上传图像/按f1截图->触发发送->推理中界面状态->发送预解码图像指令->【bot】->预解码图像->占用1024个token->发送解码完毕信号->【ui】->正常界面状态->END
  • 录音转文字流程
    • 【ui】->用户初次按下f2->需要指定whisper模型路径->发送expend界面显示信号->【expend】->弹出声音增殖界面->选择路径->发送whisper模型路径->【ui】->用户再按f2->录音界面状态->开始录音->用户再按f2->结束录音->保存wav文件到本地->发送wav文件路径->【expend】->调用whisper.exe进行解码->解码完毕保存txt结果到本地->发送文字结果->【ui】->正常界面状态->显示到输入区->END
  • 工具调用流程
    • 【ui】->用户点击发送->模式/标签/内容分析->对话模式的情况->推理中界面状态->发送输入参数->发送推理信号->【bot】->预处理用户输入->流式循环输出->循环终止->发送推理结束信号->【ui】->提取模型本次输出中的json字段->发送json字段->发送工具推理信号->【tool】->根据json字段执行相应函数->执行完毕返回结果->【ui】->将返回结果作为发送内容并添加观察前缀->触发发送->···->没有合理的json字段->正常界面状态->END
  • 构建知识库流程
    • 【expend】->用户进入知识库选项卡->用户点击选择模型->选择嵌入模型->启动server.exe->启动完成->自动将server的v1/embeddings端点写入地址栏->用户点击上传选择一个txt文本->文本分段->用户可以按需求修改待嵌入文本段内容->用户点击嵌入文本段->将每个文本段发送到端点地址并接收计算后的词向量->表格中显示已嵌入文本段->发送已嵌入文本段数据->【tool】->END
  • 知识库问答流程
    • 【ui】->工具调用流程->json字段中包含knowledge关键字->发送json字段->发送工具推理信号->【tool】->执行knowledge函数->向嵌入端点发送查询字段->【server】->返回计算后的词向量->【tool】->计算查询字段词向量和每个已嵌入文本段词向量的余弦相似度->返回三个相似度最高的文本段->【ui】->将返回结果作为发送内容并添加观察前缀->触发发送->···->没有合理的json字段->正常界面状态->END
  • 链接流程
    • 【ui】->用户右击装载->配置ip和端点->点击确认->锁定界面->记录配置->连接测试->测试通过->解锁界面->END
    • 链接状态下的其它流程与上面类似,【bot】替换为【net】
  • debug流程
    • 拉动状态区向上可弹出debug按钮
    • 用户开启debug按钮,第一次点击发送后,进入debuging状态
    • debuging中点击Next不再传递任何上下文(系统行为除外),而是由模型继续执行下一次解码和采样
    • 当 检测到停止标志/达到最大输出长度/手动停止 时才能退出debuging状态,工具调用时强制执行

概念

  • eva 机体: 由拘束器(行动纲领)和素体(llama.cpp)组成,大模型是驾驶员,用户是指挥员
  • model 模型: 由一个公式(神经网络结构)和一组参数(连接权重)组成,执行解码操作(利用输入的文字预测下一个词)
  • token 词元: 词的编号,例如,你好 token=123,我 token=14,他的 token=3249,不同模型编号不一样
  • vocab 模型词表: 该模型训练时所设置的全部词的token,不同模型词表不一样,词表中中文占比越高的往往中文能力强
  • ctx 上下文: 包括控制模型解码的一套参数和上下文缓存,占用内存与模型词表大小、上下文长度、批大小、模型大小有关
  • kv cache 上下文缓存: 即历史解码信息,相当于模型的记忆
  • n_ctx_train 最大上下文长度: 该模型训练时能送入解码的最大token数量
  • n_ctx 上下文长度: 用户设置的解码时模型能接受的的最大token数量,不能超过n_ctx_train
  • vecb 向量表: 模型对上下文缓存和送入的token进行解码得到的结果
  • temperature 温度: 采样时会根据温度值将向量表转为概率表,温度越高随机性越大
  • prob 概率表: 模型词表中全部token的选用概率,用来预测下一个token
  • lora model 低秩适配器: 在原有模型上额外挂载一个简单的模型,可以改变模型的输出风格,不支持cuda加速

行为

  • 预解码: 对用户约定的系统指令预先进行解码,用户修改系统指令/达到最大上下文后会执行
  • 重置: 删除系统指令以外的缓存,并清空输出区;若正在预测,则终止,不进行其他操作
  • 机体装载: 将模型结构和模型权重载入内存,相当于驾驶员进入机体进行同步
  • 机体重载: 重新装载模型,修改解码参数/从网页模式切换/选择新模型时会执行
  • 机体展开: 服务模式启动,对外提供网页服务和api服务
  • 机体链接: 机体连接到外部api服务,不用装载也可运行
  • 机体过载: 上下文缓存达到设置的上下文长度则舍弃前半段缓存
  • 机体混淆: 机体的模型控制部分xbot解码时发生故障
  • 机体崩溃: 模型结构或路径存在问题导致装载失败

待办事项

  • 适配linux
  • 适配国产cpu/gpu
  • 英文版本(已完成)

已知BUG

  • 模型推理有内存泄漏,定位在xbot.cpp的stream函数,待修复
  • 链接模式下,无法无间隔的连续发送,通过定时100ms后触发来缓解,定位在xnet.cpp的QNetworkAccessManager不能及时释放,待修复
  • 多模态模型输出异常,需要向llava.cpp对齐,待修复

  • 达到最大上下文长度后截断一次后再达到,解码会失败,通过暂时置入空的记忆来缓解,定位在xbot.cpp的llama_decode返回1(找不到kv槽),没修复(实际上是截断后,送入的token数量与保留的部分依旧超过最大上下文长度,需要再截断一次)
  • 部分字符utf-8解析有问题,已修复(模型输出不完整的utf8字符,需要手动将3个拼接成1个)
  • 切换模型时显存泄露,已修复(使用cuda时,不使用mmp)
  • mingw编译的版本装载时无法识别中文路径,定位在llama.cpp的fp = std::fopen(fname, mode);,已修复(利用QTextCodec::codecForName("GB2312")将字符转码)
  • csv文件存在特殊符号时不能正确解析,定位在utils.cpp的readCsvFile函数,已修复(利用一个改进的解析方法,依赖于一个简单的状态机来跟踪文本段是否位于引号内部,以正确处理字段内的换行符)