Dynaseal-面向未来端侧llm agent的llm api key分发机制

news/2024/11/6 10:33:11/文章来源:https://www.cnblogs.com/studyinglover/p/18529447

为什么要有这个项目

试想一下,在未来 llm agent 在端侧全面铺开,但是目前调用大模型的方式通过了是一个拿到了就可以随便使用的 api-key?那用户岂不是从端侧的模型拿到了 api-key 就可以刷爆你的账单?!!!如果每个人的手机都跑着几个 agent,你还有一堆用户,那你服务器岂不是比被 ddos 了还惨,因为 ddos 是不让你提供服务,而这种情况下相当于正常业务还在运行而你被打爆了!

所以,我们提出了缄密 Dynaseal,一个面向未来端侧 agent 模型调用的服务端框架,通过一个类似于 oss 的动态 token,限制端侧 agent 可调用的模型和参数以及 token 存活时间,支持端侧直接和大模型服务商通信并在响应结束后通过回调告知你的业务后端。欢迎各位大佬批评指正 star。

请注意,本项目只是一个 demo,实现了我们对于动态分发 api key 从端侧请求大模型相应的设计,大模型部分被设计成一个 openai api 格式的大模型服务器的 warper。对于端侧的请求,我们只做了简单的密钥完整性校验和参数校验。请求结束的回调只实现了在终端的打印。

系统设计

架构分为 llm 服务端,后端和客户端三部分。

  1. 后端初始化,向 llm 服务端请求大模型 api-key
  2. 客户端初始化,向后端业务鉴权接口请求,通过后后端返回动态 key, 指定模型,token, 请求地址和模型等基本信息。
  3. 客户端使用动态 key 向大模型服务端请求模型
  4. 大模型服务端解包动态 key,确定身份后生成并返回响应
  5. 大模型服务端通过后端的回调通知后端客户端的请求和响应

sequenceDiagramparticipant 后端 as 后端participant 客户端 as 客户端participant LLM服务端 as LLM服务端Note over 后端: 初始化后端->>LLM服务端: 请求大模型api-keyLLM服务端-->>后端: 返回api-keyNote over 客户端: 初始化客户端->>后端: 请求业务鉴权后端-->>客户端: 返回动态key, 包括可调用的模型, token等客户端->>LLM服务端: 使用动态key请求模型LLM服务端->>LLM服务端: 解包动态key, 确定身份LLM服务端-->>客户端: 返回响应LLM服务端->>后端: 通知客户端的请求和响应

动态 key 设计

动态 key 被设计为一个 jwt token,即header.payload.secret

  • header
  • payload:首先生成一个格式如下的 json,然后打包成 jwt payload
{"api-key": 111, // 后端在llm服务端注册的用户的id,请注意,是id而非llm server给出的key"model": "deepseek-chat", // 端侧可调用的模型名"max_tokens": 100, // 最多可以调用的token数量"expiring": 111, // 过期时间,使用unix时间戳"event_id": 111 // 时间id,用于表示此token,llm服务端响应完请求会在调用中带上此enent_id
}
  • secret:使用后端在 llm 服务端注册的用户请求出来的 key 加密,llm 服务端会使用这部分校验动态 key 是否合法

具体实现

文件夹说明

  • llm-server 大模型后端,是我们常规使用中调用的服务器,在普通的 api 调用基础上加入了我们的设计-对动态 kay 进行鉴权并响应
  • backend 业务后端,购买了大模型 api key 的公司/个人提供服务的后端,可以对端侧进行鉴权然后下分 dongtaikey
  • client 端侧,是运行 agent 的地方

数据库创建

llm 服务端

User表下面创建用户如下,该用户账号密码是user1:user1

{"_id": {"$oid": "671249a93f1cf2f8bf9b2b82"},"api_keys": [{"_id": null,"revision_id": null,"api_key": "4d72c063-881f-45fa-85ab-3375c84f5dd7","last_used": 0}],"email": "user1@example.com","password": "$2b$12$QFk6uHDBM5s69uSXrchivOC5SbpTUGV4tjmWz0nRvPSiMt.WAZVhC","total_tokens": 0,"username": "user1","callback_url": "http://127.0.0.1:9000/v1/callback/usage"
}

