升级RAG应用程序与Redis向量库
Redis Vector Library (RedisVL) 简化AI应用开发
几个月前,Redis推出了Redis向量库(RedisVL),以简化人工智能(AI)应用的开发。自那时起,我们引入了强大的新功能,支持大规模的语言模型(LLMs)。RedisVL是专为使用Redis进行AI操作而设计的Python客户端库。从redisvl版本0.3.0开始,它提供了:- 优化工具用于构建生成式AI应用,基于我们领先的向量数据库。- 存储和检索聊天历史记录的大型语言模型内存(LLM memory)。- 语义缓存,以节省LLM成本并加速响应。- 语义路由,将用户请求发送到最佳工具、模型或知识库。对于构建生成式AI应用的开发者来说,RedisVL旨在抽象并简化许多构建现代AI应用所需的组件。Redis以其速度和简易性著称,我们在GenAI时代继续发扬这一优势。我们的向量数据库是我们测试过的最快之一,但我们同样致力于使其易于构建。我们知道,开发者必须处理许多AI工具,并编写自定义代码以使这些工具协同工作。借助RedisVL,我们提供了一套有倾向性的命令集,使您能够专注于您的应用,从而更快地构建。### 使用LLM内存记住聊天上下文#### 问题LLMs本质上是无状态的,它们不会记住之前的互动。这意味着即使是最新的提示也会被立即遗忘。大多数在线聊天机器人可以回答后续问题,例如“告诉我更多关于那个”,或者“你能详细说明吗?”这是因为解决方案是在每次后续查询时提供完整的聊天历史记录。这确保了LLM有足够的上下文来回应。当您自己构建LLM应用时,这种会话管理成为您需要处理的责任。#### 解决方案解决方案是使用带有语义相关的聊天历史记录的部分内容。通过利用语义相似性,我们可以确定对话中哪些部分最相关于当前的查询。这种方法减少了令牌数量,节省了成本和时间,并可能因为只包含相关上下文而得到更好的答案。我们可以通过利用文本嵌入模型将文本编码成向量,然后使用Redis向量相似性搜索来找到与最新提示最相似的向量,从而量化用户查询和对话历史记录部分之间的语义相似性。在代码示例中,SemanticSessionManager
类允许设置距离阈值,添加消息以及获取与新提示语义相关的上下文。当调用get_relevant
方法时,它返回与提示语义相关的消息列表。pythonfrom redisvl.extensions.session_manager import StandardSessionManagerchat_session = SemanticSessionManager(name='student tutor')chat_session.set_distance_threshold(0.35)# 添加系统角色信息和一系列对话消息chat_session.add_message({"role": "system", "content": "你是一位地理导师,简短回答有关欧洲国家的问题。"})chat_session.add_messages([ {"role": "user", "content": "法国的首都是什么?"}, {"role": "llm", "content": "首都是巴黎。"}, # 更多对话...])prompt = "我学到了英格兰的大小是什么?"context = chat_session.get_relevant(prompt)for message in context: print(message)
### 使用语义缓存减少LLM成本和延迟#### 问题许多应用程序用户可能会反复问同样的问题。在这种情况下,如果LLM每次都计算相同的响应,显然是浪费资源。#### 解决方案为了提高LLM系统的性能,我们可以应用缓存技术。对于重复的问题,直接返回缓存的响应而不是每次都调用昂贵的模型来提供相同的答案是有意义的。然而,并非所有提示都是完全相同的,我们需要一种方法来比较那些以略微不同方式提问但含义相同的问题。这就是语义缓存的作用。语义缓存利用文本嵌入模型将每个查询转换成高维向量,这个向量是查询的数值表示,可以用来比较句子的语义含义。使用Redis的向量数据库,我们将用户查询和LLM响应对存储起来,并在每次新查询时执行向量相似性搜索,以找到我们已经有答案的语义相似问题。对于像“谁是英国的国王?”和“谁是联合王国的君主?”这样的语义相同的问题,可以直接返回缓存的响应。下面是一个简单的聊天循环例子,展示了如何在LLM工作流中加入Redis语义缓存。在实际应用中,首次接收到新响应后,不要忘记将其添加到缓存中以便下次使用。pythonfrom openai import AzureOpenAIfrom redisvl.extensions.llmcache import SemanticCacheclient = AzureOpenAI()cache = SemanticCache()while True: prompt = input("请输入您的问题:") if cache_hit := cache.check(prompt): print(cache_hit[0]["response"]) continue response = client.chat.completions.create( model='gpt-35-turbo', messages=[{"role": "user", "content": prompt}], ).choices[0].message.content cache.store(prompt=prompt, response=response) print(response)
超快的内存数据库可以在几分之一的时间内提供响应,相比LLM所需的时间大幅减少。它们还可以显著降低托管和调用LLM的财务成本。语义缓存的好处是巨大的。每次缓存命中都意味着少了一次对LLM的调用,这不仅节省了成本,也节省了时间,因为LLM响应时间通常以秒计,而缓存查找可以在毫秒内完成。研究已经表明,超过30%的用户问题是语义上相似的,可以由缓存提供服务。
相关文章:

