examples dir

This commit is contained in:
2024-10-29 06:37:03 -04:00
parent 3085df5a49
commit f9b1472cf4
6 changed files with 154 additions and 13 deletions
+10
View File
@@ -0,0 +1,10 @@
import os
import sys
# Add the parent directory to the path so we can import the module.
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
import simplemind as sm
__all__ = ["sm"]
+99
View File
@@ -0,0 +1,99 @@
from _context import sm
from pydantic import BaseModel
import openai
import faiss
import numpy as np
import os
import pickle
class ContextualMemoryPlugin:
def __init__(self, api_key: str, memory_file: str = "memories.pkl", embedding_model: str = "text-embedding-ada-002"):
openai.api_key = api_key
self.memory_file = memory_file
self.embedding_model = embedding_model
self.memories = []
self.embeddings = None
self.index = None
self.load_memories()
def load_memories(self):
if os.path.exists(self.memory_file):
with open(self.memory_file, "rb") as f:
self.memories, self.embeddings = pickle.load(f)
self.build_faiss_index()
else:
self.memories = []
self.embeddings = []
self.index = faiss.IndexFlatL2(1536) # Dimension for ada-002 embeddings
def save_memories(self):
with open(self.memory_file, "wb") as f:
pickle.dump((self.memories, self.embeddings), f)
def build_faiss_index(self):
if self.embeddings:
self.index = faiss.IndexFlatL2(len(self.embeddings[0]))
self.index.add(np.array(self.embeddings).astype('float32'))
else:
self.index = faiss.IndexFlatL2(1536)
def get_embedding(self, text: str) -> list:
response = openai.Embedding.create(input=text, model=self.embedding_model)
return response['data'][0]['embedding']
def add_memory(self, memory: str):
embedding = self.get_embedding(memory)
self.memories.append(memory)
self.embeddings.append(embedding)
self.index.add(np.array([embedding]).astype('float32'))
self.save_memories()
def retrieve_memories(self, query: str, top_k: int = 3) -> list:
if not self.index or len(self.embeddings) == 0:
return []
query_embedding = self.get_embedding(query)
D, I = self.index.search(np.array([query_embedding]).astype('float32'), top_k)
return [self.memories[i] for i in I[0] if i < len(self.memories)]
def send_hook(self, conversation: sm.Conversation):
# Retrieve relevant memories based on the latest user message
if conversation.messages:
last_user_message = conversation.messages[-1].text
relevant_memories = self.retrieve_memories(last_user_message)
for memory in relevant_memories:
conversation.add_message(role="system", text=memory)
def on_response(self, conversation: sm.Conversation, response: str):
# Optionally, add the AI's response to memories
self.add_memory(response)
# Example Usage
# Define a Pydantic model if needed
class Story(BaseModel):
title: str
content: str
# Initialize the conversation with the ContextualMemoryPlugin
memory_plugin = ContextualMemoryPlugin(api_key=sm.settings.OPENAI_API_KEY)
conversation = sm.create_conversation(llm_model="gpt-4o-mini", llm_provider="openai")
conversation.add_plugin(memory_plugin)
# Add user message
conversation.add_message("user", "Tell me a story about a brave knight.")
# Send the conversation and get the response
response = conversation.send()
print(response.text)
# Optionally, retrieve structured data
structured_response = sm.generate_data(
"Summarize the above story.",
llm_model="gpt-4o",
llm_provider="openai",
response_model=Story,
)
print(structured_response)
+5
View File
@@ -0,0 +1,5 @@
from _context import sm
r = sm.generate_text("Write a poem about the moon", llm_provider="openai", llm_model="gpt-3.5-turbo")
print(r)
+4
View File
@@ -0,0 +1,4 @@
numpy
openai
pydantic
faiss-cpu
+28
View File
@@ -0,0 +1,28 @@
from _context import sm
class SimpleMemoryPlugin:
def __init__(self):
self.memories = [
"the earth has fictionally beeen destroyed.",
"the moon is made of cheese.",
]
def yield_memories(self):
return (m for m in self.memories)
def send_hook(self, conversation: sm.Conversation):
for m in self.yield_memories():
conversation.add_message(role="system", text=m)
conversation = sm.create_conversation(llm_model="grok-beta", llm_provider="xai")
conversation.add_plugin(SimpleMemoryPlugin())
conversation.add_message(
role="user",
text="Write a poem about the moon",
)
r = conversation.send()
print(r.text)
+8 -13
View File
@@ -1,24 +1,17 @@
from .models import Conversation
from .utils import find_provider
class SimpleMind:
def structured_response(
self, prompt, *, llm_model=None, llm_provider=None, response_model=None
):
provider = find_provider(llm_provider)
return provider.structured_response(
llm_model=llm_model, response_model=response_model, prompt=prompt
)
from .settings import settings
def create_conversation(llm_model=None, llm_provider=None):
"""Create a new conversation."""
return Conversation(llm_model=llm_model, llm_provider=llm_provider)
def generate_data(prompt, *, llm_model=None, llm_provider=None, response_model=None):
"""Generate structured data from a given prompt."""
provider = find_provider(llm_provider)
return provider.structured_response(
@@ -29,6 +22,8 @@ def generate_data(prompt, *, llm_model=None, llm_provider=None, response_model=N
def generate_text(prompt, *, llm_model=None, llm_provider=None):
"""Generate text from a given prompt."""
provider = find_provider(llm_provider)
return provider.generate_text(prompt=prompt, llm_model=llm_model)
@@ -36,9 +31,9 @@ def generate_text(prompt, *, llm_model=None, llm_provider=None):
__all__ = [
"Conversation",
"SimpleMind",
"create_conversation",
"find_provider",
"generate_data",
"generate_text",
"settings"
]