diff options
author | Gustaf Rydholm <gustaf.rydholm@gmail.com> | 2024-04-05 00:26:46 +0200 |
---|---|---|
committer | Gustaf Rydholm <gustaf.rydholm@gmail.com> | 2024-04-05 00:26:46 +0200 |
commit | 47084bfa9fe2f21bfc079bdd4d057b5768083454 (patch) | |
tree | 80c78dfa02fdf6b49c37db25243ea3aea2cf9d72 /rag/db/documents.py | |
parent | 8b5169789d4d1e998091441cc68820685c794c9d (diff) |
Wip documents and vector db
Diffstat (limited to 'rag/db/documents.py')
-rw-r--r-- | rag/db/documents.py | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/rag/db/documents.py b/rag/db/documents.py new file mode 100644 index 0000000..bdbf5a4 --- /dev/null +++ b/rag/db/documents.py @@ -0,0 +1,85 @@ +import os +from typing import List +import hashlib +import psycopg +from langchain_core.documents.base import Document + +TABLES = """ +CREATE TABLE IF NOT EXISTS chunk ( + id serial PRIMARY KEY, + data text) + +CREATE TABLE IF NOT EXISTS document ( + hash text PRIMARY KEY) +""" + + +class Documents: + def __init__(self) -> None: + self.conn = psycopg.connect( + f"dbname={os.environ['RAG_DB_NAME']} user={os.environ['RAG_USER']}" + ) + self.__create_content_table() + + def close(self): + self.conn.close() + + def __create_content_table(self): + with self.conn.cursor() as cur: + cur.execute(TABLES) + self.conn.commit() + + def __hash(self, chunks: List[Document]) -> str: + document = str.encode("".join([chunk.page_content for chunk in chunks])) + return hashlib.sha256(document).hexdigest() + + def add_document(self, chunks: List[Document]) -> bool: + with self.conn.cursor() as cur: + hash = self.__hash(chunks) + cur.execute( + """ + SELECT * FROM document + WHERE + hash = %s + """, + hash, + ) + exist = cur.fetchone() + if exist is None: + cur.execute( + """ + INSERT INTO document + (hash) VALUES + (%s) + """, + hash, + ) + self.conn.commit() + return exist is not None + + + def add_chunk(self, data: str): + with self.conn.cursor() as cur: + cur.execute( + """ + INSERT INTO chunk + (data) VALUES + (%s) + """, + data, + ) + self.conn.commit() + + def get_chunk(self, id: int): + with self.conn.cursor() as cur: + cur.execute( + """ + SELECT * FROM chunk + WHERE + id = %s + """, + str(id), + ) + chunk = cur.fetchone() + self.conn.commit() + return chunk |