Download components/memory.py from Druso/bldemo: direct link, hf CLI and curl.
- Browser
- Download file 3.15 kB
-
https://huggingface.co/spaces/Druso/bldemo/resolve/main/components/memory.py
- Command line
-
hf download hf://spaces/Druso/bldemo/components/memory.py
-
curl -L -o memory.py https://huggingface.co/spaces/Druso/bldemo/resolve/main/components/memory.py
3.15 kB
| 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 |