升级RAG应用程序与Redis向量库
Redis Vector Library (RedisVL) 简化AI应用开发 几个月前,Redis推出了Redis向量库(RedisVL),以简化人工智能(AI)应用的开发。自那时起,我们引入了强大的新功能,支持大规模的语言模…...

【starrocks学习】之将starrocks表同步到hive
目录 方法 1:通过HDFS导出数据 1. 将StarRocks表数据导出到HDFS 2. 在Hive中创建外部表 3. 验证数据 方法 2:使用Apache Spark同步 1. 添加StarRocks和Hive的依赖 2. 使用Spark读取StarRocks数据并写入Hive 3. 验证数据 方法 3:通过…...

HTML应用指南:利用GET请求获取全国盒马门店位置信息
随着新零售业态的发展,门店位置信息的获取变得至关重要。作为新零售领域的先锋,盒马鲜生不仅在商业模式创新上持续领先,还积极构建广泛的门店网络,以支持其不断增长的用户群体。本篇文章,我们将继续探究GET请求的实际应用,我们使用Python的requests库通过GET请求,从盒马…...

openEuler部署 sysstat工具
查看环境 [rootlocalhost lxm]# cat /etc/os-release NAME"openEuler" VERSION"23.09" ID"openEuler" VERSION_ID"23.09" PRETTY_NAME"openEuler 23.09" ANSI_COLOR"0;31"查看 yum 源 [rootlocalhost lxm]# he…...

使用 Three.js 实现炫酷的除夕烟花特效
1,前言 在除夕夜,璀璨的烟花点亮夜空,为节日增添了浓厚的喜庆氛围。在 Web 端,我们可以使用 Three.js 来模拟这种美轮美奂的烟花特效,让网页也能展现绚丽的节日气息。本文将介绍如何利用 Three.js 及其着色器技术&…...

LMM-3DP:集成 LMM 规划器和 3D 技能策略实现可泛化操作
25年1月来自UCSD的论文“Integrating LMM Planners and 3D Skill Policies for Generalizable Manipulation”。 大型多模态模型 (LMM) 的视觉推理能力和 3D 特征场语义丰富性的最新进展,拓展了机器人能力的范围。这些发展对于弥合 LMM 高级推理与利用 3D 特征场低…...

Linux——基础命令3
1、关机重启命令 reboot指令 作用:重启计算机 语法:reboot shutdown指令 作用:关机 语法:shutdown -h 时间 时间常见的值: now (立即关机) m(m表示minutes数字)eg&…...

ChatGPT提问技巧:行业热门应用提示词案例-文案写作
ChatGPT 作为强大的 AI 语言模型,已经成为文案写作的得力助手。但要让它写出真正符合你需求的文案,关键在于如何与它“沟通”,也就是如何设计提示词(Prompt)。以下是一些实用的提示词案例,帮助你解锁 ChatG…...

python - 封装moondream(备份)
目录 一、 moondream封装成类 二、moondream封装成http api 一、 moondream封装成类 # moondream_model.py #https://github.com/vikhyat/moondream?tab=readme-ov-fileimport moondream as md from PIL import Imageclass MoondreamModel:def __init__(self, model_path):…...

响应式编程库(三) -r2dbc
r2dbc整合 什么是r2dbc版本选择简单试用整合springbootDatabaseClient 进行查询使用Repository接口(对应mapper)实体类复杂查询(一对一)实体类转换器测试代码一对多关系 什么是r2dbc 反应式关系数据库连接(R2DBC)项目为关系数据库…...

嵌入式AI革命:DeepSeek开源如何终结GPU霸权,开启单片机智能新时代?
2025年,全球AI领域最震撼的突破并非来自算力堆叠的超级模型,而是中国团队DeepSeek通过开源策略,推动大模型向微型化、低功耗场景的跨越。相对于当人们还在讨论千亿参数模型的训练成本被压缩到600万美金而言,被称作“核弹级别”的操…...

