Create an abstract MemoryProviderSingleton class. Pass config instead of instantiating a new one where used.

This commit is contained in:
BillSchumacher
2023-04-06 22:25:17 -05:00
parent 3f106963a8
commit 6819799ebe
7 changed files with 48 additions and 19 deletions

View File

@@ -1,6 +1,6 @@
import browse import browse
import json import json
from memory import PineconeMemory from memory.pinecone import PineconeMemory
import datetime import datetime
import agent_manager as agents import agent_manager as agents
import speak import speak
@@ -52,7 +52,7 @@ def get_command(response):
def execute_command(command_name, arguments): def execute_command(command_name, arguments):
memory = PineconeMemory() memory = PineconeMemory(cfg=cfg)
try: try:
if command_name == "google": if command_name == "google":

View File

@@ -1,3 +1,4 @@
import abc
import os import os
import openai import openai
from dotenv import load_dotenv from dotenv import load_dotenv
@@ -5,7 +6,7 @@ from dotenv import load_dotenv
load_dotenv() load_dotenv()
class Singleton(type): class Singleton(abc.ABCMeta, type):
""" """
Singleton metaclass for ensuring only one instance of a class. Singleton metaclass for ensuring only one instance of a class.
""" """
@@ -20,6 +21,10 @@ class Singleton(type):
return cls._instances[cls] return cls._instances[cls]
class AbstractSingleton(abc.ABC, metaclass=Singleton):
pass
class Config(metaclass=Singleton): class Config(metaclass=Singleton):
""" """
Configuration class to store the state of bools for different scripts access. Configuration class to store the state of bools for different scripts access.

View File

@@ -1,7 +1,7 @@
import json import json
import random import random
import commands as cmd import commands as cmd
from memory import PineconeMemory from memory.pinecone import PineconeMemory
import data import data
import chat import chat
from colorama import Fore, Style from colorama import Fore, Style
@@ -283,7 +283,7 @@ user_input = "Determine which next command to use, and respond using the format
# Initialize memory and make sure it is empty. # Initialize memory and make sure it is empty.
# this is particularly important for indexing and referencing pinecone memory # this is particularly important for indexing and referencing pinecone memory
memory = PineconeMemory() memory = PineconeMemory(cfg)
memory.clear() memory.clear()
print('Using memory of type: ' + memory.__class__.__name__) print('Using memory of type: ' + memory.__class__.__name__)

View File

34
scripts/memory/base.py Normal file
View File

@@ -0,0 +1,34 @@
import abc
from config import AbstractSingleton
import openai
def get_ada_embedding(text):
text = text.replace("\n", " ")
return openai.Embedding.create(input=[text], model="text-embedding-ada-002")["data"][0]["embedding"]
def get_text_from_embedding(embedding):
return openai.Embedding.retrieve(embedding, model="text-embedding-ada-002")["data"][0]["text"]
class MemoryProviderSingleton(AbstractSingleton):
@abc.abstractmethod
def add(self, data):
pass
@abc.abstractmethod
def get(self, data):
pass
@abc.abstractmethod
def clear(self):
pass
@abc.abstractmethod
def get_relevant(self, data, num_relevant=5):
pass
@abc.abstractmethod
def get_stats(self):
pass

View File

@@ -1,21 +1,11 @@
from config import Config, Singleton
import pinecone import pinecone
import openai
cfg = Config() from memory.base import MemoryProviderSingleton, get_ada_embedding
def get_ada_embedding(text): class PineconeMemory(MemoryProviderSingleton):
text = text.replace("\n", " ") def __init__(self, cfg):
return openai.Embedding.create(input=[text], model="text-embedding-ada-002")["data"][0]["embedding"]
def get_text_from_embedding(embedding):
return openai.Embedding.retrieve(embedding, model="text-embedding-ada-002")["data"][0]["text"]
class PineconeMemory(metaclass=Singleton):
def __init__(self):
pinecone_api_key = cfg.pinecone_api_key pinecone_api_key = cfg.pinecone_api_key
pinecone_region = cfg.pinecone_region pinecone_region = cfg.pinecone_region
pinecone.init(api_key=pinecone_api_key, environment=pinecone_region) pinecone.init(api_key=pinecone_api_key, environment=pinecone_region)

View File