AGI-rag学习:ChromaDB使用2,json类型文档,问答类内容,【20251016课复习】

说明

记录学习llm过程中的学习代码

下面的代码是学习如何使用chromaDB的例子,文档是json类型,问题和答案组成,向量化问题,答案不需要向量化

py代码

python 复制代码
# chromaDB使用.py
import chromadb
from chromadb.config import Settings
import json
from models import *


# 打开train.json文件,并读取数据
with open('../Data/train.json', 'r', encoding='utf-8') as f:
    data = [json.loads(line)  for line in f.readlines()]

# 将读取的数据按字段拆出放入instructions和outputs中
# 在这个业务中,instruction因为需要被查询,需要向量化,output是和instruction对应的查询结果
print(len(data))
data = data[:10]
instructions = [d['instruction'] for d in data]
outputs = [d['output'] for d in data]
print("instructions:", instructions)
print("outputs:", outputs)
print('-' * 100)


# 负责和向量数据库打交道,接收文档转为向量,并保存到向量数据库中,然后根据需要从向量库中检索出最相似的记录
class MyVectorDBConnector:
    # 初始化,传入集合名称,和向量化函数名
    def __init__(self, collection_name):
        # 当前配置中,数据保存在内存中,如果需要持久化到磁盘,需使用 PersistentClient创建客户端
        chroma_client = chromadb.Client(Settings(allow_reset=True))

        # 持久化到磁盘
        chroma_client = chromadb.PersistentClient(path="./chroma_data")
        # 为了演示,实际不需要每次 reset()
        # chroma_client.reset()

        # 创建一个 collection
        self.collection = chroma_client.get_or_create_collection(name=collection_name)

        # 连接大模型的客户端
        self.client = get_normal_client()

    # 向量化
    def get_embeddings(self, texts, model=ALI_TONGYI_EMBEDDING_V4):
        '''封装 OpenAI 的 Embedding 模型接口'''
        data = self.client.embeddings.create(input=texts, model=model).data
        return [x.embedding for x in data]

    # 添加文档与向量
    def add_documents(self, instructions, outputs):
        '''向 collection 中添加文档与向量'''
        embeddings = self.get_embeddings(instructions)

        self.collection.add(
            embeddings=embeddings,  # 每个文档的向量
            documents=outputs,  # 文档的原文
            ids=[f"id{i+100}" for i in range(len(outputs))]  # 每个文档的 id
        )
        print("self.collection.count():", self.collection.count())

    # 检索向量数据库
    def search(self, query, n_results):
        ''' 检索向量数据库
           query是用户的查询,
           n_results:查出n个相似最高的记录
        '''
        results = self.collection.query(
            query_embeddings=self.get_embeddings([query]),
            n_results=n_results
        )
        return results


# 创建一个向量数据库对象
vector_db = MyVectorDBConnector("demo_wenda")

# 向 向量数据库 中添加文档
vector_db.add_documents(instructions, outputs)

user_query = "得了白癜风怎么办?"
results = vector_db.search(user_query, 2)
print(results)
print('-' * 100)

for para in results['documents'][0]:
    print(para + "\n----\n")
相关推荐
辣知2 小时前
辣知·化智93 被历史尘封的鬻子
学习
每天题库4 小时前
西藏安全员 A 证备考真题题库 强化重点知识刷题提升通过率
学习·安全·考试·题库·考证
Be for thing4 小时前
PyTorch基础|Tensor张量详解,张量创建、数据类型与常用操作
pytorch·学习·1024程序员节
前进的李工4 小时前
Agent 学习笔记 02:Harness 与工作流怎么理解
笔记·学习·agent·工作流·harness
m4Rk_5 小时前
【论文阅读】Agent记忆机制(114):MemoryTax——当 Agent 能自主搜索历史,专门的记忆系统还划算吗?
论文阅读·人工智能·学习·开源·github
程序员梅雨7 小时前
【从零开始学习数据仓库 | 第一篇】:维度建模理论
大数据·数据仓库·学习·阿里云·数据分析
keyipatience8 小时前
Git学习(4)Git分布式优势与实战配置全解析
git·学习
Dawson Zhu10 小时前
【AI编译器入门④】编译中端:图优化Pass全解析——DCE、常量折叠、算子融合与布局变换
人工智能·语言模型·架构·aigc·agi
comyccccc11 小时前
STM32F407VET6核心板的部分电路绘制学习笔记
笔记·stm32·学习
叼烟扛炮11 小时前
Linux 学习笔记(三十六):并发进阶——读写锁 vs 自旋锁,到底怎么选?
linux·运维·服务器·笔记·学习