业务后端

User表下面创建用户如下,该用户账号密码是client1:client1

{"_id": {"$oid": "671247fadb2faa4fec2c6f39"},"api_keys": [],"email": "client1@example.com","password": "$2b$12$fWy.Yjs9x5zSRirRibjliO4GX66GSO/.GuG7he9lIatuiNDoPPb9a","username": "client1"
}

环境变量

llm 服务端

SECRET_KEY //jwt密钥
ALGORITHM //jwt加密算法
ACCESS_TOKEN_EXPIRE_MINUTES //jwt access token过期时间
REFRESH_TOKEN_EXPIRE_MINUTES //jwt refersh token过期时间
MONGODB_URL // mongo数据库地址
MONGODB_DB // mongo数据库名
ADMIN_USER_PASSWORD // 管理员密码
OPENAI_BASE_URL // warp的openai base url
OPENAI_API_KEY // warp的openai api key

业务后端

LLM_USER_ID 是业务后端在 llm 服务端注册的用户的 id,LLM_KEY 是业务后端在 llm 服务端注册的用户申请到的密钥

SECRET_KEY //jwt密钥
ALGORITHM //jwt加密算法
ACCESS_TOKEN_EXPIRE_MINUTES //jwt access token过期时间
REFRESH_TOKEN_EXPIRE_MINUTES //jwt refersh token过期时间
MONGODB_URL // mongo数据库地址
MONGODB_DB // mongo数据库名
ADMIN_USER_PASSWORD // 管理员密码
LLM_KEY = "4d72c063-881f-45fa-85ab-3375c84f5dd7"
LLM_USER_ID = "671249a93f1cf2f8bf9b2b82"

接口约定

  • llm_server_url: http://127.0.0.1:8000

  • backend_url: http://127.0.0.1:9000

  • backend_url/user/login: 用户登陆

    • data
      • username
      • password
    • response
      • access_token: 后续和业务后端交互需要带上此 token
      • refresh_token:用于刷新 access token
      • token_type
  • backend/key/create: 生成动态 key

    • header
      • bearer
    • response
      • token: 动态 key,和 llm 服务端交互作为 Authorization 请求头
  • llm_server_url/chat/completions: 请求大模型,这个请求会校验端侧的请求,对于不合适的请求会抛出错误

    • header
      • Authorization
    • body
      同 openai 格式
    • response
      同 openai 格式
  • backend_url/callback/usage: 回调接口,在 llm 服务端响应端侧请求结束后,llm 服务端会发送请求告知业务后端该次请求的内容和 token 数量

    • event_id:动态 key 的 event_id
    • content: 大模型相应的内容
    • tokens: 大模型消耗的 token 数量

启动项目

  1. 启动 llm server
cd llm-server
python main.py
  1. 启动业务后端 backend
cd backend
python main.py
  1. 运行 client,查看是否调用成功
cd client
python request_side.py

运行成功后 client 的终端可以流式输出,backend 的终端打印出evnet_id,contenttokens

client 终端

backend 终端

未实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/827531.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用SeaTunnel从InfluxDB同步数据到Doris

本文介绍了如何使用SeaTunnel将数据从InfluxDB同步到Doris。通过SeaTunnel强大的数据集成功能,用户可以高效地将存储于InfluxDB中的时间序列数据传输至Doris,便于数据的访问与分析。版本信息: SeaTunnel 2.3.3 InfluxDB 2.7.6 Doris 2.1.3 rc09准备事项 SeaTunnel2.3.3的安装…

CMU_15445_P2_Extendible_Hash_Table

到Project2, 我们依然在处理数据库存储相关的部分, 从 Project1 中我们应该Get到两个概念:数据库底层数据操作的基本单元是 Page. buffer_pool_manager 是管理以及组织数据单元Page的工具, 在Project2的第一部分, 我们还新增了页面守护(PageGuard)的机制更加优雅的获取以及释放…

