2026/6/1 1:55:57
网站建设
项目流程
微信文章采集 wordpress,建一个优化网站多少钱,wordpress添加发布视频,秀米h5制作教程文章介绍了语义缓存技术如何通过向量数据库存储用户问题嵌入和对应答案#xff0c;当遇到相似问题时直接返回缓存结果而非重新调用LLM。这种技术可大幅降低大模型应用的延迟#xff08;从5秒降至0.1秒以下#xff09;和成本#xff08;降低99%#xff09;#xff0c;同时…文章介绍了语义缓存技术如何通过向量数据库存储用户问题嵌入和对应答案当遇到相似问题时直接返回缓存结果而非重新调用LLM。这种技术可大幅降低大模型应用的延迟从5秒降至0.1秒以下和成本降低99%同时减少API调用限制。文章详细介绍了语义缓存的实现方法、环境设置和代码示例并讨论了精度与召回率的权衡问题。延迟和成本是当今基于 LLM 的聊天机器人面临的重大挑战。这个问题在检索增强生成(RAG)代理中更加明显在返回用户答案之前我们必须对 LLM 进行多次调用。通常大模型 RAG 应用的延迟时间可能超过5秒当许多用户提出“类似”问题时语义缓存是一种简单的方法可以大大减少聊天机器人的等待时间使其小于0.1秒。缓存的简要回顾在 Web 应用程序的上下文中缓存是一种快速、低延迟的数据库它临时存储通常访问的数据。当应用程序需要一些信息时它会首先检查缓存是否有这些信息如果有则直接使用缓存中的数据。如果缓存没有请求的数据它将从底层事务数据库(OLTP)获取数据。这种类型的缓存称为读缓存。典型的 Web 应用可能会使用像 Redis 这样的 NoSQL 数据库作为缓存。相比之下它将使用传统的 SQL 数据库(如 PgSQL)作为实际的事务数据库这是最终的数据源。使用缓存有两个主要原因:速度: 添加一个缓存来临时存储通常访问的数据可以极大地加快应用程序的速度因为从这些 NoSQL 数据库中提取数据要比从 SQL 数据库中查询数据快得多。负载: 从缓存中检索通常访问的数据极大地减少了对事务数据库的请求数量并允许它以更少的资源很好地工作。在 LLM 应用中许多用户可能有非常“相似”的问题但措辞略有不同。例如问题“如何使阅读成为一种习惯?”以及“怎样才能使阅读成为一种常规习惯?”是相似的但稍有不同。然而我们可以用一个答案来回答这两个问题。在这里我们不能使用标准的 Redis 缓存因为两个问题的key不同。那么我们如何使用缓存来解决这个问题呢这就是语义缓存的价值所在。关于大模型应用入门可以参考李瀚等老师的《探秘大模型应用开发》一书。语义缓存语义缓存通过应用语义文本最近邻搜索的原则扩展了缓存范式。在语义缓存中我们使用一个向量数据库作为一个低延迟缓存来存储所有用户问题的嵌入以及过去对每个问题产生的相应答案。每个新的用户问题被转换成一个嵌入向量并与缓存进行比较以找到过去的任何“语义相似”的问题。如果向量数据库缓存找到一个具有足够接近含义的问题它将从缓存中返回答案给用户而不是运行 RAG 的流水线。向量数据库通常非常快可以在100毫秒内完成整个操作。从过去的“相似”问题中返回答案有三个好处不需要对每个用户问题都使用 LLM:速度: 从向量数据库返回结果的时间可以达到从 LLM 获得响应所需时间的 5% 以内成本: LLM 的 API 比嵌入 API 昂贵得多。例如gpt-3.5-turbo-0125 API 生成令牌的成本为1.5美元/100万个令牌而text-embedding-3-small 的嵌入 API 生成令牌的成本为0.02美元/100万个令牌。因此成本降低99% 如果使用开源的嵌入模型 成本甚至更低。限制: 托管的 LLM 服务限制了任何单个应用程序使用的速率。与LLM的 API 相比嵌入 API 具有较宽松的令牌限制。例如对于一个二级帐户OpenAI gpt-3.5-turbo 每分钟有一个80K 令牌限制而text-embedding-3-small 的限制是每分钟1M 令牌放大了12.5倍因此我们可以通过从过去的“类似”问题返回答案来减少延迟和成本而不是对每个用户问题都去调用 LLM。如果对自动驾驶中大模型的应用感兴趣可以参考张慧敏 老师的《智能座舱:架构原理》一书——语义缓存的实现实现一个简单的语义缓存非常简单。Langchain 为使用语义缓存提供了很多抽象然而Langchain 的抽象对于较复杂的应用程序可能限制太多并且在为特定需求实现语义缓存时我们还可能需要更多的灵活性。一个可参考的替代方案是 LiteLLM我们可以用任何自定义缓存函数覆盖它的默认缓存。3.1 环境设置设置 Python 环境并在本地启动 Qdrant 矢量数据库当然使用其他向量数据库也是可以的。# Create and activate a conda environmentconda create -n semantic_cache python3.11conda activate semantic_cache# Install the necessary librariespip install -U fastapi uvicorn loguru pandas numpy tqdmpip install -U litellm sentence-transformers pip install -U qdrant-client redisvl0.0.7# Run Qdrant Vector Database locallydocker run --rm -p 6333:6333 -p 6334:6334 -v $(pwd)/qdrant_storage:/qdrant/storage:z qdrant/qdrant3.2 基于LiteLLM 的语义缓存实现在 LiteLLM 中实现自定义语义缓存涉及到六个步骤1.嵌入模型: 使用嵌入模型将用户的问题文本转换成一个嵌入向量对文本的上下文和意义进行编码。这里使用一个Sentence Transformer Bi-Encoder 模型来生成嵌入它在语义文本相似性任务上比 OpenAI 的text-embedding-3-models 给出了更好的结果。2.矢量数据库: 利用矢量数据库对嵌入矢量进行物理存储和语义相似性检索。Qrdant 向量数据库可以运行在一个 Docker 容器中可以在本地或云中运行。add_cache(): 这个函数必须实现自定义逻辑将 API 调用添加到矢量数据库中。Qdrant 矢量数据库中的每个文档都包含新的用户问题嵌入和 LLM 生成的相应答案。get_cache(): 这个函数也必须实现我们的自定义逻辑以便应用程序如何在向量数据库中搜索“类似”问题。将一个用户问题转换为文本嵌入并使用它在 向量数据库中搜索最相似的文档如果最相似的文档的相似度得分超过0.95的阈值将返回这个答案(稍后将详细介绍)。如果没有文档满足最小相似性阈值条件则返回“无”。将这些自定义函数添加到 LiteLLM Cache ()。6.将整个服务公开为 FastAPI 端点以便用户可以轻松地将这个服务并与之交互。import osimport timeimport litellmfrom fastapi import FastAPI, Responsefrom litellm.caching import Cachefrom loguru import loggerfrom qdrant_client import QdrantClient, modelsfrom sentence_transformers import SentenceTransformerlitellm.openai_key os.getenv(OPENAI_API_KEY)os.environ[TOKENIZERS_PARALLELISM] false# Step 1: 引入潜入模型encoder SentenceTransformer(sentence-transformers/stsb-mpnet-base-v2)# Step 2: 建立用于语义缓存的向量数据库collection_name semantic_cacheqdrant_client QdrantClient(localhost, port6333)try: qdrant_client.get_collection(collection_namecollection_name)except: qdrant_client.recreate_collection( collection_namecollection_name, vectors_configmodels.VectorParams( sizeencoder.get_sentence_embedding_dimension(), distancemodels.Distance.COSINE, ), )# Helperdef generate_embedding(**kwargs) - list: Take the last message as the prompt and generate an embedding Args: kwargs: All the arguments passed to the litellm call Returns: list: Embedding vector of the prompt # Take the last message as the prompt prompt kwargs.get(messages, [])[-1].get(content, ) # Embed litellm_embedding encoder.encode(prompt).tolist() return litellm_embedding# Step 3: 增加缓存def add_cache(result: litellm.ModelResponse, **kwargs) - None: Add the result to the cache Args: result (litellm.ModelResponse): Response from the litellm call kwargs: All the arguments passed to the litellm call and some additional keys: litellm_call_id, litellm_logging_obj and preset_cache_key # Embed litellm_embedding generate_embedding(**kwargs) # Upload to vector DB qdrant_client.upsert( collection_namecollection_name, points[ models.PointStruct( idkwargs.get(litellm_call_id), vectorlitellm_embedding, payloadresult.dict(), ) ], )# Step 4: 获取缓存def get_cache(**kwargs) - dict: Read the cache Args: kwargs: All the arguments passed to the litellm call and some additional keys: litellm_call_id, litellm_logging_obj and preset_cache_key Returns: dict: The result that was saved in the cache. Should be compatible with litellm.ModelResponse schema similarity_threshold 0.95 # Embed litellm_embedding generate_embedding(**kwargs) # Cache Search hits qdrant_client.search( collection_namecollection_name, query_vectorlitellm_embedding, limit5 ) # Similarity threshold similar_docs [ {**hit.payload, score: hit.score} for hit in hits if hit.score similarity_threshold ] if similar_docs: logger.info(Cache hit!) else: logger.info(Cache miss!) # Return result return similar_docs[0] if similar_docs else None# Step 5: 语义缓存cache Cache()cache.add_cache add_cachecache.get_cache get_cachelitellm.cache cache# Step 6: 基于Fast API 建立服务 app FastAPI()app.get(/)def health_check(): return {Status: Alive}app.post(/chat)def chat(question: str, response: Response) - dict: # LiteLLM call - Handles the cache internally start time.time() result litellm.completion( modelgpt-3.5-turbo-0125, messages[{role: user, content: question}], max_tokens100, ) end time.time() # Add latency to the response header response.headers[X-Response-Time] str(end - start) return {response: result.choices[0].message.content}部分实验表明对于类似但不完全重复的问题使用语义缓存可以减少98% 的延迟。约束与增强对于每个考虑实现语义缓存的开发人员来说有两个主要的考虑因素:精度(缓存精度) : 使用嵌入向量的语义文本最近邻搜索可能产生不精确的结果。例如问题是: “ 知乎上最有趣的答案是什么?”以及“ 知乎上最有趣的问题是什么?”具有 0.9的高相似性。召回(缓存命中率)是缓存提供的用户查询的百分比。缓存服务的用户查询越多LLM 成本就越低。准召是直接的权衡仅仅通过增加相似性阈值来提高精度会使召回恶化反之亦然。语义缓存与问题数据集密切相关可以尝试引入监督式方法在数据集中标记出可能的重复问题对。在不同的相似性阈值下识别“假阳性”并手动标记句子对以识别更多原始数据集没有明确标记的重复问题。使用带有“增强”标签的stsb-mpnet-base-v2 sentence transformer bi-encoder 模型可以以较低的命中率达到较高的缓存精度。因此对于特定的应用程序一般可以从主观标记增强的数据集加速 LLM 推理同时保持很高的精度。最后我在一线科技企业深耕十二载见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事早已在效率与薪资上形成代际优势我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我整理出这套 AI 大模型突围资料包✅AI大模型学习路线图✅Agent行业报告✅100集大模型视频教程✅大模型书籍PDF✅DeepSeek教程✅AI产品经理入门资料完整的大模型学习和面试资料已经上传带到CSDN的官方了有需要的朋友可以扫描下方二维码免费领取【保证100%免费】为什么说现在普通人就业/升职加薪的首选是AI大模型人工智能技术的爆发式增长正以不可逆转之势重塑就业市场版图。从DeepSeek等国产大模型引发的科技圈热议到全国两会关于AI产业发展的政策聚焦再到招聘会上排起的长队AI的热度已从技术领域渗透到就业市场的每一个角落。智联招聘的最新数据给出了最直观的印证2025年2月AI领域求职人数同比增幅突破200%远超其他行业平均水平整个人工智能行业的求职增速达到33.4%位居各行业榜首其中人工智能工程师岗位的求职热度更是飙升69.6%。AI产业的快速扩张也让人才供需矛盾愈发突出。麦肯锡报告明确预测到2030年中国AI专业人才需求将达600万人人才缺口可能高达400万人这一缺口不仅存在于核心技术领域更蔓延至产业应用的各个环节。资料包有什么①从入门到精通的全套视频教程⑤⑥包含提示词工程、RAG、Agent等技术点② AI大模型学习路线图还有视频解说全过程AI大模型学习路线③学习电子书籍和技术文档市面上的大模型书籍确实太多了这些是我精选出来的④各大厂大模型面试题目详解⑤ 这些资料真的有用吗?这份资料由我和鲁为民博士共同整理鲁为民博士先后获得了北京清华大学学士和美国加州理工学院博士学位在包括IEEE Transactions等学术期刊和诸多国际会议上发表了超过50篇学术论文、取得了多项美国和中国发明专利同时还斩获了吴文俊人工智能科学技术奖。目前我正在和鲁博士共同进行人工智能的研究。所有的视频教程由智泊AI老师录制且资料与智泊AI共享相互补充。这份学习大礼包应该算是现在最全面的大模型学习资料了。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。智泊AI始终秉持着“让每个人平等享受到优质教育资源”的育人理念通过动态追踪大模型开发、数据标注伦理等前沿技术趋势构建起前沿课程智能实训精准就业的高效培养体系。课堂上不光教理论还带着学员做了十多个真实项目。学员要亲自上手搞数据清洗、模型调优这些硬核操作把课本知识变成真本事如果说你是以下人群中的其中一类都可以来智泊AI学习人工智能找到高薪工作一次小小的“投资”换来的是终身受益应届毕业生无工作经验但想要系统学习AI大模型技术期待通过实战项目掌握核心技术。零基础转型非技术背景但关注AI应用场景计划通过低代码工具实现“AI行业”跨界。业务赋能 突破瓶颈传统开发者Java/前端等学习Transformer架构与LangChain框架向AI全栈工程师转型。获取方式有需要的小伙伴可以保存图片到wx扫描二v码免费领取【保证100%免费】**