目錄
- 代碼
- 代碼解釋
- **1. 導入 chatGLM 嵌入函數**
- **2. 創建 ChromaDB 客戶端和集合**
- **3. 查詢集合中的數據數量**
- **4. 添加數據到集合**
- **5. 獲取已存儲的文檔**
- **6. 更新文檔**
- **7. 再次獲取數據,驗證更新結果**
- **8. 刪除某個文檔**
- **9. 獲取已刪除的文檔**
- **總結**
代碼
import chromadb.utils.embedding_functions as embedding_functionsopenai_ef = embedding_functions.OpenAIEmbeddingFunction(api_key="your api key",api_base="https://open.bigmodel.cn/api/paas/v4",model_name="embedding-3")
import chromadb
client = chromadb.Client()
collection = client.get_or_create_collection(name="my_collection", embedding_function=openai_ef)
collection.count()
0
collection.add(documents=["lorem ipsum...", "doc2", "doc3"],metadatas=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}],ids=["id1", "id2", "id3"]
)
collection.get(ids=["id1", "id2", "id3"]
)
{'ids': ['id1', 'id2', 'id3'],'embeddings': None,'documents': ['lorem ipsum...', 'doc2', 'doc3'],'uris': None,'data': None,'metadatas': [{'chapter': '3', 'verse': '16'},{'chapter': '3', 'verse': '5'},{'chapter': '29', 'verse': '11'}],'included': [<IncludeEnum.documents: 'documents'>,<IncludeEnum.metadatas: 'metadatas'>]}
collection.update(ids=["id1", "id2", "id3"],metadatas=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}],documents=["doc1", "doc2", "doc3"]
)
collection.get(ids=["id1", "id2", "id3"]
)
{'ids': ['id1', 'id2', 'id3'],'embeddings': None,'documents': ['doc1', 'doc2', 'doc3'],'uris': None,'data': None,'metadatas': [{'chapter': '3', 'verse': '16'},{'chapter': '3', 'verse': '5'},{'chapter': '29', 'verse': '11'}],'included': [<IncludeEnum.documents: 'documents'>,<IncludeEnum.metadatas: 'metadatas'>]}
collection.delete(ids=["id1"]
)
collection.get(ids=["id1"]
)
{'ids': [],'embeddings': None,'documents': [],'uris': None,'data': None,'metadatas': [],'included': [<IncludeEnum.documents: 'documents'>,<IncludeEnum.metadatas: 'metadatas'>]}
代碼解釋
1. 導入 chatGLM 嵌入函數
import chromadb.utils.embedding_functions as embedding_functionsopenai_ef = embedding_functions.OpenAIEmbeddingFunction(api_key="your api key",api_base="https://open.bigmodel.cn/api/paas/v4",model_name="embedding-3")
解釋:
embedding_functions.OpenAIEmbeddingFunction
用于創建 chatGLM 的文本嵌入函數,API 請求會發送到https://open.bigmodel.cn/api/paas/v4
,使用embedding-3
作為嵌入模型。- 這里的
api_key
需要替換為你的實際 API 密鑰。
2. 創建 ChromaDB 客戶端和集合
import chromadb
client = chromadb.Client()
collection = client.get_or_create_collection(name="my_collection", embedding_function=openai_ef)
解釋:
chromadb.Client()
創建一個 ChromaDB 客戶端。client.get_or_create_collection()
用于獲取或創建一個名為"my_collection"
的集合,并使用openai_ef
作為嵌入函數。
3. 查詢集合中的數據數量
collection.count()
輸出:
0
解釋:
collection.count()
返回集合中的文檔數量。- 由于此時還沒有向集合添加任何數據,所以返回
0
。
4. 添加數據到集合
collection.add(documents=["lorem ipsum...", "doc2", "doc3"],metadatas=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}],ids=["id1", "id2", "id3"]
)
解釋:
documents
:存儲要添加的文檔內容,如"lorem ipsum..."
。metadatas
:為每個文檔添加元數據,例如"chapter"
和"verse"
。ids
:為每個文檔指定唯一的id
(id1
,id2
,id3
)。
5. 獲取已存儲的文檔
collection.get(ids=["id1", "id2", "id3"]
)
輸出:
{'ids': ['id1', 'id2', 'id3'],'embeddings': None,'documents': ['lorem ipsum...', 'doc2', 'doc3'],'uris': None,'data': None,'metadatas': [{'chapter': '3', 'verse': '16'},{'chapter': '3', 'verse': '5'},{'chapter': '29', 'verse': '11'}],'included': ['documents', 'metadatas']
}
解釋:
documents
:返回存儲的文檔內容。metadatas
:返回對應的元數據。ids
:返回請求的id
。embeddings
為空,因為當前存儲時沒有計算嵌入(可能是 OpenAI API 限制或者設置問題)。
6. 更新文檔
collection.update(ids=["id1", "id2", "id3"],metadatas=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}],documents=["doc1", "doc2", "doc3"]
)
解釋:
- 更新
id1
對應的document
從"lorem ipsum..."
變為"doc1"
。 - 其他
id
保持不變。
7. 再次獲取數據,驗證更新結果
collection.get(ids=["id1", "id2", "id3"]
)
輸出:
{'ids': ['id1', 'id2', 'id3'],'embeddings': None,'documents': ['doc1', 'doc2', 'doc3'],'uris': None,'data': None,'metadatas': [{'chapter': '3', 'verse': '16'},{'chapter': '3', 'verse': '5'},{'chapter': '29', 'verse': '11'}],'included': ['documents', 'metadatas']
}
解釋:
id1
的document
成功更新為"doc1"
,其他數據未改變。
8. 刪除某個文檔
collection.delete(ids=["id1"]
)
解釋:
- 刪除
id1
對應的文檔。
9. 獲取已刪除的文檔
collection.get(ids=["id1"]
)
輸出:
{'ids': [],'embeddings': None,'documents': [],'uris': None,'data': None,'metadatas': [],'included': ['documents', 'metadatas']
}
解釋:
id1
的數據已經被刪除,因此返回空列表。
總結
本代碼展示了如何使用 ChromaDB 進行以下操作:
- 創建集合,并使用 OpenAI 生成嵌入。
- 添加文檔 到集合。
- 查詢文檔數量 和 獲取文檔。
- 更新文檔內容。
- 刪除文檔 并驗證刪除結果。
這樣,你可以使用 ChromaDB 作為一個輕量級的向量數據庫,結合 chatGLM 的嵌入模型進行信息存儲和查詢。