bldemo / components /memory.py
Druso's picture
Update components/memory.py
85a658e
import os
import pinecone
import openai
from components.configs import querydocnumber, num_chatmsg_history, embedderengine
from components.configs import PINECONE_API_ENV, PINECONE_INDEX_NAME,PINECONE_NAMESPACE
#Short term memory
## this updates the chat history. It keeps relevantcontents together with user message so it can be accessed at later stage by the
def autochatmemory(chatmemory, #original state of chatmemory
relevantcontents, #contents that were used to produce the response
user_message, #the original user message
response, #response generated
num_chatmsg_history=num_chatmsg_history #limiting the history as per config
):
formatted_usermessage = f"Provided Info:\n{relevantcontents}\nUser:{user_message}"
chatmemory.append({"role": "user", "content": formatted_usermessage})
chatmemory.append({"role": "assistant", "content": response})
if len(chatmemory) > num_chatmsg_history * 2:
chatmemory[:-(num_chatmsg_history * 2)] = []
return chatmemory
#Long Term Memory
## gather documents from pinecone using an embedding of the user query
def documentretrival(
user_message,
docnumber = querydocnumber,
PINECONE_API_ENV = PINECONE_API_ENV,
PINECONE_INDEX_NAME = PINECONE_INDEX_NAME,
PINECONE_NAMESPACE =PINECONE_NAMESPACE,
embedderengine=embedderengine,
):
#embed the user_message using openai embedder
embeddeduser_message = openai.Embedding.create(
input=user_message,
engine=embedderengine
)['data'][0]['embedding']
#initialize pinecone
pinecone.init(api_key=os.environ['PINECONE_API_KEY'],
environment=PINECONE_API_ENV)
index = pinecone.Index(PINECONE_INDEX_NAME)
#search the embedded query on pinecone
relevantdocument = index.query(
namespace=PINECONE_NAMESPACE,
top_k=docnumber,
include_values=False,
include_metadata=True,
vector=embeddeduser_message,
)
return relevantdocument
## format the dictionary obtained from pinecone in a way that I think suits the LLM better
def pinecone_documentformatter(relevantdocument):
formattedrelevantdocument = ""
matches = relevantdocument['matches']
for i, match in enumerate(matches, 1):
formattedrelevantdocument += f"{i}-\n"
metadata = match['metadata']
# Put Text in front
formattedrelevantdocument += f"text: {metadata.get('text', '')}\n"
# Put other metadata following that
for key in metadata:
if key != 'text':
formattedrelevantdocument += f"{key}: {metadata[key]}\n"
formattedrelevantdocument
return formattedrelevantdocument
## A unique function to get pinecone doc and have back the content formatted
def formatted_documentretrival(user_message,docnumber=querydocnumber):
relevantdocument= documentretrival(
user_message,
docnumber
)
formattedrelevantdocument=pinecone_documentformatter(relevantdocument)
return formattedrelevantdocument