表结构设计
表
用户,聊天记录,回测结果,关联钱包(实际上用的是内置PG中的数据),关联KOL
关键字段
关联钱包:是否是聪明钱
用户:是否是管理员
聊天记录:发收ID,消息内容,聊天类型(私,群)
四大内容
用户登陆鉴权
首次登陆拿到系统签发的JWT Token,后续请求HTTP通过Authorization Header携带,Websocket通过URL参数传递。服务层收到请求后校验,提取出用户ID注入到请求上下文
Token中有啥
payload中放用户ID、签发时间、过期时间
区别:HTTP鉴权每次请求都验证,Websocket只在握手阶段验证
验证通过后,把conn, uid放到2个map中
总体流程总结:
- 用户发起登陆请求
- 查询密码
- 2通过后,生成JWT Token返回Token
- 后续请求携带Token
HTTP鉴权流程总结:
- 发起请求,Header Authorization: Bearer XXX
- JWT中间件验证签名和过期时间
- JWT中间件提取uid,注入到request.context
- 根据uid查询用户数据返回
Websocket鉴权流程总结
- 发起请求:Header:websocket:token
- 提取Token,解析拿到uid
- HTTP升级到websocket
- 请求添加连接到map
- 如果map中已有链接则清理,建立双向映射
- 开发消息
- 连接断开,清理map
聊天服务
整体架构:用户接入,ws管理连接,消息路由,业务CRUD
ws连接管理:
- 认证后升级
- 注册新连接,关闭旧连接,实现单点登录
- 启动处理协程
消息处理:
- 协程无限循环,JWT Token拿到UID强制覆盖SendID
- 解析消息,根据消息类型路由到群聊/私聊
- 对话消息入库
- 生成会话ID
消息推送
- 遍历用户id推送消息(如果是私聊先生成会话ID)
- 实现消息可靠性(ACK,消息队列,用户上线后主动拉取)
- 异常连接、panic、超时连接处理
助手服务
总体流程:自然语言-> 提取uid -> 加载用户对话历史 -> 路由决策 -> 多轮调用tools -> 返回响应
路由设计
整体架构
自然语言-> 路由决策 -> 处理器层 -> 工具调用层 -> 业务逻辑层 -> DB
处理器层与记忆管理层相连,处理用户会话
路由流程:自然语言 -> 加载对话历史 -> 构建提示词 -> call llm -> 解析输出 -> 看情况使用制定处理器/默认处理器 -> 返回结果
处理器:
- 实现handler接口,定义方法:name, description, chains
Agent设计
工作流程
- 自然语言输入
- 循环分析输入,调用对应参数类工具
- 用参数调用动作类工具
- 完成任务
提示词设计
- 提供工具列表,包括工具名、输入、输出
- 定义思考和行动格式
工具描述设计
- 明确使用场景
- 说明参数格式
- 说明依赖关系
会话记忆设计
会话隔离
一个map,key是uid,value是用户memory
用户请求时,JWT Token中提取uid注入到context,利用uid查找是否存在memory
用互斥锁保证map的并发访问
摘要缓冲
当上下文过长怎么办?
长期记忆(摘要)+短期记忆(历史对话)设计
没超过阈值,直接保存到短期记忆
否则,调用LLM压缩context生成摘要,覆盖式更新长期记忆
加载记忆时,同时加载短期和长期记忆
降级策略设计:默认处理器返回普通对话内容,错误处理器返回错误信息
知识库
总体逻辑:根据用户输入判断,是读知识库,还是写知识库
读知识库:先检索TopK个向量,生成答案
写知识库:提取、清理、分块、向量化输入文本,存到数据库
文档提取入库流程
- 确认文件是否存在
- 拿到doc对象
- 遍历doc,拿到每一页的文本内容追加到buffer
- 清理文本
- 返回处理结果
语义检索与智能问答
流程
- 自然语言输入
- 首次调用,初始化向量存储
- 输入问题转化为向量,TopK检索,返回文档
- 构建提示词,call llm生成答案
- 返回结果
TopK优化 + 答案输出优化
知识库更新机制
- Agent解析上传内容
- 结构化解析,如果失败,JSON解析
- 调用PDFProcessor,设置chunk,overlap
- 向量存储初始化
- 切块,向量化,存储
- 返回结果
知识库处理器设计
两个knowledge: update + retrieval
如果上传同一文件,比对更新时间戳,覆盖式更新
参数设置:chunk大小,chunk重叠区域大小