基于遗传算法的64QAM星座图的最优概率整形matlab仿真,对比优化前后整形星座图和误码率
目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): GA优化过程: 优化前后星座图对比: (优化后…...

从零开始玩转Docker:轻松开启容器化之旅
一、什么是 Docker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。简单来说,Docker 就像是一个超级 “快递箱”,…...

kafka生产端之架构及工作原理
文章目录 整体架构元数据更新 整体架构 消息在真正发往Kafka之前,有可能需要经历拦截器(Interceptor)、序列化器(Serializer)和分区器(Partitioner)等一系列的作用,那么在此之后又会…...

38、【OS】【Nuttx】OSTest分析(3):参数传递
背景 接之前 blog 36、【OS】【Nuttx】OSTest分析(2):环境变量测试 37、【OS】【Nuttx】OSTest分析(2):任务创建 分析完环境变量测试,和任务创建的一些关键要素,OSTest 进入下一阶段…...

存储异常导致的Oracle重大生产故障
📢📢📢📣📣📣 作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验 Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯…...

C语言时间相关宏定义
在C语言中,预处理器提供了一些与时间相关的宏定义,用于在编译时获取日期、时间等信息。除了 __TIMESTAMP__ 和 __DATE__,还有以下相关的宏定义: __DATE__ 当前编译日期的字符串,格式为 "Mmm dd yyyy"&#x…...

Android Studio:Application 和 Activity的区别
Application 和 Activity 是 Android 中非常重要的两个组件,它们分别负责不同的生命周期管理和应用的不同层次的操作。 Application 是应用级别的生命周期管理,它在整个应用运行时只有一个实例,负责应用的全局初始化和资源管理。Activity 是…...

如何优化爬虫以提高搜索效率
在数据采集和网络爬虫领域,优化爬虫性能是提升数据采集效率的关键。随着网页结构的日益复杂和数据量的不断增长,高效的爬虫能够显著降低运行时间和资源成本。本文将详细介绍如何优化爬虫以提高搜索效率,包括选择合适的工具、优化代码逻辑、使…...

git撤销上一次的提交
1、撤销提交 如果需要撤销上一次的提交,只是提交到了本地,可以通过命令: // 撤销最近的提交(保留修改) git reset --soft HEAD~1 这个操作可以保留之前的提交和当前的修改。最近一次的提交到本地的修改的提交会回到…...

LLM学习笔记1——本地部署Meta-Llama-3.2-1B大模型
系列文章目录 参考博客 参考博客 文章目录 系列文章目录前言与调用一、部署要求二、实现步骤0.深度学习环境错误1,验证pytorch版本时提示以下问题:错误2,验证pytorch版本时提示以下问题:错误3,有时候还会提示你有一些…...

Nginx反代Ollama接口跨域、无法逐字输出问题
场景 本地部署deepseek模型,用的Ollama管理,内网穿透到公网,在通过nginx反代ollama接口。 问题描述 跨域问题 nginx转发时请求头中需要加入origin,并且origin还要和ollama接口同源(协议、ip、端口一致)。…...

大学资产管理系统中的下载功能设计与实现
大学资产管理系统是高校信息化建设的重要组成部分,它负责记录和管理学校内所有固定资产的信息。随着信息技术的发展,下载功能成为提高资产管理效率的关键环节之一。 系统架构的设计是实现下载功能的基础。一个良好的系统架构能够确保数据的高效传输和存储…...

股指入门:股指期货是什么意思?在哪里可以做股指期货交易?
股指期货是一种以股票指数为标的物的期货合约,也可以称为股票指数期货或期指。 股指期货是什么意思? 股指期货是一种金融衍生品,其标的资产是股票市场上的股指,例如标普500指数、道琼斯工业平均指数、上证50指数等。 股指期货允…...

< OS 有关 > 利用 google-drive-ocamlfuse 工具,在 Ubuntu 24 系统上 加载 Google DRIVE 网盘
Created by Dave On 8Feb.2025 起因: 想下载 StableDiffusion,清理系统文件时把 i/o 搞到 100%,已经删除到 apt 缓存,还差 89MB,只能另想办法。 在网上找能不能挂在 Google 网盘,百度网盘,或 …...

Golang的引用类型和指针
在Golang中,引用类型和指针是两个容易混淆的概念,但它们有本质的区别。理解它们的区别对于编写高效、正确的Go代码至关重要。 1. 引用类型 引用类型是Go语言中某些内置类型的统称,它们的值在传递时共享底层数据,而不是复制数据。…...

51单片机之冯·诺依曼结构
一、概述 8051系列单片机将作为控制应用最基本的内容集成在一个硅片上,其内部结构如图4-1所示。作为单一芯片的计算机,它的内部结构与一台计算机的主机非常相似。其中微处理器相当于计算机中的CPU,由运算器和控制器两个部分构成;…...

32. C 语言 安全函数( _s 尾缀)
本章目录 前言什么是安全函数?安全函数的特点主要的安全函数1. 字符串操作安全函数2. 格式化输出安全函数3. 内存操作安全函数4. 其他常用安全函数 安全函数实例示例 1:strcpy_s 和 strcat_s示例 2:memcpy_s示例 3:strtok_s 总结 …...

Android T(13) 源码分析 — BufferQueue 的分析
Android T(13) 源码分析 — BufferQueue 的分析 文章目录 Android T(13) 源码分析 — BufferQueue 的分析前言摘要一、Java 层的 BufferQueue 分析二、原生层的 BufferQueue 分析1、BLASTBufferQueue 的创建2、BLASTBufferQueue 的更新3、Surface 的创建 总结 前言 该系列文章…...

Vite+TS项目中配置路径别名
在使用 Vite 和 TypeScript 的项目中配置路径别名,可以简化模块导入路径,提高代码的可读性和维护性。以下是详细的步骤和示例代码: 1. 配置 Vite 别名 前置条件 下载types/node 下面引入的path会用到 npm install types/node --save-dev原…...