当前位置: 首页 > news >正文

注意 llamaIndex 中 Chroma 的坑!

llamaIndex 做索引是默认存在内存中,由于索引需要通过网络调用 API,而且索引是比较耗时的操作,为了避免每次都进行索引,使用向量数据库进行 Embedding 存储以提高效率。首先将 Document 解析成 Node,索引时调用 Embedding API 生成 Node 的 Embedding 并存入 Chroma 向量数据,以便后续查询方便。

本文使用的 JinaAI的 Embedding Model,Document 解析 Node 用的是默认方式,按段落、句子进行切分,对于纯文本这样处理是可以,如果有图和表格,就要选用其他的策略。要注意的点是,如果不指定 Chroma Embedding 的模型, 默认使用的是 all-MiniLM-L6-v2 Embedding 模型,这样就会导致搜索时数据非常不准确,topk 都出不来。相似度算法设置为 Cosine,Chroma 默认的算法是 L2。

代码中使用的文档是官方的例子,paul_graham_essay.txt,代码只做了 Retrieve 这步,这步是 RAG 的核心。如果用中文把模型改成 cn 既可,JinaAI 这个 Embedding 模型,Ollama 也提供,如果需要大量索引,可以在本地搭建一个,JinaAI 免费 Token 数有限。

在这里插入图片描述

import chromadbfrom llama_index.embeddings.jinaai import JinaEmbedding
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.vector_stores.chroma import ChromaVectorStore
from llama_index.core import StorageContext
from llama_index.core import Settings
from chromadb.utils import embedding_functions## 访问 https://jina.ai 直接获取 API key
jinaai_api_key = "xxxx"embed_model = JinaEmbedding(api_key=jinaai_api_key,model="jina-embeddings-v2-base-en",
)documents = SimpleDirectoryReader("./data").load_data()db = chromadb.PersistentClient(path="./chroma_db")# create collection
chroma_collection = db.get_or_create_collection("quickstart", embedding_function= embedding_functions.JinaEmbeddingFunction(api_key=jinaai_api_key,model_name="jina-embeddings-v2-base-en"),metadata={"hnsw:space": "cosine"}
)# assign chroma as the vector_store to the context
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
Settings.embed_model = embed_model# create your index
index = VectorStoreIndex.from_documents(documents, show_progress=True, storage_context=storage_context
)search_query_retriever = index.as_retriever(similarity_top_k=5)nodes = search_query_retriever.retrieve("what programming lanugage author used?")print(len(nodes))

相关文章:

  • Go 三色标记法:一种高效的垃圾回收策略
  • 搭建Vue的环境
  • 数据库精选题(二)(引言+关系代数)
  • SFF1006A-ASEMI无人机专用SFF1006A
  • AGV机器人的调度开发分析(1)- 内核中的路线规划
  • 商超智能守护:AI监控技术在零售安全中的应用
  • Rust:warp 编写 RESTful API 的示例及原理分析
  • SLAM Paper Reading和代码解析
  • Git分支的状态存储——stash命令的详细用法
  • 实时语音翻译软件哪个好?多语言实时沟通无负担
  • BigDecimal 小数位的处理(RoundingMode)
  • Eigen::Isometry3d变换矩阵的常用方法
  • Pwn刷题记录(不停更新)
  • 初中英语优秀作文分析-005How to Plan Our Life Wisely-如何明智地规划我们的生活
  • Java短路逻辑运算符
  • 〔开发系列〕一次关于小程序开发的深度总结
  • Apache Pulsar 2.1 重磅发布
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • es6(二):字符串的扩展
  • Fastjson的基本使用方法大全
  • JavaScript中的对象个人分享
  • java第三方包学习之lombok
  • java正则表式的使用
  • Laravel5.4 Queues队列学习
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • python_bomb----数据类型总结
  • SpingCloudBus整合RabbitMQ
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Web Storage相关
  • 分布式熔断降级平台aegis
  • 问题之ssh中Host key verification failed的解决
  • #{} 和 ${}区别
  • #预处理和函数的对比以及条件编译
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (十六)、把镜像推送到私有化 Docker 仓库
  • (四)软件性能测试
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • ./configure,make,make install的作用(转)
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .net 7 上传文件踩坑
  • .net core 6 集成和使用 mongodb
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET/C# 的字符串暂存池
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .Net的C#语言取月份数值对应的MonthName值
  • ??在JSP中,java和JavaScript如何交互?
  • @Autowired 与@Resource的区别
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • [ linux ] linux 命令英文全称及解释
  • [ 蓝桥杯Web真题 ]-布局切换
  • [ACP云计算]易混淆知识点(考题总结)
  • [ActionScript][AS3]小小笔记