文章目录简介向量向量化向量数据库是什么常见向量数据库RedisStack安装部署案例实战案例一案例二案例三案例四案例五向量计算语义相似度案例六: redisstack作为向量存储数据库简介向量定义向量是用于表示具有大小和方向的量Vector是向量或矢量的意思向量是数学里的概念而矢量是物理里的概念但二者描述的是同一件事。向量可以在不同的维度空间中定义最常见的是二维和三维空间中的向量但理论上也可以有更高维的向量。例如在二维平面上的一个向量可以写作(x,y)在三维空间里则会有一个额外的z坐标即(x,y,z)。向量化核心概念Embedding将文本、图像和视频转换为称为向量(Vectors)的浮点数数组。这些向量旨在捕捉文本、图像和视频的含义数组的长度称为向量的维度(Dimensionality)。EmbeddingModel是嵌入过程中采用的模型当前EmbeddingModel的接口主要用于将文本转换为数值向量接口的设计主要围绕这两个目标展开:可移植性该接口确保在各种嵌入模型之间的轻松适配。它允许开发者在不同的嵌入技术或模型之间切换所需的代码更改最小化。简单性嵌入模型简化了文本转换为嵌入的过程。通过提供如 embed(stringtex)和 embed(pocumentdocument)这样简单的方法它去除了处理原始文本数据和嵌入算法的复杂性。Dimensionality向量维度如我们所见每个数值向量都有x和y坐标。x、y、…是这个向量空间的轴称为维度。对于我们想要表示为向量的一些非数值实体我们首先需要决定这些维度并为每个实体在每个维度上分配一个值。例如在一个交通工具数据集中我们可以定义四个维度:“轮子数量”、“是否有发动机”、“是否可以在地上开动和最大乘客数”。然后我门可以将一些车辆表示为:itemnumber of wheelshas an enginemoves on landmax occupantscar4yesyes5bicycle2noyes1tricycle3noyes1motorcycle2yesyes2sailboat0nono20ship0yesno1000如何确定哪些向量是相似的每个向量都有一个长度和方向。例如在这个图中p和a指向相同的方向但长度不同。p和b正好指向相反的方向但有相同的长度。然后还有C长度比p短一点方向不完全相同但很接近。【所以判断向量是否相似需要看比较维度】向量数据库是什么向量存储(VectorStore)是一种用于存储和检索高维向量数据的数据库或存储解决方案它特别适用于处理那些经过嵌入模型转化后的数据。在VectorStore中查询与传统关系数据库不同。它们执行的是相似性搜索而不是精确匹配。当给定一个向量作为查询时VectorStore返回与查询向量相似的向量。VectorStore用于将您的数据与AI模型集成。在使用它们时的第一步是将您的数据加载到矢量数据库中。然后当要将用户查询发送到AI模型时首先检索一组相似文档。然后这些文档作为用户问题的上下文并与用户的查询一起发送到AI模型。这种技术被称为检索增强生成(RetrievalAugmentedGeneration,RAG)一句话总结向量数据库是一种专门用于存储、管理和检索向量数据即高纬数值数组的数据库系统。其核心功能是通过高效的索引结构和相似性计算算法。支持大规模向量数据的快速查询与分析向量数据库维度越高查询精度也越高查询效果也就越好。能干嘛将文本、图像和视频转换为向量(vectors)的浮点数数组存储在向量数据库中。但是查询与传统关系数据库不同它们执行相似性搜索而不是精确匹配。当给定一个向量作为查询时向量数据库返回与查询向量相似的向量。指征特点捕捉复杂的词汇关系(如语义相似性、同义词、多义词)向量嵌入为检索增强生成(RAG)应用程序提供支持常见向量数据库向量数据库描述FAISS一个用于高效相似性搜索和密集向量聚类的库Chroma开源的轻量级向量数据库有极简的 APIMilvus开源的专为向量搜索设计的云原生数据库。性能强悍功能丰富。覆盖轻量级的原型开发到十亿级向量的大规模生产系统Pgvector开源关系型数据库 PostgreSQL 的扩展为 PostgreSQL 增加了向量数据类型和相似性搜索功能Redis开源内存数据结构存储现已原生支持向量相似性搜索功能Elasticsearch开源分布式搜索和分析引擎提供了一个基于文档的数据库结构化、非结构化和向量数据通过高效的列式存储统一管理RedisStack安装部署本文使用RedisStack作为向量数据库功能Redis Stack 是 Redis 官方推出的一组扩展功能集它将 Redis 从一个单纯的内存键值Key-Value数据库提升为功能丰富的多模态增强型数据平台。特性标准 Redis (Redis Open Source)Redis Stack核心定位高性能内存键值数据库 / 缓存多模态数据平台 (JSON, 向量, 搜索, 时序)数据结构String, List, Set, Hash, ZSet, Stream继承标准结构额外增加 JSON, TimeSeries 等查询能力仅支持通过 Key 或特定数据结构命令查询支持复杂的二级索引、全文检索和向量相似度查询适用场景传统缓存、会话管理、简单消息队列AI 向量数据库、复杂对象缓存、时序监控、高性能搜索安装部署# 步骤1停止并卸载原有的Redis#1.停止原有的Redis后台服务 brew services stop redis #2.彻底卸载原有的 redis 组件 brew uninstall redis #3.可选清理不再需要的依赖缓存 brew # 步骤2添加官方仓库并安装RedisStack#1.添加Redis官方的HomebrewTap仓库 brew tap redis-stack/redis-stack #2.安装RedisStack包含核心服务与RedisInsight可视化工具 brew install redis-stack 或者 brew install redis-stack-server # 步骤3启动RedisStackbrew services start redis-stack # 一般会报错Error:Noavailable formulawiththenameredis-stack-server.# 原因redis-stack-server 是通过Cask通常用于管理桌面应用或打包好的二进制服务安装的而不是标准的Formula。对于Cask安装的服务Homebrew的 brew services 命令有时无法直接识别或者需要显式指定。 # 解决方案redis-stack-server 或者 nohup redis-stack-server/dev/null21启动 # 步骤4:关闭服务 pkill-f redis-stack-server案例实战Embedding是将文本字符串表示为向量(浮点数列表)通过计算向量之间的距离来衡量文本之间的相关性。向量距离越小表示文本之间的相关性越高;距离越大相关性越低。应用搜索: 根据文本查询的相关性对结果进行排序聚类: 根据文本相似性将其分组推荐: 根据相关文本字符串推荐项目异常检测: 识别与其他内容相关性较低的异常点多样性测量: 分析相似性分布分类: 将文本字符串根据其最相似的标签进行分类案例一pip install dashscope1.25.18# 直连阿里百炼版本 # 提前配置环境变量DASHSCOPE_API_KEYfrom httpimportHTTPStatusimportdashscopeinput_text我的名字是Jackrespdashscope.TextEmbedding.call(modeltext-embedding-v4,inputinput_text,)ifresp.status_codeHTTPStatus.OK:print(resp)案例二from openaiimportOpenAI# 兼容OpenAI版本 from lang_chain.configimportDASHSCOPE_API_KEYinput_text我的名字是JackclientOpenAI(# key提前配置到环境变量 api_keyDASHSCOPE_API_KEY,# 华北2北京https://dashscope.aliyuncs.com/compatible-mode/v1 # 新加坡https://dashscope-intl.aliyuncs.com/compatible-mode/v1 # 美国弗吉尼亚https://dashscope-us.aliyuncs.com/compatible-mode/v1 base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1,)resclient.embeddings.create(modeltext-embedding-v4,inputinput_text,)print(res.model_dump_json())案例三from langchain_community.embeddingsimportDashScopeEmbeddings# 文档向量化 #1.获取专业向量模型 embeddingsDashScopeEmbeddings(modeltext-embedding-v4)#2.文本向量化 input_text我的名字是Jackquery_resultembeddings.embed_query(input_text)print(f文本向量: {query_result})print(f文本向量长度: {len(query_result)},sep)# 文本向量长度:1024阿里百炼固定长度 #3.文档向量化 document_resultembeddings.embed_documents([西游记,红楼梦,三国演义,水浒传])print(f文档向量:{document_result})print(文档向量数量,len(document_result))print(文档向量长度,len(document_result[0]),sep)案例四# 阿里百炼多模态向量化 from httpimportHTTPStatusimportdashscopefrom streamlitimportjsonfrom lang_chain.configimportDASHSCOPE_API_KEY#1.获取多模态向量化模型支持文本、图片、视频的向量化 respdashscope.MultiModalEmbedding.call(modeltongyi-embedding-vision-plus-2026-03-06,# 提前开启服务 dashscope_api_keyDASHSCOPE_API_KEY,input[{text:我的名字是Jack}])format_resp#2.处理模型结果格式化输出ifresp.status_codeHTTPStatus.OK:format_resp{status_code:resp.status_code,request_id:getattr(resp,request_id,),code:getattr(resp,code,),message:getattr(resp,message,),output:resp.output,usage:resp.usage,}print(json.dumps(format_resp))案例五向量计算语义相似度 把文本转为向量最核心的作用是可以通过向量之间的计算来分析文本之间的相似度 常见方法 1. 向量余弦相似度python提供sklearn 2. 欧式距离 3. 点积 from httpimportHTTPStatusimportdashscopeimportnumpyas np #1.准备数据 texts[我喜欢吃苹果,苹果是我最喜欢的水果,我喜欢用苹果手机]#2.依次向量化 embeddings[]fortext in texts:respdashscope.TextEmbedding.call(modeltext-embedding-v4,inputtext,)# resp结果 #DashScopeAPIResponse(# status_codeHTTPStatus.OK:200,request_id50021011-f010-940f-9e0b-f1005f0f21d1,code,message,output{# embeddings: [{embedding:[0.02416922338306904,-0.05474225804209709],text_index:0}]},usage{# total_tokens:4})ifresp.status_codeHTTPStatus.OK:embeddings.append(resp.output[embeddings][0][embedding])#3.计算向量余弦相似度 defcosine_similarity(vec1,vec2):dot_productnp.dot(vec1,vec2)norm_vec1np.linalg.norm(vec1)norm_vec2np.linalg.norm(vec2)returndot_product/(norm_vec1*norm_vec2)#4.比较不同文本之间的相似度print(cosine_similarity(embeddings[0],embeddings[1]))print(cosine_similarity(embeddings[0],embeddings[2]))print(cosine_similarity(embeddings[1],embeddings[2]))案例六: redisstack作为向量存储数据库# redis stack作为向量存储数据库 from langchain_community.embeddingsimportDashScopeEmbeddingsfrom langchain_community.vectorstoresimportRedisfrom langchain_core.documentsimportDocumentfrom lang_chain.configimportDASHSCOPE_API_KEY#1.获取专业向量模型阿里Embedding模型 embeddingsDashScopeEmbeddings(modeltext-embedding-v4,dashscope_api_keyDASHSCOPE_API_KEY)#2.准备要向量化的文档 texts[我的名字叫jack,我今年18岁,我毕业于南京大学]documents[Document(page_contenttext)fortext in texts]#3.连接redis-stack并存入向量 vector_storeRedis.from_documents(documentsdocuments,embeddingembeddings,redis_urlredis://localhost:6379,# 连接redis index_namemy_em,# key-predix)#4.后续直接检索 retrievervector_store.as_retriever(search_kwargs{k:1})resultsretriever.invoke(名字)forresult in results:print(result)