1.快手快 star
描述一下上传文件,提问到显示答案整个数据流以及涉及到的模块/技术栈
后端服务是基于 Spring Boot 3 构建的,文件上传时会用到 MinIO 和 Kafka,MinIO 用来存储文件,Kafka 用来做文件异步解析。
消费者会从 MinIO 中拉取文件,然后使用 Tika 解析分块后调用 embedding 模型生成向量,并且文本、向量存入到 ElasticSearch 中。
用户提问后会先对问题向量,然后在 ElasticSearch 中执行混合检索,一方面做向量的相似度检索、语义召回,另一方面结合 BM25 做关键词检索。
然后将检索到的上下文拼接到 prompt 一并发给大模型生成答案。后端通过 webflux 的 SSE 进行流式返回,前端实时进行渲染。
怎么 chunk 的,为什么这么做?
我采用了基于语义边界的递归切分策略。具体做法是先按照段落进行切分,如果某一块超过了设计的分块大小,就用降级的句号进行拆分,直到每个 chunk 都控制在规定的范围内,通常在 500 个字内。
同时我还引入了 overlap,设置为 10%,这样相邻的 chunk 会有一小段内容重叠,避免关键语义被切断。
这么做主要有三个原因,embedding 模型本身有输入长度限制,分块是向量化的前提;语义集中的 chunk 在混合检索时也会更容易被精准召回;重叠的 overlap 能提供更好的上下文信息。
用的什么模型,有对比过吗
向量这块一开始用的豆包,但后来不向下兼容 2048 维,于是就切换到阿里的 embedding 模型。
LLM 这块一直用...
热门评论
290 条评论
回复