ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Redis接入AI实战:向量检索、语义缓存与Agent记忆落地指南

Redis接入AI实战:向量检索、语义缓存与Agent记忆落地指南 最近圈子里聊的最多的除了各家大模型又发了什么新版本就是Redis 已正式接入 AI这个动静。乍一听有点抽象Redis 不是个缓存嘛跟 AI 有什么关系但如果你这几天跟过 Redis 官方的新文档或者试着把 Redis 装到大模型应用的栈里就会发现这件事比想象中实在得多——它不是在名字里蹭个 AI 的热度而是把向量检索、语义缓存、AI Agent 记忆这些能力都变成了能直接落地的 Redis 功能。我花了两天时间把官方方案和自己平时用的套路做了个对比又动手跑了几轮测试。这篇文章不打算给你抄官方公告那东西翻译腔太重看着累。我就站在一个天天跟 Redis 打交道、也被大模型应用折磨过的开发者的角度讲讲这次RedisAI到底能干什么、怎么最快用上、以及有哪些文档里不会写但实操一定会遇到的坑。1. 这次Redis接入AI到底是什么1.1 一句话理解RedisAI的三种主要姿势先说结论Redis 接入 AI 不是一个单一功能它至少包含了三条并行的线分别是给 AI 应用当缓存、给 AI 应用当向量数据库、给 AI 应用当记忆存储。三条线其实各自成熟度不一样但官方把它们整合成了一整套对外输出的能力所以你才会看到一个大版本的更新里同时出现了向量集合、语义缓存插件、还有类似AI Quote这样的模块。给 AI 应用当缓存好理解。你把同样的 Prompt 发给大模型每次都要消耗 token都要等几百毫秒甚至几秒。如果 Redis 把之前算过的结果缓存下来下次一模一样的请求直接秒回既省钱又省时间。更进一步的是语义缓存它不要求 Prompt 完全一致只要意思相近比如帮我总结这篇文档和总结一下这篇文章就能命中同一条缓存。这背后用的是向量化加相似度匹配Redis 6.2 之后的 Search 模块直接支持向量索引所以这件事可以在 Redis 内部完成不需要额外搭一套向量数据库。当向量数据库用也很直接。大模型应用免不了要做私有知识库问答你要把 PDF、网页、数据库记录切块、转成 embedding 向量然后存起来用户提问时再从里面找最相关的几段拼进 Prompt。以前这个环节大家喜欢用专门的向量库比如 Milvus、Weaviate、Chroma总感觉术业有专攻。但如果你团队里已经躺着好几台 Redis数据量在几十万条以内那么直接用 Redis 的向量索引就够了少维护一套组件少承担一份数据同步的复杂度。当记忆存储是最近特别受关注的一点。AI Agent 跟普通的问答不一样它需要记住多轮对话里的关键信息、用户的偏好、任务的状态。这些信息可以用 Redis 的 Hash、JSON、Stream 结构来组织。Agent 每执行一步就往 Redis 里写一笔状态下次恢复会话再把这些状态读出来。比把记忆塞在内存变量里靠谱比写在文件里又更适合并发访问。1.2 为什么这事值得关注很多人第一反应是Redis 就是个缓存工具硬蹭 AI 概念。但我实测下来发现官方这次不是做表面功夫。Redis 原本的数据结构就非常适合 AI 应用里那些轻量、高频、低延迟的存取场景。你想想看大模型应用最怕的就是响应慢而 Redis 的延迟基本在亚毫秒级最怕的就是成本失控而命中缓存能省掉一大半的 token 费用最怕的就是状态丢失而 Redis 有 RDB 和 AOF 两种持久化方案专门为恢复而生。另外从工程架构的角度看现在很多 AI 应用都在用 Python 的 FastAPI 或者 Node.js 做后端Redis 客户端生态非常成熟官方还提供了 RedisLangChain、RedisVearch 这类集成库。这意味着你不用写一堆胶水代码原本需要自己做嵌入、建索引、调相似度算法的活现在很多都能靠 Redis 命令完成。对于中小团队来说这是把 AI 应用从能跑推向能上线的性价比最高的方案之一。我觉得还有一层更实际的意义Redis 这么多年积累下来的运维经验可以直接复用。你会配置主从、集群、哨兵这些经验在 Redis 作为 AI 组件的时候同样适用不至于像引入一堆新组件那样需要重新踩一遍部署和监控的坑。这也是我为什么愿意花时间写这篇文章的原因——它不是让你从零学一套新数据库而是把你已有的 Redis 技能迁移到 AI 场景里。2. 最常用的场景给LLM套一个Redis缓存2.1 传统Prompt缓存的痛点先不聊那些花哨的我们聊最实在的。现在做 AI 应用无论你是接 OpenAI、文心、通义还是本地部署的模型只要走 API 调用就要面对两个问题钱和时间。我见过一个团队每天光调用模型就烧掉上千块其中差不多一半是重复请求。用户反复问同一个问题或者多个用户在问高度相似的问题后台却每次老老实实调一次模型。传统做法是把 Prompt 的文本本身当 key直接查 Redis。但这里有个致命问题用户的表达方式太多了。哪怕两个人想问同一个事打出来的字也可能完全不同。你拿原文做 key缓存命中率可能连 10% 都不到。后来有团队尝试用哈希把 Prompt 做归一化、去掉停用词、排序后再算 MD5仍然解决不了同义改写的问题。真正靠谱的方案是语义缓存——意思相近就算命中。语义缓存的思路是把用户的问题也转成向量然后去 Redis 里查一下有没有一个历史问题的向量跟当前问题的余弦相似度大于某个阈值比如 0.92。如果有就直接返回当时缓存的答案如果没有就调用模型再把新的问题和答案一起存进去。2.2 用Redis实现语义缓存代码实操实操之前你需要确认 Redis 版本和模块。官方推荐的路径是装 Redis Stack它打包了 Search、JSON、TimeSeries 这些模块用起来最省事。Docker 一行就能起docker run -d --name redis-stack -p 6379:6379 -p 8001:8001 redis/redis-stack:latest如果你是 macOS 用户想本机直接装可以用 Homebrewbrew tap redis/redis-stack brew install redis-stack装好之后用 Python 验证一下向量索引是否可用。我用的是redis-py和redisvl这个官方辅助库前者处理基础连接后者封装了向量索引的创建和语义缓存逻辑。先把必要的库装上pip install redis redisvl sentence-transformerssentence-transformers是个本地嵌入模型库我测试时用的是all-MiniLM-L6-v2它只有 80MB 左右CPU 就能跑生成的是 384 维向量。对中文场景你也可以换BAAI/bge-small-zh效果会更好。接下来创建语义缓存索引。我用 RedisVL 的语义缓存类它帮我们把 检索向量 - 比较相似度 - 返回缓存结果 - 写入缓存 整套逻辑封装好了。核心代码像这样from redisvl.extensions.llmcache import SemanticCache from sentence_transformers import SentenceTransformer # 本地模型先把 embed 函数接好 model SentenceTransformer(sentence-transformers/all-MiniLM-L6-v2) def embed(text: str): return model.encode(text).tolist() # 连上 Redis指定索引名称和向量维度 sem_cache SemanticCache( redis_urlredis://localhost:6379, embedderembed, distance_threshold0.08, # 这个值后面细说 vector_dim384, # 必须跟模型输出对齐 ttl3600 # 缓存一小时 ) # 用的时候就这样 question 用三句话说明白什么是分布式锁 cached sem_cache.retrieve(question) if cached: print(命中缓存, cached[0][answer]) else: answer 分布式锁就是通过一个公共资源来协调多进程互斥访问共享资源的一种机制核心是保证同一时刻只有一个客户端持有锁。 sem_cache.store(question, answer)看到这里你可能会问distance_threshold是什么它其实是欧氏距离的阈值。Redis 向量相似度默认支持欧氏距离数值越小表示越相近。0.08 大约对应余弦相似度 0.92 左右具体换算关系不是一个简单公式但可以用一批测试数据去调。如果你用的是 Redis 命令直接创建索引也可以显式地把距离算法设成COSINE这样distance_threshold就表示余弦相似度的阈值0.92 就是相似度超过 0.92 则命中。2.3 缓存参数怎么调不翻车第一次跑通之后你会遇到一个哭笑不得的问题缓存命中率要么极高把一些不该复用的答案也复用了要么极低跟没做没啥区别。问题基本都出在阈值和向量模型上。阈值设太大比如 0.7那几乎任何两句语义沾边的话都会命中结果用户问今天天气怎么样和明天适合跑步吗被当成同一问题缓存里返回一个不着四六的答案。阈值设太小比如 0.99除了完全相同的句子其他都命中不了语义缓存名存实亡。我自己的经验是先从 0.9 开始上下试观察一个星期的日志统计区间里的错误命中和漏命中然后微调。还有一个坑是 embedding 模型语言的差异。all-MiniLM-L6-v2主要针对英文训练中文表现一般。做中文产品的话建议换BAAI/bge-small-zh-v1.5维度默认是 512你得把vector_dim改成 512。另外如果你们的技术栈是 Java 而不是 Python也可以直接用spring-ai配合 Redisson 来实现语义缓存思路完全一样只是 API 名字不同。另外别忘了给语义缓存加 TTL。AI 应用的答案是会过期的——比如昨天的新闻摘要你第二天还用就不合适了。我在项目里对不同业务线设置了不同的过期时间知识库类的问题缓存 24 小时实时数据类的问题只缓存 5 分钟。Redis 的 TTL 每条 key 独立非常便于这种策略。3. 把Redis当向量数据库用3.1 为什么不用专业向量库先声明一个观点如果你们的向量规模到了百万级、千万级或者对召回率有苛刻的要求那还是老老实实用专业向量数据库去。但如果是中小型应用几十万条知识库切片Redis 完全扛得住而且它是自带持久化的。我为什么推荐先用 Redis理由很实际。第一团队里几乎没人不会配 Redis但会搭 Milvus 的人不多出了问题排查也难。第二多一套独立组件就多一套监控、备份、权限控制这个运维成本在小团队里很要命。第三Redis 可以同时承担缓存、状态存储、队列等工作你不用为知识库向量再开一个专门的数据库集群省下来的一台 8C16G 机器一年也能省不少钱。当然Redis 做向量检索也有上限。它的查询性能受限于KNN的扫描方式Redis 的向量索引默认采用 HNSW 图结构查询复杂度是亚线性的但数据量大了之后内存占用秒涨。我实测过 50 万条 384 维向量内存大概吃掉 1.8GB加上原始文档和其他字段2.5GB 上下。这还在可接受范围。但如果到 500 万条内存就是十几 GB还不如上专门的向量库划算。3.2 Redis Search的向量索引配置用 Redis 做向量库最标准的路子是使用 Redis Stack 里的 RediSearch 模块。你不需要先装什么插件Redis Stack 已经内置了。我们以给知识库切片建索引为例完整的流程分三块建索引、写入向量、查询。# 先进入 redis-cli redis-cli创建索引的命令如下。我把doc_chunks作为索引名里面有两个字段一个是text字段存原始切片文本另一个是embedding字段类型是向量维度 384距离算法用余弦相似度FT.CREATE doc_chunks ON HASH PREFIX 1 chunk: SCHEMA text AS TEXT embedding AS VECTOR HNSW 6 TYPE FLOAT32 DIM 384 DISTANCE_METRIC COSINE这里有个细节ON HASH PREFIX 1 chunk:表示这个索引建立在以chunk:开头的 Hash 键上也就是说你往 Redis 里写chunk:1、chunk:2这样的 Hash 键时索引会自动同步不需要手动调索引。如果你用的是 JSON 类型ON JSON也可以但我觉得 Hash 用起来最顺手兼容客户端最广。写入向量时你要提前把文本切片转成向量。假设你已经用模型把一段文档变成了 384 维的浮点数组那写入命令是HSET chunk:1 text Redis 支持向量检索... embedding 0.012, -0.008, 0.112, ...注意 embedding 字段是字符串里面用逗号分隔浮点数。你当然不会手工去写而是在代码里批量写入。Python 代码大概这样import redis, numpy as np from sentence_transformers import SentenceTransformer r redis.Redis(hostlocalhost, port6379) model SentenceTransformer(sentence-transformers/all-MiniLM-L6-v2) slices [Redis 支持向量检索。, AI 应用需要快速查找相关文档。] for i, text in enumerate(slices): vec model.encode(text).astype(np.float32).tolist() vec_str ,.join(str(x) for x in vec) r.hset(fchunk:{i}, mapping{text: text, embedding: vec_str})3.3 相似检索代码及召回率优化检索的时候用FT.SEARCH命令配合KNN查询FT.SEARCH doc_chunks (*)[KNN 5 embedding $vec AS distance] PARAMS 2 vec 0.012, -0.008, ... SORTBY distance DIALECT 4如果你在 Python 里用redisvl可以更优雅一点。我建议直接使用RedisVL的 VectorIndex 类代码如下from redisvl.index import Index from redisvl.query import VectorQuery index Index( namedoc_chunks, redis_urlredis://localhost:6379, ) embedding model.encode(Redis 能不能做向量数据库).astype(np.float32).tolist() query VectorQuery(embedding, return_fields[text, distance], num_results3, vector_field_nameembedding) results index.query(query) for doc in results: print(doc[text], doc[distance])这段代码跑出来的结果就是最相关的三个切片。实际使用里我发现一个提升召回率的技巧给切片加元数据过滤。比如每个切片都带一个category字段查询时先用FILTER把范围约束到某个分类再在约束范围内做向量近邻检索。否则全局检索容易把语义相近但主题不符的切片捞出来拼进 Prompt 之后模型容易答非所问。另一个提升准确度的细节是切片长度不要太长也不要太短。我踩过坑最开始图省事把整段文档作为一条 slice 存进去有的 slice 有两千多字模型生成 embedding 时语义被稀释检索结果飘得离谱。后来我把切片切成 200 到 500 个字之间并且让相邻切片之间有 20% 的重叠召回效果明显稳了。这个原理其实很简单embedding 是整段文本的压缩表示文本越长重要信息越容易被淹没在无关内容里。4. AI Agent的记忆层怎么落在Redis上4.1 Agent记忆的三种类型AI Agent 现在是个热门词但如果你真去搭一个 Agent会立刻发现一个尴尬模型本身是没有记忆的每个请求都是独立的。你让 Agent 先帮我查一下杭州的天气再根据天气推荐行程它第一步查完之后第二步就已经忘了第一步的结果。所以我们必须给 Agent 外挂一个记忆层。记忆分三类。第一类是短期记忆也就是当前会话里的上下文通常放在内存或进程变量里就行但如果 Agent 有多个副本比如跑在 K8s 上的多个 Pod那局部内存就不够了必须用 Redis 这种共享存储。第二类是长期记忆比如用户偏好、历史事件、业务知识这类数据需要持久化Redis 的 AOF 持久化能保证重启不丢。第三类是程序性记忆也就是 Agent 执行过的行动计划、工具调用结果这些通常也用结构化数据存在 Redis 里以便回溯和重试。4.2 用Redis数据结构设计记忆存储我现在喜欢用 Hash 来存长期记忆用 Stream 来存短期会话流。Hash 的好处是可以随时读写单个字段比如用户user:123这个键下面存name、preferred_language、subscription_tierAgent 每次启动时HGETALL一下就能恢复用户画像。Stream 则天然适合追加事件比如用户问了什么 - Agent 调了什么工具 - 工具返回什么 - Agent 最终回答什么这些事件可以顺序写入 Stream后续排查 Agent 行为时直接按时间回放。写一个简单的记忆存储封装import redis, time, json r redis.Redis(hostlocalhost, port6379) def save_user_profile(user_id, profile: dict): mapping {k: json.dumps(v, ensure_asciiFalse) for k, v in profile.items()} r.hset(fprofile:{user_id}, mappingmapping) # 顺便设置过期时间防止用户一年没来还占着内存 r.expire(fprofile:{user_id}, 86400 * 30) def append_agent_event(user_id, event: dict): r.xadd(fstream:{user_id}, event) def read_recent_events(user_id, count50): events r.xrevrange(fstream:{user_id}, countcount) return [item[1] for item in events]这里有几个细节值得注意。一是用xadd追加事件时Redis 会自动生成一个时间戳 ID天然有序你用xrevrange就能拿到最近 N 条。二是如果要控制 Stream 无限增长可以用XTRIM或者设置MAXLEN参数。三是如果多个 Agent 实例在并发写同一个用户的 StreamRedis 的xadd本身保证原子性不会出现交错写入导致的数据错乱这一点比用文件记日志要稳得多。不过要提醒一下不要让 Redis 存一些超大对象。比如你非要把用户上传的 100MB 文件塞进 Redis那不太合适。像这种体积大的内容建议存文件然后在 Redis 里存下载链接和元数据。Redis 里存的东西越轻读写越快越能发挥它低延迟的优势。4.3 Agent会话恢复的完整流程具体到会话恢复的场景我一般这样设计Agent 接收一个新请求时先查session:{session_id}是否存在。不存在就初始化从profile:{user_id}里取出长期记忆把这几天内的stream:{user_id}事件做摘要作为上下文的一部分拼进 Prompt。存在就表示会话还在中途直接把 Redis 存的关键状态比如当前步骤到哪了、已经收集了哪些必要参数、用户最后确认的优先级读出来让 Agent 接着干。有人可能会说这些用关系型数据库也能存。确实能但 Redis 的优势在读取速度和灵活性。Agent 每一步的执行延迟是毫秒级的多查询一次记忆就多几毫秒累计起来体验差距很明显。更何况 Redis 还能给这些记忆设置 TTL比如临时的状态 30 分钟没更新就自动清理不会像数据库表那样需要手动跑定时任务去删旧数据。5. AI反过来帮Redis运维智能化5.1 热点key预测与自动缓存治理Redis 接入 AI 不光是给 AI 当底座的单箭头AI 也在反过来帮 Redis 做运维。我最近被一个客户的问题启发他说他们的 Redis 总是莫名其妙的出现 bigkey导致集群某个分片内存过高然后整个应用抖一下。传统的做法是慢启动人工排查先上redis-cli --bigkeys扫描再翻日志很费劲。现在可以换个思路把 Redis 的 INFO 命令输出、慢日志、内存采样数据定时喂给一个 AI 诊断模块让模型做模式识别。比如热点 key 的访问频次曲线如果出现陡增或者某类 key 的集合成员数量突然变大AI 能提前预测这是不是缓存击穿的隐患然后自动把缓存的 TTL 加长或者对某些 key 做本地缓存预热。我拿自己线上的 Redis 状态数据做了个验证用一个简单的脚本采集每分钟的keyspace_hits和expired_keys指标喂给一个时序预测模型确实能把未来 10 分钟的热点访问趋势预测得八九不离十。实际做的时候不需要自己训练复杂模型。你可以直接用现成的 Prophet 或者 AutoGluon把 INFO 里的used_memory、total_commands_processed、expired_keys这些指标作为特征。代码也不复杂import pandas as pd from prophet import Prophet # 假设 df 有三列 ds, used_memory, total_commands_processed df pd.read_csv(redis_metrics.csv) model Prophet() model.add_regressor(total_commands_processed) model.fit(df[[ds, used_memory, total_commands_processed]]) future model.make_future_dataframe(periods10, freqmin) future[total_commands_processed] predict_commands(future[ds]) forecast model.predict(future)跑完之后如果预测显示used_memory即将超过某个水位线你就可以提前执行MEMORY PURGE或者触发键清理任务。这样比人工盯 Grafana 告警要省心得多。5.2 慢查询日志的AI诊断另一个很实用的场景是慢查询日志分析。Redis 的SLOWLOG GET能拿到执行时间超过阈值的命令但怎么定位是哪个业务引起的往往靠猜。如果 AI 接入之后你把慢日志的内容、执行时间、当时的客户端 IP、相关 key 的集群分布一起打包给大模型它可以从命令模式 key 命名规律 时间规律三个维度快速锁定元凶。举个例子如果你发现慢查询里频繁出现LRANGE user_*_orders 0 -1AI 会识别出这是一个遍历整个 List 的操作大概率是业务方在取用户订单列表时没有做分页。这时候 AI 生成的建议可能是用LRANGE 0 9限定条数或者把大 list 拆分到多个 hash 中。这类诊断意见虽然不是百分百准确但能帮你把排查范围缩小到一个业务接口比盲目扫日志效率高很多。不过要泼一盆冷水AI 诊断慢查询依赖你输入的日志质量。如果你把 Redis 日志原样往里扔里面可能混着大量无用的空命令和超长 key 列表模型的上下文窗口根本不够用。我的经验是先做一轮结构化只提取timestamp、command、key_pattern、duration_us、client_ip然后用聚类算法把相同模式的命令聚合再交给大模型。这样既省 token又让模型更容易抓到规律。5.3 用AI生成Redis命令和排错建议还有一个听着不起眼但实际很提效的方向用 AI 生成 Redis 命令。以前你面试可能会背SETNX、ZINCRBY现在你完全可以拿着业务场景去问大模型我有 10 万个用户要按积分排行榜展示前 100 名该用 Redis 的什么结构 模型会告诉你用 ZSET然后给你生成压测脚本再告诉你什么时候不能用 ZSET比如分数太大或者需要分页模糊搜索。这种场景到命令的转化能力对新手特别友好对老手也能快速查漏补缺。我最近就在自己的内部工具里接入了这个能力。用户输入一句大白话记录用户最近 20 条浏览记录并且每次可以按时间倒序取出AI 就会生成对应的 Redis 数据结构建议和代码片段。这种工具本质上是把官方文档、社区最佳实践、坑点总结都塞进了 Prompt再利用模型推理能力做匹配。如果你要自己搭一个类似工具可以基于 Redis 官方文档的 markdown 做 RAG把文档切片存入 Redis 向量索引再让模型基于检索结果回答。你看这里又回到了向量检索的应用上——AI 辅助 Redis 运维Redis 反过来为 AI 提供知识库检索存储正好形成一个闭环。6. 说点踩坑总结6.1 RedisAI的三大坑第一个坑是版本混乱。很多人照着老教程装 Redis 5、Redis 6结果发现没有 Search 模块向量命令根本跑不起来。我建议直接用 Redis Stack 或者 Redis 7.x 以上并且启动时确认FT.INFO命令存在。如果公司内网不能随便装 Docker那就得跟运维申请提前把模块文件编译好别等代码写完了才发现缺组件。第二个坑是向量维度不匹配。这是新手最容易遇到的模型输出的是 384 维你建索引时写成了 768 维写入时报错或者看起来写入成功但检索时报错。这个错误反复出现的话你换一个模型维度又变了必须在统一的配置中心里管理模型维度。我现在会用环境变量EMBEDDING_DIM384这种形式代码里全局读取避免改了一处漏了另一处。第三个坑是缓存与数据一致性。语义缓存命中时返回的是历史答案但知识库里的一段文档可能已经更新了缓存里的旧答案还没失效。这个问题跟普通 HTTP 缓存的道理一样需要提供主动失效机制。我的做法是在入库新版本文档时手动删除对应语义缓存中的相关 key利用 Redis 的 KEYS 或 SCAN 找到包含该知识库标识的缓存项然后 DEL 掉。这里要注意生产环境别直接用 KEYS要用 SCAN 避免阻塞 Redis。6.2 什么时候别用Redis做AI存储不是所有 AI 应用的数据都适合放 Redis。第一个禁区是海量 embedding。如果你们的数据量是千万级或者需要非常高的召回率那还是选专用的向量数据库Redis 的内存成本会让你肉疼。第二个禁区是强事务的会话数据比如电商订单状态、支付流程这种还是交给事务型数据库Redis 的事务能力跟传统数据库没法比。第三个禁区是超大型文件存储前面说过Redis 适合存轻量状态不适合当对象存储。我在实际项目里会做一个技术选型表经常用这张表来校准设计思路场景推荐方案原因高重复的 LLM Prompt 缓存Redis 语义缓存命中后零推理省 token 省时间百万级以内知识库切片Redis 向量索引部署简单性能足够千万级向量大规模检索专用向量数据库内存成本与召回精度更优Agent 会话状态与用户画像Redis Hash Stream低延迟支持 TTL大文件10MB对象存储 Redis 元数据Redis 不适合大对象如果你正在做一个 AI 应用又恰好对 Redis 很熟那我强烈建议你把上面这几个场景先在测试环境跑一遍。你会发现大部分东西都不需要新建基础设施只需要把脑子里的Redis 只有缓存这个观念更新一下它就能在 AI 栈里发挥比想象中更大的作用。最后分享一个我在实操中反复碰到的小技巧不管用语义缓存还是向量检索一定要给 embedding 的生成过程加一个结果缓存。因为 embedding 模型虽然比大模型便宜但大规模文本切片的向量化也要花不少时间。我在 Python 里用functools.lru_cache包了一层嵌入函数同样的文本不会重复计算配合 Redis 的持久化重启服务后向量直接从 Redis 里读完全不依赖外部模型省下的推理时间非常可观。
返回列表