向量数据库入门:Chroma从安装到使用全教程(附完整RAG代码) 向量数据库入门Chroma从安装到使用全教程文档处理好了接下来就是存到向量数据库里。很多人第一次接触向量数据库会觉得很神秘。什么是向量为什么要用向量数据库跟传统数据库有什么不一样。其实没那么玄乎。这一篇我们从零讲起。向量数据库是干什么的基本原理是什么用Chroma手把手搭一个最简单的RAG系统。看完你就能上手用了。什么是向量数据库先搞清楚什么是向量。向量就是一串数字。比如[0.1, 0.5, -0.3, …]可能有几百个或者几千个数字。这一串数字代表了一段文本的语义信息。意思相近的文本它们的向量也相近。意思差得远的向量距离就远。这就是语义检索的基础。向量数据库就是专门存向量、做向量相似度搜索的数据库。你给它一段文本它转换成向量然后在库里面找跟它最像的那些向量返回对应的文本。跟传统数据库的区别在哪里。传统数据库找的是精确匹配比如名字等于张三的价格大于100的。向量数据库找的是相似匹配找意思最接近的。传统数据库的查询结果是精确的要么匹配要么不匹配。向量数据库的结果是按相似度排序的没有绝对的对错只有相关程度的高低。为什么需要专门的向量数据库你可能会想不就是算相似度嘛我把向量存在数组里查询的时候遍历一遍算距离不行吗。数据量小的时候可以。几千条、几万条遍历一遍也花不了多少时间。数据量大了就不行了。几十万条、几百万条每次查询都遍历一遍太慢了。用户问一个问题等好几秒才能出结果体验就差了。向量数据库用了各种索引技术比如HNSW、IVF来加速相似搜索。不用遍历所有数据也能找到最相近的结果。速度能快好几个数量级。当然速度快是有代价的。它是近似搜索不是精确搜索。可能会漏掉一些最相关的结果也可能搜进来一些不那么相关的。通常在可接受的范围内。除了检索速度向量数据库还有其他功能。比如持久化存储、元数据过滤、增量更新、分布式部署。这些都是生产环境需要的。常见的向量数据库向量数据库现在有很多选择各有特点。Chroma。轻量级Python友好安装简单嵌到应用里就能用。适合开发和小型项目。数据量太大了性能跟不上。Qdrant。用Rust写的性能不错API友好。单机部署简单也支持集群。各方面比较均衡。Milvus。功能最全面的开源向量数据库支持大规模数据和分布式部署。企业级项目用得多。部署和运维相对复杂。Pinecone。托管服务不用自己部署拿来就用。按用量付费。不想运维的话很方便。Weaviate。开源功能全支持混合搜索和多模态。社区也比较活跃。PGVector。PostgreSQL的向量插件。已经在用PostgreSQL的话装个插件就能用不用额外维护一套数据库。怎么选前面技术选型篇讲过这里不重复了。入门学习用Chroma最方便几行代码就能跑起来。用Chroma搭一个最简单的RAG我们来动手实践一下。用Chroma和LangChain搭一个最简单的RAG系统。先装依赖。pipinstalllangchain langchain-openai chromadb python-dotenv然后写代码。fromdotenvimportload_dotenvfromlangchain_openaiimportChatOpenAI,OpenAIEmbeddingsfromlangchain_community.vectorstoresimportChromafromlangchain.text_splitterimportRecursiveCharacterTextSplitterfromlangchain.chainsimportRetrievalQA load_dotenv()# 准备一些示例文档documents[人工智能训练师是使用智能训练软件在人工智能产品实际使用过程中进行数据库管理、算法参数设置、人机交互设计、性能测试跟踪及其他辅助作业的人员。,人工智能训练师的工作内容包括数据采集与处理、数据标注、模型训练、模型测试与评估、产品优化等。,三级人工智能训练师需要掌握数据标注规范、常用标注工具使用、基础机器学习概念、质量检验方法等知识。,人工智能训练师的职业发展路径可以从初级训练师做起逐步晋升为中级、高级训练师也可以转向产品经理、数据分析师等方向。,数据标注是人工智能训练师最基础的工作包括文本标注、图像标注、语音标注、视频标注等多种类型。,数据质量是AI模型效果的关键。标注质量不高的训练数据会直接导致模型准确率下降。,主动学习是一种数据标注优化方法。模型先对未标注数据进行预测只把最不确定的样本拿给人标注可以节省标注成本。,]# 文本分块text_splitterRecursiveCharacterTextSplitter(chunk_size200,chunk_overlap20,)splitstext_splitter.create_documents(documents)# 初始化Embedding模型embeddingsOpenAIEmbeddings()# 创建Chroma向量数据库vectorstoreChroma.from_documents(documentssplits,embeddingembeddings,persist_directory./chroma_db,)# 持久化保存vectorstore.persist()print(f已存入{len(splits)}个文本块)运行这段代码就会在当前目录生成一个chroma_db文件夹里面存了向量数据。我们来测试一下检索效果。# 加载数据库vectorstoreChroma(persist_directory./chroma_db,embedding_functionembeddings,)# 测试检索query人工智能训练师是做什么的resultsvectorstore.similarity_search(query,k3)fori,docinenumerate(results):print(f第{i1}条结果)print(doc.page_content)print()运行一下你会看到返回了三个最相关的文本块。都是跟人工智能训练师工作内容相关的。这就是向量检索的效果。用户的问题和知识库的内容字面上不完全一样但语义上是相关的就能被搜出来。接上大模型做问答光有检索还不够我们把大模型也接上做成完整的问答。# 初始化大模型llmChatOpenAI(modelgpt-3.5-turbo,temperature0)# 创建检索问答链qa_chainRetrievalQA.from_chain_type(llmllm,chain_typestuff,retrievervectorstore.as_retriever(search_kwargs{k:3}),return_source_documentsTrue,)# 提问resultqa_chain.invoke({query:人工智能训练师的工作内容有哪些})print(回答,result[result])print(\n参考来源)fordocinresult[source_documents]:print(-,doc.page_content[:80])运行一下。你会看到系统先检索了相关的文档片段然后基于这些内容生成了回答。还能看到参考来源是哪些。这就是一个完整的、最小的RAG系统。从文档到向量数据库从检索到生成全部流程都有了。几个基本概念说几个向量数据库里常用的概念后面遇到了知道是什么意思。Embedding向量嵌入。把文本转换成向量的过程也指转换出来的向量本身。做Embedding用的模型叫Embedding模型。相似度搜索。给一个查询向量在数据库里找跟它最像的向量。也叫最近邻搜索。余弦相似度。衡量两个向量相似程度的常用方法。值越大越相似最大值是1。除了余弦距离还有欧氏距离、曼哈顿距离最常用的是余弦。Top-K检索。返回最相似的K个结果。K是你指定的数量比如3、5、10。HNSW索引。一种常用的向量索引算法。全称是Hierarchical Navigable Small World。检索速度快效果也不错。很多向量数据库默认用它。持久化。把内存里的数据保存到磁盘上。程序重启以后数据还在。Chroma默认是存在内存里的要调用persist才会存盘。这些都是入门级的概念先有个印象就行。用多了自然就熟了。常见的坑刚用向量数据库的时候容易踩几个坑。第一个Embedding模型要统一。存数据的时候用的什么Embedding模型查询的时候也要用同一个。不同模型生成的向量不在同一个空间里没法比相似度。OpenAI的Embedding和BGE的Embedding不能混用。第二个数据量小的时候效果可能不如关键词搜索。向量检索的优势在数据量大、语义复杂的时候才体现得出来。只有几十条数据可能还不如直接搜关键词。第三个不要盲目追求高维度。向量维度越高表达能力越强但存储和计算成本也越高。选合适的就行不用一味追求大。第四个Chroma不适合生产环境的大流量。它是为开发和小规模设计的。真要上生产数据量又大还是换Milvus或者Qdrant。下一篇我们深入讲向量数据库。不同的向量数据库怎么选各自的优缺点生产环境怎么部署和优化。