关于pacman更新时出现error: GPGME error: No data 解决方法

问题复现 基本上我隔一段时间就会出现这个问题,每一次都是在网络上寻找相关命令来解决,但是却不明白为什么会出现这个问题。 问题大概是这样的但是有一位博主详细的帮忙解答了问题,大概的意思是指:pacman 在更新数据库文件时会尝试下载每个仓库的 .db.sig 文件,这是数据库…

Zabbix7.0教程:新增Browser监控项

1 前言 Zabbix 7.0.0版本之后,增加了“Browser”监控项类型,即浏览器监控,能够使用浏览器监控复杂的网站和web应用。 浏览器监控项允许执行用户定义的JavaScript代码来模拟与浏览器相关的操作,例如点击、输入文本、网页导航等。该监控项通过HTTP/HTTPS收集数据,并部分…

ABB机器人维修示教器线缆常见的故障现象

在工业自动化领域,ABB机械手是一款广泛应用的设备,其示教器线缆的正常运行对于机械手的稳定工作至关重要。然而,在实际使用过程中,示教器线缆可能会出现各种故障,影响机械手的正常操作。本文将介绍ABB机器人示教器线缆常见的故障现象及相应的ABB机器人维修解决方案。 一、…

[GXYCTF2019]Ping Ping Ping 1 - Xxiaoma解题

打开后,发现显示一个 /?ip= 我们直接在url里添加/?ip=127.0.0.1,发现有回显,这时候就可以用分号;来进行命令链接执行了。 输入url/?ip=127.0.0.1;ls 回显出来两个php文件!直接构造payload:/?ip=127.0.0.1;cat /flag.php才发现没那么简单,回显过滤了空格,可以使用$IFS…

manim边学边做--三维的点和线

Manim 提供了一系列专为三维空间设计的对象,让创建三维数学动画变得更加轻松。 本篇开始介绍其中最简单的点和线相关对象,也就是Dot3D(三维的点),Line3D(三维的线)和Arrow3D(三维的箭头)。Dot3D用于表示三维空间中的点,是构建其他复杂三维图形的基础,它适用于标记关…

洛谷题单指南-二叉堆与树状数组-P2168 [NOI2015] 荷马史诗

原题链接:https://www.luogu.com.cn/problem/P2168 题意解读:把单次替换成k进制字符串,使得替换后文本内容最短,典型的哈夫曼编码应用。 解题思路: 要把单词转成k进制字符串,根据哈夫曼编码的原理,可以依次将k个出现次数最少的单词进行合并,最后得到一棵树,每个非叶节…

.Net Core NPOI 导出多级表头

想要导出这样的表格 数据准备格式附上源码1 using NPOI.HSSF.UserModel;2 using NPOI.SS.UserModel;3 using NPOI.SS.Util;4 using System.Data;5 using System.Text.RegularExpressions;6 7 namespace TestConsoleApp8 {9 /// <summary>10 /// 导出Excel11 …

Nacos原理汇总

今天就应某位小伙伴的要求,来讲一讲Nacos作为服务注册中心底层的实现原理不知你是否跟我一样,在使用Nacos时有以下几点疑问:临时实例和永久实例是什么?有什么区别? 服务实例是如何注册到服务端的? 服务实例和服务端之间是如何保活的? 服务订阅是如何实现的? 集群间数据…

人工智能模型训练中的数据之美——探索TFRecord

上一篇:《构建人工智能模型基础:TFDS和Keras的完美搭配》 序言:在人工智能模型的训练过程中,如何高效管理和处理大量数据是一个重要的课题。TensorFlow 的 TFRecord 格式为大规模数据存储和处理提供了一种灵活且高效的解决方案。在本节知识中,我们将介绍如何利用 TFRecord…

教师提前批试讲-注意事项

教师提前批试讲-注意事项