save relationship of objects

This commit is contained in:
tsukasa
2023-09-13 17:55:27 +08:00
parent 8ac6065332
commit 6e5beb4cdf
7 changed files with 131 additions and 11 deletions
+102 -5
View File
@@ -1,5 +1,6 @@
# define a knowledge base class # define a knowledge base class
import json import json
import pickle
from . import AgentPrompt, ComputeKernel from . import AgentPrompt, ComputeKernel
from ..knowledge import * from ..knowledge import *
@@ -39,7 +40,7 @@ class KnowledgeBase:
vector = await self.compute_kernel.do_text_embedding(json.dumps(desc)) vector = await self.compute_kernel.do_text_embedding(json.dumps(desc))
self.store.get_vector_store("default").insert(vector, image.calculate_id()) self.store.get_vector_store("default").insert(vector, image.calculate_id())
async def __embedding_vedio(self, vedio: VideoObject): async def __embedding_video(self, vedio: VideoObject):
desc = {} desc = {}
if not vedio.get_meta(): if not vedio.get_meta():
desc["meta"] = vedio.get_meta() desc["meta"] = vedio.get_meta()
@@ -56,7 +57,7 @@ class KnowledgeBase:
for image in rich_text.get_images().values(): for image in rich_text.get_images().values():
await self.__embedding_image(image) await self.__embedding_image(image)
for vedio in rich_text.get_videos().values(): for vedio in rich_text.get_videos().values():
await self.__embedding_vedio(vedio) await self.__embedding_video(vedio)
for rich_text in rich_text.get_rich_texts().values(): for rich_text in rich_text.get_rich_texts().values():
await self.__embedding_rich_text(rich_text) await self.__embedding_rich_text(rich_text)
@@ -65,13 +66,14 @@ class KnowledgeBase:
self.store.get_vector_store("default").insert(vector, email.calculate_id()) self.store.get_vector_store("default").insert(vector, email.calculate_id())
await self.__embedding_rich_text(email.get_rich_text()) await self.__embedding_rich_text(email.get_rich_text())
async def do_embedding(self, object: KnowledgeObject):
async def __do_embedding(self, object: KnowledgeObject):
if object.get_object_type() == ObjectType.Document: if object.get_object_type() == ObjectType.Document:
await self.__embedding_document(object) await self.__embedding_document(object)
if object.get_object_type() == ObjectType.Image: if object.get_object_type() == ObjectType.Image:
await self.__embedding_image(object) await self.__embedding_image(object)
if object.get_object_type() == ObjectType.Video: if object.get_object_type() == ObjectType.Video:
await self.__embedding_vedio(object) await self.__embedding_video(object)
if object.get_object_type() == ObjectType.RichText: if object.get_object_type() == ObjectType.RichText:
await self.__embedding_rich_text(object) await self.__embedding_rich_text(object)
if object.get_object_type() == ObjectType.Email: if object.get_object_type() == ObjectType.Email:
@@ -79,7 +81,80 @@ class KnowledgeBase:
else: else:
pass pass
async def query(self, prompt: AgentPrompt) -> [ObjectID]: def __save_document(self, document: DocumentObject):
doc_id = document.calculate_id()
self.store.get_object_store().put_object(doc_id, document.encode())
for chunk_id in document.get_chunk_list():
self.store.get_relation_store().add_relation(chunk_id, doc_id)
def __save_image(self, image: ImageObject):
image_id = image.calculate_id()
self.store.get_object_store().put_object(image_id, image.encode())
def __save_video(self, video: VideoObject):
video_id = video.calculate_id()
self.store.get_object_store().put_object(video_id, video.encode())
def __save_rich_text(self, rich_text: RichTextObject):
rich_text_id = rich_text.calculate_id()
rich_text_enc = dict()
rich_text_enc["desc"] = rich_text.desc
rich_text_enc["body"] = {"documents": {}, "images": {}, "videos": {}, "rich_texts": {}}
for key, document in rich_text.get_documents().items():
self.__save_document(document)
doc_id = document.calculate_id()
self.store.get_relation_store().add_relation(doc_id, rich_text_id)
rich_text_enc["body"]["documents"][key] = doc_id
for key, image in rich_text.get_images().items():
self.__save_image(image)
image_id = image.calculate_id()
self.store.get_relation_store().add_relation(image_id, rich_text_id)
rich_text_enc["body"]["images"][key] = image_id
for key, video in rich_text.get_videos().items():
self.__save_video(video)
video_id = video.calculate_id()
self.store.get_relation_store().add_relation(video_id, rich_text_id)
rich_text_enc["body"]["videos"][key] = video_id
for key, rich_text in rich_text.get_rich_texts().items():
self.__save_rich_text(rich_text)
rich_text_id = rich_text.calculate_id()
self.store.get_relation_store().add_relation(rich_text_id, rich_text_id)
rich_text_enc["body"]["rich_texts"][key] = rich_text_id
self.store.get_object_store().put_object(rich_text_id, pickle.dumps(rich_text_enc))
def __save_email(self, email: EmailObject):
email_id = email.calculate_id()
email_enc = dict()
email_enc["desc"] = email.desc
email_enc["body"] = {"content": None}
self.__save_rich_text(email.get_rich_text())
rich_text_id = email.get_rich_text().calculate_id()
self.store.get_relation_store().add_relation(rich_text_id, email_id)
email_enc["body"]["content"] = rich_text_id
self.store.get_object_store().put_object(email_id, pickle.dumps(email_enc))
def __save_object(self, object: KnowledgeObject):
if object.get_object_type() == ObjectType.Document:
self.__save_document(object)
if object.get_object_type() == ObjectType.Image:
self.__save_image(object)
if object.get_object_type() == ObjectType.Video:
self.__save_video(object)
if object.get_object_type() == ObjectType.RichText:
self.__save_rich_text(object)
if object.get_object_type() == ObjectType.Email:
self.__save_email(object)
else:
pass
async def insert_object(self, object: KnowledgeObject):
self.__save_object(object)
self.__do_embedding(object)
async def query_objects(self, prompt: AgentPrompt) -> [ObjectID]:
results = [] results = []
for msg in prompt.messages: for msg in prompt.messages:
if msg.role == "user": if msg.role == "user":
@@ -89,6 +164,28 @@ class KnowledgeBase:
return results return results
async def __prompt_from_objects(self, object_ids: [ObjectID]) -> AgentPrompt:
prompt = AgentPrompt()
for object_id in object_ids:
object = self.store.get_object_reader().get_object(object_id)
if object is None:
raise ValueError(f"object not found: {object_id}")
if object.get_object_type() == ObjectType.Document:
document = object
prompt.messages.append({"role": "agent", "content": document.get_body()})
if object.get_object_type() == ObjectType.Image:
image = object
prompt.messages.append({"role": "agent", "content": json.dumps(image.get_desc())})
if object.get_object_type() == ObjectType.Video:
video = object
prompt.messages.append({"role": "agent", "content": json.dumps(video.get_desc())})
if object.get_object_type() == ObjectType.RichText:
rich_text = object
prompt.messages.append({"role": "agent", "content": json.dumps(rich_text.get_desc())})
if object.get_object_type() == ObjectType.Email:
email = object
prompt.messages.append({"role": "agent", "content": json.dumps(email.get_desc())})
return prompt
+1 -1
View File
@@ -28,7 +28,7 @@ class EmailObject(KnowledgeObject):
return self.desc["tags"] return self.desc["tags"]
def get_rich_text(self): def get_rich_text(self):
return self.body["rich_text"] return self.body["content"]
""" """
+1
View File
@@ -1,5 +1,6 @@
from .object import KnowledgeObject from .object import KnowledgeObject
from .blob import FileBlobStorage from .blob import FileBlobStorage
from .hash import HashValue, hash_data from .hash import HashValue, hash_data
from .relation import ObjectRelationStore
from .object_store import ObjectStore from .object_store import ObjectStore
from .object_id import ObjectID, ObjectType from .object_id import ObjectID, ObjectType
+16
View File
@@ -0,0 +1,16 @@
# define a relation store class
from .object_id import ObjectID
class ObjectRelationStore:
def __init__(self, root_dir: str):
pass
def add_relation(self, object: ObjectID, parent: ObjectID):
pass
def get_related_objects(self, object: ObjectID) -> [ObjectID]:
pass
def delete_relation(self, object_id: ObjectID) -> [ObjectID]:
pass
+8 -2
View File
@@ -1,5 +1,6 @@
import os import os
from .object import ObjectStore
from .object import ObjectStore, ObjectRelationStore
from .data import ChunkStore, ChunkTracker, ChunkListWriter, ChunkReader from .data import ChunkStore, ChunkTracker, ChunkListWriter, ChunkReader
from .vector import ChromaVectorStore, VectorBase from .vector import ChromaVectorStore, VectorBase
import logging import logging
@@ -30,6 +31,9 @@ class KnowledgeStore:
self.root = root_dir self.root = root_dir
relation_store_dir = os.path.join(root_dir, "relation")
self.relation_store = ObjectRelationStore(relation_store_dir)
object_store_dir = os.path.join(root_dir, "object") object_store_dir = os.path.join(root_dir, "object")
self.object_store = ObjectStore(object_store_dir) self.object_store = ObjectStore(object_store_dir)
@@ -39,7 +43,9 @@ class KnowledgeStore:
self.chunk_list_writer = ChunkListWriter(self.chunk_store, self.chunk_tracker) self.chunk_list_writer = ChunkListWriter(self.chunk_store, self.chunk_tracker)
self.chunk_reader = ChunkReader(self.chunk_store, self.chunk_tracker) self.chunk_reader = ChunkReader(self.chunk_store, self.chunk_tracker)
self.vector_store = {} self.vector_store = {}
def get_relation_store(self) -> ObjectRelationStore:
return self.relation_store
def get_object_store(self) -> ObjectStore: def get_object_store(self) -> ObjectStore:
return self.object_store return self.object_store
+1 -1
View File
@@ -45,7 +45,7 @@ async def test_query_email():
KnowledgeBase().query(msg_prompt) KnowledgeBase().query(msg_prompt)
class TestVectorSTorage(unittest.TestCase): class TestKnowledgeBase(unittest.TestCase):
def test_embedding(self): def test_embedding(self):
asyncio.run(test_embedding_email()) asyncio.run(test_embedding_email())
+2 -2
View File
@@ -14,13 +14,13 @@ import asyncio
import unittest import unittest
async def test_embedding_email(): async def test_vector():
storage = ChromaVectorStore("test") storage = ChromaVectorStore("test")
await storage.insert([1, 2, 3], "test") await storage.insert([1, 2, 3], "test")
ids = await storage.query([1, 2, 3], 10) ids = await storage.query([1, 2, 3], 10)
print(ids) print(ids)
class TestVectorSTorage(unittest.TestCase): class TestVectorStorage(unittest.TestCase):
def test_run(self): def test_run(self):
asyncio.run(test_vector()) asyncio.run(test_vector())