2023-08-30 17:16:37 +08:00
|
|
|
# define a knowledge base class
|
2023-09-05 20:42:22 +08:00
|
|
|
from . import AgentPrompt, ComputeKernel
|
|
|
|
|
from ..knowledge.object import KnowledgeObject, ObjectType, EmailObject, TextChunkObject, ImageObject
|
|
|
|
|
from ..knowledge.object_storage import ObjectStorage
|
|
|
|
|
from ..knowledge.vector.vector_base import VectorBase
|
2023-08-30 17:16:37 +08:00
|
|
|
|
|
|
|
|
class KnowledgeBase:
|
2023-08-31 20:13:41 +08:00
|
|
|
def __init__(self) -> None:
|
|
|
|
|
self.object_store = ObjectStorage()
|
|
|
|
|
self.vector_base = VectorBase()
|
|
|
|
|
self.compute_kernel = ComputeKernel()
|
|
|
|
|
|
2023-08-30 17:16:37 +08:00
|
|
|
async def insert(self, object: KnowledgeObject):
|
2023-08-31 20:13:41 +08:00
|
|
|
if object.object_type == ObjectType.Email:
|
|
|
|
|
email: EmailObject = object
|
|
|
|
|
for text_id in email.text:
|
|
|
|
|
[text, _] = self.object_store.get(text_id)
|
|
|
|
|
text: TextChunkObject = text
|
|
|
|
|
vector = await self.compute_kernel.do_text_embedding(text.text)
|
|
|
|
|
self.vector_base.insert(vector, text_id)
|
|
|
|
|
|
|
|
|
|
for image_id in email.images:
|
|
|
|
|
[image, _] = self.object_store.get(image_id)
|
|
|
|
|
image: ImageObject = image
|
|
|
|
|
vector = await self.compute_kernel.do_text_embedding(image.meta)
|
|
|
|
|
self.vector_base.insert(vector, image_id)
|
|
|
|
|
|
|
|
|
|
vector = await self.compute_kernel.do_text_embedding(email.meta)
|
|
|
|
|
self.vector_base.insert(vector, email.get_id())
|
|
|
|
|
else:
|
|
|
|
|
pass
|
2023-08-30 17:16:37 +08:00
|
|
|
|
|
|
|
|
async def query(self, prompt: AgentPrompt) -> AgentPrompt:
|
2023-08-31 20:13:41 +08:00
|
|
|
for msg in prompt.messages:
|
|
|
|
|
if msg.role == "user":
|
|
|
|
|
vector = await self.compute_kernel.do_text_embedding(msg.content)
|
|
|
|
|
object_ids = self.vector_base.query(vector, 10)
|
|
|
|
|
for object_id in object_ids:
|
|
|
|
|
if object_id.object_type == ObjectType.Email:
|
2023-09-05 20:42:22 +08:00
|
|
|
[object, email] = self.object_store.get(object_id)
|
|
|
|
|
if object.object_type == ObjectType.Email:
|
|
|
|
|
email: EmailObject = object
|
|
|
|
|
prompt.append(AgentPrompt())
|
|
|
|
|
prompt
|
2023-08-31 20:13:41 +08:00
|
|
|
|
|
|
|
|
|
2023-08-31 16:32:20 +08:00
|
|
|
|
|
|
|
|
|