ARTICLE DETAIL

资讯详情

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

从缓存到AI数据中间件:Redis接入大模型应用的工程实践

从缓存到AI数据中间件:Redis接入大模型应用的工程实践 “Redis 已正式接入 AI ”这句话我在好几个技术群里都看到过转发。老实说刚看到时我并没有太当回事因为 Redis 想往 AI 上靠已经不是第一天了社区里早就有人做向量检索插件、语义缓存中间件各种“野路子”我都跑过。但真正把官方镜像拉下来、把客户端连上去、把一条带 embedding 的请求跑通以后我明显感觉这次不一样它不再是“外挂一个模块”而是把 AI 工作负载当成一等公民来设计了。这篇文章我不打算做新闻转述也不想堆概念就站在一个实际用过、踩过坑、又把这套东西往生产环境里搬过的人的角度把 Redis 接入 AI 这件事拆开讲。适合谁看两类人一类是后端同学你已经很熟 Redis 的缓存用法但不知道 RAG、Agent 记忆、语义缓存到底该怎么落地另一类是算法或全栈同学你每天都在调大模型接口但面对“上下文放哪、历史怎么存、并发怎么锁”这类工程问题时缺乏手感。看完你应该对整体方案、关键命令、数据模型设计、常见故障都有个清晰的认识。1. 这个标题背后Redis 到底改了什么1.1 从“缓存数据库”到“AI 数据中间件”过去我们提起 Redis第一反应就是缓存、计数器、分布式锁、排行榜、消息队列。它就像一个极其好用的内存工具箱什么都能存一点但没人指望它承担复杂的计算。AI 应用接入之后情况变了。大模型本身是无状态的它不记得你昨天问过什么也不知道你的知识库里有什么。所以任何 AI 应用都需要在模型外面挂一套“状态层”和“知识层”用户会话记录、历史消息摘要、知识库切片、向量索引、语义缓存、任务锁。这些东西有两个共同点一是延迟要求极高模型调用本身已经要几百毫秒甚至几秒数据层再慢就彻底没法用二是数据结构五花八门既有简单的 KV又有需要相似性检索的高维向量。Redis 进入 AI 领域本质上就是把这两件事同时接住了。官方在 Redis 8 里把向量数据库相关的检索能力、语义缓存相关的流程以及流式数据的处理能力直接纳入主线而不是让用户在外部插件里折腾。对一个后端开发者来说最直观的变化是过去我要搭一套 RAG得同时维护 Elasticsearch、向量库、MySQL、Redis 四套系统现在相当一部分场景可以只用 Redis 打底把链路缩短一大截。1.2 AI 工作负载需要哪些数据能力我把 AI 场景里最常出现的数据需求列一下你会发现每条都和 Redis 的强项对得上高频读取的配置和上下文模型 temperature、system prompt、用户偏好这类数据要毫秒级读取。会话历史用户和 AI 多轮对话记录需要按时间追加、定期裁剪。知识库切片文档被切分成若干 chunk每个 chunk 有文本、元数据和 embedding 向量。向量相似性搜索用户问题向量化之后找出最相关的 top-K 切片送进模型上下文。语义缓存相同或相近的问题不必重复请求大模型直接从缓存返回省时省钱。执行状态和幂等控制Agent 任务可能并发触发需要确保一次任务不会被重复执行避免重复扣费或者重复写库。这六类需求在 Redis 里分别对应 String/Hash、Stream、HashVector、索引检索、HashTTL、分布式锁。注意它们不是六个独立项目而是同一套 Redis 实例里不同类型的 key用命名空间分开即可。这也是 Redis 做 AI 中间件的核心优势一套基础组件解决整个数据层的问题运维成本远低于“每个需求引入一个中间件”。1.3 三种常见的 RedisAI 组合模式根据我接触过的项目Redis 参与 AI 工程的姿势基本可以归纳成三种第一种是知识库底座。不管你是给内部文档做问答还是做行业客服机器人都会涉及把文档切片、向量化、存进去再在查询时做相似性检索。这是最标准的一种用法也是 Redis 对标专业向量数据库的主要场景。第二种是对话状态中心。AI 应用是典型的多轮交互尤其 Agent 场景里还会涉及到多个子任务协同状态必须集中管理不能散落在各个进程里。用 Redis 存会话、存中间结果、存任务进度天然跨实例共享。第三种是模型调用的“减负层”。大模型接口有延迟有钱的问题于是我们把常见问题、固定话术、重复性任务的结果缓存起来。Redis 在这里承担语义缓存用向量相似度判断“这个问题之前是不是答过”。缓存命中一次省下的可能就是几百毫秒和一笔 token 费用。理解这三种模式以后接下来所有实操环节都有抓手了。你在做方案设计时先想清楚自己属于哪一种然后再决定 key 怎么设计、数据怎么组织。2. 动手前的基础环境、客户端与序列化2.1 用 Docker Compose 部署主从环境很多教程会让你直接docker run -d redis本地测测没问题但一旦你要把数据接入 AI 应用我建议起步就按主从来部署。为什么呢AI 场景里 Redis 不只是缓存它存着向量索引、会话记录挂了损失很大。主从至少能让你在单点故障时有个底。我自己常用的一个 docker-compose 配置大概是这样的version: 3.8 services: redis-master: image: redis/redis-stack:latest container_name: redis-master ports: - 6379:6379 - 8001:8001 command: [redis-server, --appendonly, yes, --requirepass, yourpass] volumes: - master-data:/data redis-replica: image: redis/redis-stack:latest container_name: redis-replica ports: - 6380:6379 command: [redis-server, --slaveof, redis-master, 6379, --requirepass, yourpass, --masterauth, yourpass] depends_on: - redis-master volumes: - replica-data:/data volumes: master-data: replica-data:几点说明image 用的是redis/redis-stack因为向量检索能力在 Stack 版本里开箱即用不需要额外装模块。appendonly yes开启 AOF 持久化避免实例重启后向量索引和会话数据全丢。从节点通过--slaveof挂到主节点后面生产环境建议换成哨兵或者直接上 Redis Cluster这里先保证你本地能跑通主从复制。从节点能不能查能但要注意Redis 主从默认情况下从节点是只读的向量检索这类读操作走从节点没问题写操作比如建立索引、写入 embedding必须走主节点。客户端配置里要把读写分离的意图表达清楚。2.2 连接工具和可视化客户端的选择命令行redis-cli当然是最底层的工具但接 AI 场景时数据往往是一大段 JSON、一串 float 数组在命令行里肉眼检查非常痛苦。我建议至少装一个可视化客户端。我用得比较多的是 Another Redis Desktop Manager简称 ARDM。跨平台、免费、能看 TTL、能直接执行命令、能查看 key 的序列化格式。新版还有树形展示和命令监控面板排查线上问题的时候特别好用。另外 RedisInsight 是官方出的功能更全能看到向量索引的统计信息、内存分析、慢查询日志debug 向量检索时非常有价值。排查向量问题时我会在 RedisInsight 里直接输FT.SEARCH命令看返回结果再对比用 Python 客户端拿到的结果这样能快速定位问题到底出在命令参数还是序列化上。2.3 数据序列化先统一再接入这是我最想强调的一个点也是很多项目接 AI 后翻车的第一现场。Redis 本身不管你存进去的是什么它记住的是字节。你用 Java 写了个对象用 Jackson 序列化成 JSON 存进去又用 Python 读出来期望它自动反序列化成 dict结果拿到一串字符串得自己 parse。这种跨语言、跨框架的序列化不一致在普通缓存场景里问题不大在 AI 场景里会让你很崩溃。我推荐两条规则一是通用格式统一用 JSON 或 MessagePack。只要没有极致性能要求JSON 足够可调试性强。二是向量字段要做专门编码。一个 1536 维的 float 数组转成 JSON 字符串体积非常大而且每次序列化反序列化都有 CPU 开销。更优做法是把它转成 bytes用np.save或者简单的 struct pack 处理。向量数据在 Redis 里通常不是给你肉眼看的它的目标是快速相似度计算。另外如果你的业务以 Java 为主RedisTemplate 的序列化器一定要显式指定。很多人用默认的 JdkSerializationRedisSerializer存进去的 key 会变成\xAC\xED...开头的一串乱码存字符串还好存对象再取出来就是 ClassCastException 重灾区。我通常用GenericJackson2JsonRedisSerializer做 value用 StringRedisSerializer 做 key这样至少跨语言读取时能看懂。3. 把 Redis 接入 AI 的四个核心实操3.1 向量检索与知识库问答语义搜索落地先看核心场景知识库问答。你有一堆 PDF、Markdown、网页内容要做一个“基于文档的问答机器人”。传统关键词搜索搞不定同义改写必须用向量检索。流程是文档切块 - 调用 embedding 接口变成向量 - 写入 Redis - 用户提问 - 问题向量化 - 在 Redis 里查相似向量 - 把命中的原文和相似度分数交给大模型 - 让模型基于这些片段回答。写入这一步我用的命令类似# 创建向量索引 FT.CREATE idx_docs ON HASH PREFIX 1 doc:emb: \ SCHEMA doc_id TAG \ title TEXT \ content TEXT \ embedding VECTOR HNSW 6 TYPE FLOAT32 DIM 1536 DISTANCE_METRIC COSINE这个命令的意思是让 Redis 为 key 前缀是doc:emb:的 Hash 类型建一个索引其中embedding字段被解释为 HNSW 算法的向量维度 1536距离度量用余弦相似度。如果你的 embedding 模型输出的是 768 维或 1024 维把 DIM 改成对应数字即可。写入一条带 embedding 的记录Python 伪代码大概是import numpy as np import redis from redis.commands.search.field import VectorField, TextField, TagField from redis.commands.search.indexDefinition import IndexDefinition r redis.Redis(hostlocalhost, port6379, usernamedefault, passwordyourpass, decode_responsesFalse) def add_doc(doc_id, title, content, embedding_vector): key fdoc:emb:{doc_id} value { doc_id: doc_id, title: title, content: content, embedding: np.float32(embedding_vector).tobytes(), } r.hset(key, mappingvalue) # 查询 from redis.commands.search.query import Query q Query(*) .sort_by(embedding_score) .add_return_field(embedding_score) .return_fields(doc_id, title, content) .dialect(2) # 实际执行 KNN 查询 q Query(f*[KNN 5 embedding $vec as embedding_score]).return_fields(doc_id, title, content, embedding_score).dialect(2) res r.ft(idx_docs).search(q, query_params{vec: np.float32(user_vector).tobytes()})有几个细节必须提醒写入向量时一定要转成float32的 bytes 再写不要直接塞一个 Python list 进去不要存 JSON 字符串。Redis 索引建立的时候是按固定字节取数的格式不对会直接报错。查询返回的相似度得分由于 HNSW 的实现分数是负数越接近 0 表示越相似不同距离度量之间不能直接横向比较。索引创建后如果数据量大了加字段或者改维度都比较麻烦通常需要删索引重建。所以上线前要想清楚维度、距离度量和字段列表。实际场景中content如果很长建议拆成两个 key 或用单独的字段冗余避免每次检索都拉大文本浪费网络和内存。3.2 语义缓存给 LLM 调用省点钱LLM 调用贵不贵取决于你的频率。即便按比较便宜的模型计算百万 token 也要几十块钱如果你的业务是生产环境高频调用一个月烧掉几万块非常正常。我在给一个客服项目做优化时就发现实际请求里有大量重复问题只是用户说法不一样比如“怎么退款”和“退款流程是什么”其实是同一个意图。这时候语义缓存就非常有价值。它不是传统 KV 缓存那样要求 key 完全相等而是先把你当前的问题向量化去 Redis 里做相似检索如果找到相似度超过阈值的历史问答就直接返回历史答案不再调用大模型。实现思路def get_cached_answer(r, question_embedding, threshold0.92): q Query(*[KNN 1 embedding $vec as score]).return_fields(answer, score).dialect(2) res r.ft(idx_cache).search(q, query_params{vec: question_embedding.tobytes()}) if not res.docs: return None score float(res.docs[0].score) if score -threshold: # cosine 相似度越高这个分越接近 -1 return res.docs[0].answer return None语义缓存的阈值调节是个手艺活。设高了命中率太低缓存形同虚设设低了语义不相关的问题可能被误判为相同返回错误答案。我的建议是先上日志抽样统计相似度分布再根据业务容忍度选阈值。客服场景我一般从 0.92 开始调如果是技术文档问答话语相对固定可以放到 0.88。还有一点语义缓存一定要设置 TTL。LLM 的答案不是永久有效的政策、价格、活动都会变。给每条缓存记录设置可配置的过期时间比如 24 小时或 7 天。同时你还需要一个“失效主动更新”机制当后台文档更新时删除相关的缓存 key。这就牵扯到你得在每个知识库文档的 key 上记录关联问题维护一张映射关系。3.3 Agent 记忆与会话状态用 Stream 管好上下文做 Agent 应用的人都会遇到一个尴尬模型上下文窗口有限多轮对话往下走之前的内容要么被截断要么被粗粒度摘要。这个状态放哪里很多人一开始放在应用内存里一重启全没了多实例部署还会出现用户请求被负载均衡到不同节点上下文不连续。Redis 的 Stream 数据结构非常适合做会话日志。它天然支持追加、按时间范围读取、分组消费比 List 做消息队列更顺手也比把所有历史存成一个 JSON 字段更灵活。基本写法# 追加一条用户消息 XADD chat:session_1001 * role user content 你好我想了解退款政策 # 追加一条 AI 回复 XADD chat:session_1001 * role assistant content 您好退款政策如下... # 读取最近 20 条 XLEN chat:session_1001 XRANGE chat:session_1001 - COUNT 20应用侧用 Stream 时我建议给每个会话 key 设置 TTL比如 48 小时或 7 天。不设置的话用户量一大内存直接爆掉。有些团队担心设置 TTL 会把重要记忆删了我的方案是当 Stream 的最后一笔写入临近过期时把它做一次摘要并转存到一个summary:{session_id}的 Hash 里这样长对话可以被压缩成少量 token 给模型初始化原始明细定期淘汰。再进一步做 Agent 的时候你不仅要存用户和 AI 的对话还要存工具调用的中间过程比如任务 ID、调用参数、返回结果。这些过程数据可以写成带有task_id字段的 Stream 消息配合 Redis 的消费者组来实现多实例协作。一个任务被多个 Agent 实例拉起来跑需要避免重复处理这就引出了文章后面要说的分布式锁。3.4 分布式锁并发任务幂等性的兜底AI 任务通常不是单一的“输入-输出”它会有很多副作用写库、发消息、调第三方接口。一旦重复执行轻则浪费 token重则产生脏数据、重复扣款。分布式锁在这里是必需品。Redis 分布式锁的老祖宗是SET key value NX PX 30000。命令本身不复杂但坑很多。我挑几个我实际踩过的说第一个坑是锁的 key 设计。很多人的锁 key 是lock:task:{id}这没问题但 value 一定不能用固定字符串。我建议用一个全局唯一的 requestId释放锁时先对比 value 再删防止“自己释放了别人的锁”。虽然这句话在文档里被说了无数次但确实是一直有人犯。第二个坑是锁超时时间不好定。AI 任务没法掐表预算有的任务几秒钟有的要几分钟。锁时间设短了任务没跑完锁就自动过期另一个实例进来重复执行设长了一旦持有锁的进程挂掉其他实例要等很久。我的做法是加一个看门狗机制用定时任务在锁即将过期时续期任务完成时显式释放。如果没有能力做看门狗至少要在锁的 value 里带上任务开始时间并在业务逻辑里做最终幂等校验。第三个坑是 RedLock 的争论。网上关于 RedLock 的讨论很多站在工程实践角度我的建议是如果你的业务在单 Redis 主从架构里分布式锁够用如果锁的是“扣费”这类强一致操作那就不只是 Redis 层的问题了必须把幂等表、数据库唯一约束、状态机一起设计。Redis 锁只能防并发不能防业务错误。放一段简单的锁代码思路import time import uuid import redis r redis.Redis(hostlocalhost, port6379, passwordyourpass) def acquire_lock(lock_key, timeout_ms30000): request_id str(uuid.uuid4()) ok r.set(lock_key, request_id, nxTrue, pxtimeout_ms) if ok: return Lock(lock_key, request_id) return None class Lock: def __init__(self, key, request_id): self.key key self.request_id request_id def release(self): # Lua 脚本原子地判断 value 再删除防止误删 script if redis.call(get, KEYS[1]) ARGV[1] then return redis.call(del, KEYS[1]) else return 0 end r.eval(script, 1, self.key, self.request_id)4. 缓存治理与集群从单机到生产4.1 缓存治理的三个“穿透”场景把 Redis 接进 AI 系统之后缓存治理的重要性不降反升。因为 AI 应用的缓存不仅有常规接口数据还有向量索引、语义缓存、Token 计数任何一层崩溃都可能引发连锁反应。第一个要防的是缓存穿透。用户疯狂问一个知识库里没有答案的问题语义缓存每次都不命中每次都去调大模型账单开始飙升。我的解决办法是对答案为空的问题也缓存一条带特殊标记的记录TTL 设短一点比如 10 分钟。同时在上游加一个接口层面的限流把恶意/刷量请求挡在 Redis 之前。第二个是缓存击穿。某个热点 key 在过期的一瞬间被大量请求同时访问所有请求都穿透到下游大模型瞬间 QPS 爆掉。这时候用互斥锁重建缓存或者用逻辑过期时间配合后台异步刷新都比裸设 TTL 靠谱。第三个是缓存雪崩。大量 key 在同一时间段过期导致一波集中穿透。解决办法很简单TTL 不是固定值而是基础时间加上一个随机偏移量。我在项目里通常写成base_ttl random.randint(0, 300)秒打散过期时间。另外还有内存治理。向量数据是内存大户1536 维的 float32 向量一条就是 6KB十万条就是 600MB。所以在做容量规划时要单独估算向量 key 的内存占用不能让它们和其他缓存共用一块内存而互相挤兑。Redis 8 支持键空间隔离吗目前主要策略还是从服务层面拆分比如单独部署一个 Redis 实例专门放向量数据。4.2 Redis 集群部署要考虑的事单机 Redis 扛不住生产上集群是迟早的事。但集群部署对 AI 场景有几个直接影响。第一个是 key 分布。Redis Cluster 按 key 的 hash slot 分布数据主从模式则可以使用任意 key。如果你像我们项目那样把知识库的所有 chunk 都写在doc:emb:前缀下在 Cluster 模式下它们可能会被分散到不同节点。检索时如果走集群那就要用FT._LIST确认每个节点上的索引或者直接用开启集群支持后的统一响应。我建议在 Cluster 模式测试前做一次“小规模验证”确定返回的 top-K 结果的跨节点聚合行为符合预期。第二个是读写拓扑。主从模式下从节点负责读主节点负责写而向量索引的写入和检索如何分流答案是索引只建在主节点上从节点同步数据的同时会同步索引结构。检索可以走从节点但刚写入的数据可能因为复制延迟不被立即检索到。如果你做的是“文档上传立即问”的场景要注意这个最终一致性问题。解决办法是在业务上牺牲一点实时性或者写入后强制读主节点。第三个是哨兵与 Cluster 的选择。我的经验中小规模、主从加哨兵足够配置简单故障自动切换大规模、数据量达到 GB 级且需要水平扩展上 Cluster。但 Cluster 的运维复杂度高迁移槽位、滚动升级都要做得很熟练才行。4.3 数据类型选型的经验表为了让大家少踩坑我把 AI 场景中常用的数据组织方式整理成一个选型参考业务需求推荐类型使用要点用户画像、配置、单条上下文Hash字段可单独更新序列化友好知识库切片 向量Hash Vector前缀统一建索引时指定 SCHEMA对话历史、任务日志Stream追加写入按时间查询配合 TTL排行榜、热点问题 TopNZSet分值即热度适合推荐场景语义缓存 QAHash Vector答案字段存文本嵌入向量存 bytes任务锁、幂等控制String NXvalue 唯一释放用 Lua 原子操作5. 踩坑手记超时、丢数、向量失效5.1 Lettuce 的 Command timed out项目里遇到最多的报错就是这句redis command timed out; nested exception is io.lettuce.core.RedisCommandTimeoutException这个错误从 Lettuce 客户端视角看是某个命令在指定时间内没等到响应。我排查过几次常见原因有四种一是 Redis 服务端真的有问题。比如有个超大 keyHGETALL返回了几 MB 数据网络传输时间超过了客户端超时设置。AI 场景里最容易出现的是把大向量或者大 JSON 一次性写入我就遇到过有人把一个 5MB 的 JSON 塞进 Redis然后下游读取超时。二是连接池耗尽。Lettuce 本身是异步多路复用的但如果你配置了连接池并发高时连接全部被占用新请求排队排队时间加上执行时间一起超时。解决办法是合理设置maxTotal、maxIdle、minIdle同时给命令设置独立的 timeout。三是阻塞命令。BLPOP、BRPOP、XAUTOCLAIM这类阻塞命令如果在业务线程里跑会把线程长时间卡住导致其他命令拿不到连接。四是网络抖动和跨机房调用。如果 Redis 和 AI 服务不在同一个可用区网络 RTT 本身就高超时阈值默认 2 秒很容易被打穿。我的建议是核心链路尽量同机房部署超时时间按 P99 延迟的 3 倍来设避免盲目调大。排查方法也别乱猜用redis-cli --latency先看网络延迟再用SLOWLOG GET 10看慢命令。很多超时都是慢命令造成的把慢命令列表拉出来问题基本就显形了。5.2 重启后数据消失持久化配置经验有位同事问我“Redis 不是说数据在内存里吗怎么重启之后向量索引全没了”这其实不是 bug是持久化配置问题。Redis 默认配置下持久化级别并不高。RDB 是定时快照可能丢最后一次快照之后的数据AOF 是追加日志配合appendfsync everysec最多丢一秒数据。向量索引和知识库属于重建成本很高的数据我建议开启 AOF 并且定期做 RDB 备份。配置参考appendonly yes appendfsync everysec save 900 1 save 300 10 save 60 10000注意一个细节如果是 Cluster 模式建议关闭 AOF 自动重写时可能出现的长时间阻塞或错开业务高峰。向量数据量大时BGSAVE和BGREWRITEAOF都会占用大量内存和 CPU我踩过一次生产故障就是在高峰期触发了快照导致命令延迟飙到秒级。后来我把自动快照时间往后调改成业务低峰期手动执行SAVE情况立刻好转。5.3 向量搜索结果很差的排查路径向量检索效果差先别怪模型。按照这个顺序排查第一确认查询向量和文档向量来自同一个模型。不同模型的向量空间不兼容直接用余弦相似度比较基本等于瞎猜。第二确认向量维度匹配。你建索引写了 DIM 1536结果查询时传了一串 1024 维Redis 要么报错要么检索结果毫无意义。第三确认向量做了归一化。HNSW 用余弦距离时向量方向是核心模长不重要。如果你的 embedding 结果模长和分布差异很大可以先归一化再写进去检索稳定性会好很多。第四确认 top-K 和阈值设置合理。K 设太大低相关片段被塞进上下文反而干扰模型回答K 设太小关键信息被漏掉。我一般根据文档切块大小来定每块 500 字左右K 取 3 到 5。第五确认数据覆盖和切块质量。有时候不是检索的问题是文档切块太碎了。一句话一个 chunk向量信息量不够相似度自然低。我建议切块按“段落完整性优先”每块保留足够上下文必要时加 20% 重叠。5.4 运维侧的小经验再补几条运维层面的经验都是真金白银换来的。一是监控命中率。语义缓存命中率低于 20% 说明阈值太高或者用户问题太分散缓存基本白搭命中率高于 95% 又可能说明业务太固定不需要大模型。要找到自己的合理区间。二是控制向量 key 的无上限增长。很多人写完向量就不管了内存一天比一天大。我建议每个文档批次写入时记录批次号并定期清理不再使用的批次。三是备份恢复演练。向量索引重建可不像普通缓存那样自动回源它依赖外部 embedding 接口。如果不小心把 Redis 数据清空你要重新调用 embedding 接口给全部文档算一遍向量这个成本可能因为接口限流而花掉大半天。定期做恢复演练能提前发现备份不可用的问题。6. 最后说一点个人体会项目做多了之后我最大的感受是AI 工程里真正难的不是模型本身而是围绕模型的那一层工程底座。Redis 接入 AI并不是让你丢掉以前学的缓存、数据结构、集群知识去学一套新东西而是把它已有的能力重新组合服务于一套新的工作负载。向量检索、语义缓存、流式会话、分布式锁每一个单独拎出来都是 Redis 圈子里很老的话题但放在 AI 链路里它们焕发了新的生命力。如果你现在正打算给 AI 应用加一层 Redis我的建议很简单先不要追求最新特性先把最朴素的事情做好规划好 key 前缀、序列化方案、TTL 和内存预算。等这些基本功扎实了再上向量检索和语义缓存。别一上来就铺很大的摊子出问题时你会被数据模型设计、内存瓶颈、跨语言序列化、复制延迟这些问题同时夹击。如果你已经在用 Redis 做 AI欢迎多交流。毕竟这个方向变化太快今天我和你说 HNSW 参数怎么调可能过两个月官方又出了更顺手的方案。但架构思维是相通的数据层永远是 AI 应用最坚实的底盘。
返回列表