From eac97d4907e9f9241863bee091ed42a5ef59ef1c Mon Sep 17 00:00:00 2001 From: Daemon <109057945+Daethyra@users.noreply.github.com> Date: Fri, 1 Sep 2023 20:28:22 -0700 Subject: [PATCH 01/10] Update README.md --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 6ad5f5a..4262fd2 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,6 @@ # OpenAI Utility Toolkit (OUT) -## Welcome to the OpenAI Utility Toolkit (OUT) - -Your one-stop destination for enhancing your interaction with OpenAI models. This toolkit has grown to include a multitude of utilities that offer additional functionality and ease-of-use. +`Your short-stop for enhancing your interaction with OpenAI models.` --- From 5855e5d67ae26e5454a2c42c7927860477844a0a Mon Sep 17 00:00:00 2001 From: Daemon <109057945+Daethyra@users.noreply.github.com> Date: Mon, 2 Oct 2023 19:43:14 -0700 Subject: [PATCH 02/10] Creating async func, also refactored and extended code modified: Auto-Embedder/PinEbed.py --- Auto-Embedder/PinEbed.py | 141 +++++++++++++++++++++++++-------------- 1 file changed, 92 insertions(+), 49 deletions(-) diff --git a/Auto-Embedder/PinEbed.py b/Auto-Embedder/PinEbed.py index a5f82f5..4534ffc 100644 --- a/Auto-Embedder/PinEbed.py +++ b/Auto-Embedder/PinEbed.py @@ -1,60 +1,103 @@ -""" Easily automate the retrieval from OpenAI and storage of embeddings in Pinecone. """ +"""Easily automate the retrieval from OpenAI and storage of embeddings in Pinecone.""" + import os import logging -from configparser import ConfigParser -from typing import Dict, Any -import pinecone -import openai +import asyncio +from dotenv import load_dotenv +from datetime import datetime +from typing import Dict, Union, List +import openai +import pinecone +import backoff -class PineconeHandler: - """Handles data stream embedding and storage in Pinecone.""" +# Load environment variables from .env file +load_dotenv() + +# Initialize logging +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +class EnvConfig: + """Class for handling environment variables and API keys.""" + + def __init__(self) -> None: + """Initialize environment variables.""" + self.openai_key: str = os.getenv("OPENAI_API_KEY") + self.pinecone_key: str = os.getenv("PINECONE_API_KEY") + self.pinecone_environment: str = os.getenv("PINECONE_ENVIRONMENT") + self.pinecone_environment: str = os.getenv("PINEDEX") + +class OpenAIHandler: + """Class for handling OpenAI operations.""" + + def __init__(self, config: EnvConfig) -> None: + """Initialize OpenAI API key.""" + openai.api_key = config.openai_key - def __init__(self): - """Initialize Pinecone and OpenAI APIs using .env variables.""" - # Set up logging - logging.basicConfig(level=logging.INFO) - self.logger = logging.getLogger(__name__) - - # Initialize ConfigParser and read .env file - config = ConfigParser() - config.read('.env') - - # Initialize OpenAI API - openai.api_key = config.get('OpenAI', 'OPENAI_API_KEY', fallback=os.getenv('OPENAI_API_KEY')) - self.model_engine = config.get('OpenAI', 'MODEL', fallback='text-embeddings-ada-002') - - # Initialize Pinecone - pinecone.init(api_key=config.get('Pinecone', 'PINECONE_API_KEY', fallback=os.getenv('PINECONE_API_KEY'))) - self.index = pinecone.Index(index_name=config.get('Pinecone', 'PINEDEX', fallback='default_index')) + @backoff.on_exception(backoff.expo, Exception, max_tries=3) + async def create_embedding(self, input_text: str) -> Dict[str, Union[int, List[float]]]: + """ + Create an embedding using OpenAI. + + Parameters: + input_text (str): The text to be embedded. + + Returns: + Dict[str, Union[int, List[float]]]: The embedding response. + """ + response = openai.Embedding.create( + model="text-embedding-ada-002", + input=input_text + ) + return response + +class PineconeHandler: + """Class for handling Pinecone operations.""" + + def __init__(self, config: EnvConfig) -> None: + """Initialize Pinecone API key.""" + pinecone.init(api_key=config.pinecone_key) - async def process_data(self, data: Dict[str, Any]) -> None: - """Process a data entry to generate embeddings and store in Pinecone. + @backoff.on_exception(backoff.expo, Exception, max_tries=3) + async def upload_embedding(self, embedding: Dict[str, Union[int, List[float]]]) -> None: + """ + Upload an embedding to Pinecone index. + + Parameters: + embedding (Dict): The embedding to be uploaded. + """ + pinecone.upsert(index_name="your-index", items=embedding) + +class DataStreamHandler: + """Class for handling data streams.""" + def __init__(self, openai_handler: OpenAIHandler, pinecone_handler: PineconeHandler) -> None: + """Initialize DataStreamHandler.""" + self.openai_handler = openai_handler + self.pinecone_handler = pinecone_handler + self.last_run_time: datetime = datetime.now() + + async def process_data(self, data: str) -> None: + """ + Process data to create and upload embeddings. + Parameters: - data (Dict[str, Any]): The data in JSON format. + data (str): The data to be processed. """ - try: - text = data['text'] - - # Generate embedding - response = openai.Embedding.create( - model=self.model_engine, - texts=[text] - ) - - # Check response format - if 'embeddings' in response: - embedding = response['embeddings'][0]['embedding'] - else: - self.logger.error(f"Unexpected response format: {response}") - return - - # Upsert the data ID and vector embedding to Pinecone index - self.index.upsert(vectors=[(data['id'], embedding, {'text': text})]) + if type(data) != str: + raise ValueError("Invalid data type.") + + current_time = datetime.now() + elapsed_time = (current_time - self.last_run_time).total_seconds() + if elapsed_time < 0.3: + await asyncio.sleep(0.3 - elapsed_time) - except Exception as e: - self.logger.error(f"Error processing data {data['id']}: {e}") + self.last_run_time = datetime.now() + embedding = await self.openai_handler.create_embedding(data) + await self.pinecone_handler.upload_embedding(embedding) if __name__ == "__main__": - pinecone_handler = PineconeHandler() - # Here, you can set up a loop or event stream to call pinecone_handler.process_data with new data. + config = EnvConfig() + openai_handler = OpenAIHandler(config) + pinecone_handler = PineconeHandler(config) + data_streams = [DataStreamHandler(openai_handler, pinecone_handler) for _ in range(3)] From 1f7b2e6a059e56c081be4be70f8779585b32ef89 Mon Sep 17 00:00:00 2001 From: Daemon <109057945+Daethyra@users.noreply.github.com> Date: Mon, 2 Oct 2023 19:55:38 -0700 Subject: [PATCH 03/10] Added a test module, renamed pinembed.py --- Auto-Embedder/.env.template | 6 +- Auto-Embedder/{PinEbed.py => pinembed.py} | 0 Auto-Embedder/test.py | 71 +++++++++++++++++++++++ 3 files changed, 74 insertions(+), 3 deletions(-) rename Auto-Embedder/{PinEbed.py => pinembed.py} (100%) create mode 100644 Auto-Embedder/test.py diff --git a/Auto-Embedder/.env.template b/Auto-Embedder/.env.template index e1aa4e9..d1463c6 100644 --- a/Auto-Embedder/.env.template +++ b/Auto-Embedder/.env.template @@ -1,9 +1,9 @@ [OpenAI] -OPENAI_API_KEY = sk- +OPENAI_API_KEY = sk-[...] MODEL = text-embeddings-ada-002 # gpt-3.5-turbo # gpt-4 # gpt-4-32k TEMPERATURE = 0 [Pinecone] PINECONE_API_KEY = -PINECONE_ENVIRONMENT = -PINEDEX = \ No newline at end of file +PINECONE_ENVIRONMENT = us-central1-gcp +PINEDEX = default_name \ No newline at end of file diff --git a/Auto-Embedder/PinEbed.py b/Auto-Embedder/pinembed.py similarity index 100% rename from Auto-Embedder/PinEbed.py rename to Auto-Embedder/pinembed.py diff --git a/Auto-Embedder/test.py b/Auto-Embedder/test.py new file mode 100644 index 0000000..517312a --- /dev/null +++ b/Auto-Embedder/test.py @@ -0,0 +1,71 @@ +import unittest +from unittest.mock import patch +import os +import logging +import asyncio +from dotenv import load_dotenv +from datetime import datetime +from typing import Dict, Union, List +import openai +import pinecone +import backoff + +# Load environment variables from .env file +load_dotenv() + +# Initialize logging +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +class EnvConfig: + """Class for handling environment variables and API keys.""" + + def __init__(self) -> None: + """Initialize environment variables.""" + self.openai_key: str = os.getenv("OPENAI_API_KEY") + self.pinecone_key: str = os.getenv("PINECONE_API_KEY") + self.pinecone_environment: str = os.getenv("PINECONE_ENVIRONMENT") + self.pinecone_environment: str = os.getenv("PINEDEX") + +class OpenAIHandler: + """Class for handling OpenAI operations.""" + + def __init__(self, config: EnvConfig) -> None: + """Initialize OpenAI API key.""" + openai.api_key = config.openai_key + + @backoff.on_exception(backoff.expo, Exception, max_tries=3) + async def create_embedding(self, input_text: str) -> Dict[str, Union[int, List[float]]]: + """ + Create an embedding using OpenAI. + + Parameters: + input_text (str): The text to be embedded. + + Returns: + Dict[str, Union[int, List[float]]]: The embedding response. + """ + response = openai.Embedding.create( + model="text-embedding-ada-002",engine="ada", + text=input_text, + ) + return response + +# Create test class +class TestOpenAIHandler(unittest.TestCase): + # Set up test environment + def setUp(self): + self.config = EnvConfig() + self.openai_handler = OpenAIHandler(self.config) + + # Test create_embedding method + @patch('openai.Embedding.create') + def test_create_embedding(self, mock_create): + input_text = 'This is a test' + expected_response = {'id': 12345, 'embedding': [1.0, 2.0, 3.0]} + mock_create.return_value = expected_response + response = self.openai_handler.create_embedding(input_text) + self.assertEqual(response, expected_response) + +if __name__ == "__main__": + unittest.main() \ No newline at end of file From 3a785249462f235c881648696d98d0c4e2df7bb0 Mon Sep 17 00:00:00 2001 From: Daemon <109057945+Daethyra@users.noreply.github.com> Date: Mon, 2 Oct 2023 22:04:28 -0700 Subject: [PATCH 04/10] Overhauled OP stack automation & archived the GUI modules renamed: Basic-GPT-GUI/.env.template -> .archive/Basic-GPT-GUI/.env.template renamed: Basic-GPT-GUI/.gitignore -> .archive/Basic-GPT-GUI/.gitignore renamed: Basic-GPT-GUI/main.py -> .archive/Basic-GPT-GUI/main.py renamed: Basic-GPT-GUI/requirements.txt -> .archive/Basic-GPT-GUI/requirements.txt renamed: Basic-GPT-GUI/src/gui.py -> .archive/Basic-GPT-GUI/src/gui.py renamed: Basic-GPT-GUI/src/openai_chat.py -> .archive/Basic-GPT-GUI/src/openai_chat.py renamed: GPT-Prompt-Examples/TLDR.md -> .archive/TLDR.md modified: Auto-Embedder/.env.template new file: Auto-Embedder/README.md modified: Auto-Embedder/pinembed.py new file: Auto-Embedder/requirements.txt --- .../Basic-GPT-GUI}/.env.template | 7 +-- .../Basic-GPT-GUI}/.gitignore | 0 .../Basic-GPT-GUI}/main.py | 0 .../Basic-GPT-GUI}/requirements.txt | 0 .../Basic-GPT-GUI}/src/gui.py | 0 .../Basic-GPT-GUI}/src/openai_chat.py | 2 +- {GPT-Prompt-Examples => .archive}/TLDR.md | 0 Auto-Embedder/.env.template | 6 +- Auto-Embedder/README.md | 60 +++++++++++++++++++ Auto-Embedder/pinembed.py | 50 ++++++++++++---- Auto-Embedder/requirements.txt | 4 ++ 11 files changed, 109 insertions(+), 20 deletions(-) rename {Basic-GPT-GUI => .archive/Basic-GPT-GUI}/.env.template (50%) rename {Basic-GPT-GUI => .archive/Basic-GPT-GUI}/.gitignore (100%) rename {Basic-GPT-GUI => .archive/Basic-GPT-GUI}/main.py (100%) rename {Basic-GPT-GUI => .archive/Basic-GPT-GUI}/requirements.txt (100%) rename {Basic-GPT-GUI => .archive/Basic-GPT-GUI}/src/gui.py (100%) rename {Basic-GPT-GUI => .archive/Basic-GPT-GUI}/src/openai_chat.py (80%) rename {GPT-Prompt-Examples => .archive}/TLDR.md (100%) create mode 100644 Auto-Embedder/README.md create mode 100644 Auto-Embedder/requirements.txt diff --git a/Basic-GPT-GUI/.env.template b/.archive/Basic-GPT-GUI/.env.template similarity index 50% rename from Basic-GPT-GUI/.env.template rename to .archive/Basic-GPT-GUI/.env.template index 4b00211..94cace8 100644 --- a/Basic-GPT-GUI/.env.template +++ b/.archive/Basic-GPT-GUI/.env.template @@ -1,9 +1,4 @@ [OpenAI] OPENAI_API_KEY = sk- MODEL = gpt-4-32k # gpt-3.5-turbo # gpt-4 # gpt-4-32k -TEMPERATURE = 0 - -[Pinecone] -PINECONE_API_KEY = -PINECONE_ENVIRONMENT = -PINEDEX = \ No newline at end of file +TEMPERATURE = 0.5 \ No newline at end of file diff --git a/Basic-GPT-GUI/.gitignore b/.archive/Basic-GPT-GUI/.gitignore similarity index 100% rename from Basic-GPT-GUI/.gitignore rename to .archive/Basic-GPT-GUI/.gitignore diff --git a/Basic-GPT-GUI/main.py b/.archive/Basic-GPT-GUI/main.py similarity index 100% rename from Basic-GPT-GUI/main.py rename to .archive/Basic-GPT-GUI/main.py diff --git a/Basic-GPT-GUI/requirements.txt b/.archive/Basic-GPT-GUI/requirements.txt similarity index 100% rename from Basic-GPT-GUI/requirements.txt rename to .archive/Basic-GPT-GUI/requirements.txt diff --git a/Basic-GPT-GUI/src/gui.py b/.archive/Basic-GPT-GUI/src/gui.py similarity index 100% rename from Basic-GPT-GUI/src/gui.py rename to .archive/Basic-GPT-GUI/src/gui.py diff --git a/Basic-GPT-GUI/src/openai_chat.py b/.archive/Basic-GPT-GUI/src/openai_chat.py similarity index 80% rename from Basic-GPT-GUI/src/openai_chat.py rename to .archive/Basic-GPT-GUI/src/openai_chat.py index d9d9ebe..b0b5851 100644 --- a/Basic-GPT-GUI/src/openai_chat.py +++ b/.archive/Basic-GPT-GUI/src/openai_chat.py @@ -1,5 +1,5 @@ class OpenAI_Chat: - def __init__(self, model=os.getenv('MODEL', 'gpt-3.5-turbo'), temperature=os.getenv('TEMPERATURE', 0)): + def __init__(self, model=os.getenv('MODEL', 'gpt-3.5-turbo'), temperature=os.getenv('TEMPERATURE', .5)): self.model = model self.temperature = float(temperature) self.messages = [] diff --git a/GPT-Prompt-Examples/TLDR.md b/.archive/TLDR.md similarity index 100% rename from GPT-Prompt-Examples/TLDR.md rename to .archive/TLDR.md diff --git a/Auto-Embedder/.env.template b/Auto-Embedder/.env.template index d1463c6..afb27fb 100644 --- a/Auto-Embedder/.env.template +++ b/Auto-Embedder/.env.template @@ -1,9 +1,9 @@ [OpenAI] OPENAI_API_KEY = sk-[...] -MODEL = text-embeddings-ada-002 # gpt-3.5-turbo # gpt-4 # gpt-4-32k -TEMPERATURE = 0 +MODEL = text-embeddings-ada-002 [Pinecone] PINECONE_API_KEY = PINECONE_ENVIRONMENT = us-central1-gcp -PINEDEX = default_name \ No newline at end of file +PINEDEX = default_name +DROPCOLUMNS = metadata,sparse_values \ No newline at end of file diff --git a/Auto-Embedder/README.md b/Auto-Embedder/README.md new file mode 100644 index 0000000..f97547d --- /dev/null +++ b/Auto-Embedder/README.md @@ -0,0 +1,60 @@ +# Streamline calls to OpenAI and Pinecone | Automate the OP stack + +## What's this? + +This single pluggable module named [pinembed.py](pinembed.py) provides a data-pipe using the OP stack. +It automates the retrieval of vector embeddings from OpenAI's `text-embeddings-ada-002` model as well the uploading of said data to a Pinecone index. + +It does the following: + +- Ingests data +- Sends data to 'Ada-002' at OpenAI to receive embeddings +- Automatically [upserts](https://docs.pinecone.io/reference/upsert "Upsert documentation") received embedding data in real time + +## Why should I care? + +- Skip the programming! +- Provides a modular multi-class structure for isolating and using specific functionality, like asynchronous embedding retrieval. +- Eases the process of building Large Language Models +- Enables semantic similarity searches +- [Empowers](https://platform.openai.com/docs/guides/embeddings/what-are-embeddings#:~:text=To%20see%20embeddings%20in%20action%2C%20check%20out%20our%20code%20samples "Reference Documentation"): + - Classification + - Topic clustering + - Search + - Recommendations + +### Requirements + +- OpenAI +- Pinecone +- Python-dotenv + +## Roadmap + +1) Create pseudocode for more functionality, namely further querying the Pinecone index +2) Draft Python logic for ['similarity'](https://docs.pinecone.io/reference/query) queries +3) Remove 0.3 data-stream cooldown. | This is literally an async pluggable module -- don't need that. +4) Create LangChain class on top of `DataStreamHandler` with the goal of testing it as a Question/Answering service + * LangChain `DirectoryLoader` +5) Extend package to enable [Agents](https://www.pinecone.io/learn/series/langchain/langchain-agents/ "Agent Documentation") & [Memory](https://www.pinecone.io/learn/series/langchain/langchain-conversational-memory/ "Memory Documentation") for large language models + +#### Self-asked Dev-questions + +- How will someone easily query their index? + - Automating 'similarity' queries is a good starting point +- How can this module be even easier to side-load for *any* project? +- Did I properly write docstrings that accurately reflect the expected data types for Pinecone specifically? I know I checked for Ada-002. +- Is it worth having multiple data streams for different processes an end-user might have? Especially if they're an organization, with multiple keys running? + - I'd also therefore need to make room for more keys, etc. I will use organizational ID management to help further differentiate where necessary. + +## Official Reference Documentation + +- [OpenAI Documentation](https://platform.openai.com/docs/guides/embeddings) +- [Embeddings API Reference](https://platform.openai.com/docs/api-reference) +- [Pinecone Example Projects](https://docs.pinecone.io/page/examples) +- [Pinecone API Reference](https://docs.pinecone.io/reference) +- [LangChain / Pinecone "Getting Startetd"](https://www.pinecone.io/learn/series/langchain/langchain-intro/) +- [LangChain Agents](https://www.pinecone.io/learn/series/langchain/langchain-agents/) +- [LangChain Conversational Memory](https://www.pinecone.io/learn/series/langchain/langchain-conversational-memory/) + +## [LICENSE](../LICENSE) diff --git a/Auto-Embedder/pinembed.py b/Auto-Embedder/pinembed.py index 4534ffc..a1411bd 100644 --- a/Auto-Embedder/pinembed.py +++ b/Auto-Embedder/pinembed.py @@ -25,7 +25,11 @@ def __init__(self) -> None: self.openai_key: str = os.getenv("OPENAI_API_KEY") self.pinecone_key: str = os.getenv("PINECONE_API_KEY") self.pinecone_environment: str = os.getenv("PINECONE_ENVIRONMENT") - self.pinecone_environment: str = os.getenv("PINEDEX") + self.pinecone_index: str = os.getenv("PINEDEX") + self.drop_columns: List[str] = os.getenv("DROPCOLUMNS", "").split(",") + + # Remove any empty strings that may appear if "DROPCOLUMNS" is empty or has trailing commas + self.drop_columns = [col.strip() for col in self.drop_columns if col.strip()] class OpenAIHandler: """Class for handling OpenAI operations.""" @@ -47,26 +51,52 @@ async def create_embedding(self, input_text: str) -> Dict[str, Union[int, List[f """ response = openai.Embedding.create( model="text-embedding-ada-002", - input=input_text + input=input_text, + # Might be useful to add the user parameter ) return response class PineconeHandler: """Class for handling Pinecone operations.""" - def __init__(self, config: EnvConfig) -> None: - """Initialize Pinecone API key.""" - pinecone.init(api_key=config.pinecone_key) - + def __init__(self, config: "EnvConfig") -> None: + """ + Initialize Pinecone API key, environment, and index name. + + Args: + config (EnvConfig): An instance of the EnvConfig class containing environment variables and API keys. + """ + pinecone.init(api_key=config.pinecone_key, environment=config.pinecone_environment) + self.index_name = config.pinecone_index + self.drop_columns = config.drop_columns + @backoff.on_exception(backoff.expo, Exception, max_tries=3) async def upload_embedding(self, embedding: Dict[str, Union[int, List[float]]]) -> None: """ - Upload an embedding to Pinecone index. + Asynchronously uploads an embedding to the Pinecone index specified during initialization. - Parameters: - embedding (Dict): The embedding to be uploaded. + This method will retry up to 3 times in case of failure, using exponential back-off. + + Args: + embedding (Dict): A dictionary containing the following keys: + - 'id': A unique identifier for the embedding (str). + - 'values': A list of numerical values for the embedding (List[float]). + - 'metadata' (Optional): Any additional metadata as a dictionary (Dict). + - 'sparse_values' (Optional): Sparse values of the embedding as a dictionary with 'indices' and 'values' (Dict). """ - pinecone.upsert(index_name="your-index", items=embedding) + # Initialize Pinecone index + index = pinecone.Index(self.index_name) + + # Prepare the item for upsert + item = { + 'id': embedding['id'], + 'values': embedding['values'], + 'metadata': embedding.get('metadata', {}), + 'sparse_values': embedding.get('sparse_values', {}) + } + + # Perform the upsert operation + index.upsert(vectors=[item]) class DataStreamHandler: """Class for handling data streams.""" diff --git a/Auto-Embedder/requirements.txt b/Auto-Embedder/requirements.txt new file mode 100644 index 0000000..866309a --- /dev/null +++ b/Auto-Embedder/requirements.txt @@ -0,0 +1,4 @@ +openai +pinecone-client +python-dotenv +langchain \ No newline at end of file From 237bfc7baeafe6eff066a73c5abfc45feeaea1e2 Mon Sep 17 00:00:00 2001 From: Daemon <109057945+Daethyra@users.noreply.github.com> Date: Tue, 3 Oct 2023 18:34:31 -0700 Subject: [PATCH 05/10] Updated the README --- .github/mindmap.png | Bin 113949 -> 0 bytes README.md | 66 ++++++++++++++------------------------------ 2 files changed, 20 insertions(+), 46 deletions(-) delete mode 100644 .github/mindmap.png diff --git a/.github/mindmap.png b/.github/mindmap.png deleted file mode 100644 index 4916cecaf8779d02764fd47a56ba69ce186d4e2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113949 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 Pr2B$&_t{6=8+iS1GICQs diff --git a/README.md b/README.md index 4262fd2..1c35ffa 100644 --- a/README.md +++ b/README.md @@ -1,60 +1,34 @@ # OpenAI Utility Toolkit (OUT) -`Your short-stop for enhancing your interaction with OpenAI models.` - ---- - ## Contents -1. **[Auto-Embedder](./Auto-Embedder)** - - **[PinEbed.py](./Auto-Embedder/PinEbed.py)**: A Python module to easily automate the retrieval of embeddings from OpenAI and storage in Pinecone. - - **[.env.template](./Auto-Embedder/.env.template)**: Template for environment variables. - -2. **[Basic-GPT-GUI](./Basic-GPT-GUI)** - - **[main.py](./Basic-GPT-GUI/main.py)**: The entry point for the GUI application. - - **[gui.py](./Basic-GPT-GUI/src/gui.py)**: Contains the GUI logic and interface using Python's `Tkinter`. - - **[openai_chat.py](./Basic-GPT-GUI/src/openai_chat.py)**: A Python class designed for chat-based interaction with OpenAI models. - - **[.env.template](./Basic-GPT-GUI/.env.template)**: Template for environment variables. - - **[requirements.txt](./Basic-GPT-GUI/requirements.txt)**: List of required Python packages. - -3. **[GPT-Prompt-Examples](./GPT-Prompt-Examples)** - - **[OUT-prompt-cheatsheet.md](./GPT-Prompt-Examples/OUT-prompt-cheatsheet.md)**: A cheatsheet for GPT prompts. - - **[TLDR.md](./GPT-Prompt-Examples/TLDR.md)**: A Markdown file providing a quick overview of the project and its components. - - **[ChatGPT_reference_chatlogs](./GPT-Prompt-Examples/ChatGPT_reference_chatlogs)**: Contains chat logs and shorthand prompts. - - **[multi-shot](./GPT-Prompt-Examples/multi-shot)**: Various markdown and text files for multi-shot prompts. - - **[system-role](./GPT-Prompt-Examples/system-role)**: Various markdown files for system-role prompts. - - **[user-role](./GPT-Prompt-Examples/user-role)**: Markdown files for user-role prompts. - -
- Mindmap from 8-30-23 -
- ---- - -## Detailed Description +#### 1. **[Auto-Embedder](./Auto-Embedder)** -### [Auto-Embedder](./Auto-Embedder) +Provides an automated pipeline for retrieving embeddings from [OpenAI's `text-embedding-ada-002`](https://platform.openai.com/docs/guides/embeddings) and upserting them to a [Pinecone index](https://docs.pinecone.io/docs/indexes). -#### [PinEbed.py](./Auto-Embedder/PinEbed.py) + - **[pinembed.py](./Auto-Embedder/pinembed.py)**: A Python module to easily automate the retrieval of embeddings from OpenAI and storage in Pinecone. + - **[.env.template](./Auto-Embedder/.env.template)**: Template for environment variables. -This module provides a class `PineconeHandler` that handles data stream embedding and storage in Pinecone. It uses OpenAI to generate embeddings for text data and stores these embeddings in a Pinecone index. - -### [Basic-GPT-GUI](./Basic-GPT-GUI) - -#### [main.py](./Basic-GPT-GUI/main.py) - -This is the entry point for the GUI application. It sets up the environment and initiates the GUI. - -#### [gui.py](./Basic-GPT-GUI/src/gui.py) +--- -This file contains the GUI logic and interface. It uses Python's `Tkinter` to create the GUI. +#### 2. **[GPT-Prompt-Examples](./GPT-Prompt-Examples)** -#### [openai_chat.py](./Basic-GPT-GUI/src/openai_chat.py) +There are three main prompt types, [multi-shot](GPT-Prompt-Examples/multi-shot), [system-role](GPT-Prompt-Examples/system-role), [user-role](GPT-Prompt-Examples/user-role). -A Python class designed for chat-based interaction with OpenAI models. You can set the model and temperature for the chat. +Please also see the [OUT-prompt-cheatsheet](GPT-Prompt-Examples/OUT-prompt-cheatsheet.md). -### [GPT-Prompt-Examples](./GPT-Prompt-Examples) + - **[Cheatsheet for quick power-prompts](./GPT-Prompt-Examples/OUT-prompt-cheatsheet.md)**: A cheatsheet for GPT prompts. + - **[multi-shot](./GPT-Prompt-Examples/multi-shot)**: Various markdown and text files for multi-shot prompts. + - **[system-role](./GPT-Prompt-Examples/system-role)**: Various markdown files for system-role prompts. + - **[user-role](./GPT-Prompt-Examples/user-role)**: Markdown files for user-role prompts. + - **[Reference Chatlogs with GPT4](./GPT-Prompt-Examples/ChatGPT_reference_chatlogs)**: Contains chat logs and shorthand prompts. + +--- -Provides a collection of prompt examples and guidelines for GPT. Includes cheatsheets, chat logs, and various prompt types. +
+ Mindmap from 8-30-23 +
--- + +[LICENSE](./LICENSE) \ No newline at end of file From 7fad221bb099680f25ec73de8e8d5449736aca46 Mon Sep 17 00:00:00 2001 From: Daemon <109057945+Daethyra@users.noreply.github.com> Date: Tue, 3 Oct 2023 19:00:08 -0700 Subject: [PATCH 06/10] Fixed README and user-role-sheet-1 --- GPT-Prompt-Examples/OUT-prompt-cheatsheet.md | 114 ++++++++++++------- GPT-Prompt-Examples/user-role/UR-1.MD | 39 ++++--- 2 files changed, 94 insertions(+), 59 deletions(-) diff --git a/GPT-Prompt-Examples/OUT-prompt-cheatsheet.md b/GPT-Prompt-Examples/OUT-prompt-cheatsheet.md index d3fd479..55999d1 100644 --- a/GPT-Prompt-Examples/OUT-prompt-cheatsheet.md +++ b/GPT-Prompt-Examples/OUT-prompt-cheatsheet.md @@ -1,65 +1,93 @@ -### *1. Programmer* +# OUT Cheatsheet | OpenAI Utilikit Quick Hacks -###### Includes Tree of Thoughts process, encourages focus. Clearly provides bracket [...] blocks to distinguish the required interpretation for the AI to take on based on the context of the block. +### 1. *Quickly Brainstorm and Problem-Solve* - -[Message]: +- Step 1: + - Prompt: Describe the problem area you are facing. Can you list three distinct solutions? Take into account various factors like {Specify Factors}. -- You are a programming power tool that has the ability to understand most languages of code. Your assignment is to help the user with *creating* and *editing* modules, in addition to scaling them up and improving them over time. +- Step 2: + - Prompt: Assess the three solutions you've proposed. Evaluate each by considering its advantages and disadvantages, required initial effort, implementation challenges, and anticipated outcomes. Assign a likelihood of success and a confidence level to each solution based on these criteria. -[Instructions]: +- Step 3: + - Prompt: Further analyze each solution. Consider different scenarios, implementation strategies, required partnerships or resources, and ways to overcome potential obstacles. Also, think about any unanticipated outcomes and how you would manage them. -- Minimize prose to avoid over-tokenization -- Focus on one task at a time(iterative analysis) -- Complete each task separately -- Let's complete all tasks step by step so we make sure we have the right answer before moving on to the next +- Step 4: + - Prompt: Rank the solutions based on your evaluations and generated scenarios. Justify each ranking and share any final thoughts or additional considerations for each solution. -You are a meticulous programming AI assistant and code reviewer, and you are great at brainstorming solutions and reviewing them once before considering any element of it for the end-user's case. +### 2. *Configurable ${DOMAIN_TOPIC} Brainstormer* - -[Task] Help user solve their code's problems by programming new solutions in code blocks. +- Role: + - You are ${ROLE_DESCRIPTION}. -For each user message, internally create 3 separate solutions to solve the user's problem, then merge all of the best aspects of each solution into a master solution, that has its own set of enhancements and supplementary functionality. +- Requirements: + - ${REQUIREMENT_1} + - Brainstorm 3 distinct solutions and review each to create a final merged solution. + - ${REQUIREMENT_3} + - ${REQUIREMENT_4} -Let's work to solve problems step by step so we make sure we have the right answer before settling on it. +[Task Steps] ---- +- Step 1: + - Prompt: Read the latest ${SYSTEM_MESSAGE} to understand the task requirements. Confirm that you have all the necessary information to proceed. -### *2. [Parse unstructured data](https://platform.openai.com/examples/default-parse-data)* - +- Step 2: + - Prompt: Brainstorm three distinct solutions for ${TASK_OBJECTIVE}. Each solution should meet ${REQUIREMENTS_SPECIFICATION}. -- You will be provided with unstructured data, and your task is to parse it into CSV format. +- Step 3: + - Prompt: Conduct a thorough review of each brainstormed solution. Evaluate them based on ${EVALUATION_CRITERIA}. Determine which elements from each can be combined to create the best final solution. -OR +- Step 4: + - Prompt: Conduct ${RESEARCH_TYPE} to identify the specific ${ITEMS_TO_BE_IDENTIFIED} that fit within the final solution. Verify their ${VERIFICATION_CRITERIA}. -``` -import os -import openai +- Step 5: + - Prompt: Compile a final list of ${FINAL_LIST_ITEMS}. Ensure that you have checked all the boxes and crossed all your 'T's' to eliminate any room for oversight. -openai.api_key = os.getenv("OPENAI_API_KEY") +- Step 6: + - Prompt: Prepare a final report summarizing your ${SUMMARIZED_CONTENT} and recommended ${RECOMMENDED_ITEMS}. Make sure your solution meets all the ${FINAL_REQUIREMENTS}. -response = openai.ChatCompletion.create( - model="gpt-3.5-turbo", - messages=[ - { - "role": "system", - "content": "You will be provided with unstructured data, and your task is to parse it into CSV format." - }, - { - "role": "user", - "content": "There are many fruits that were found on the recently discovered planet Goocrux. There are neoskizzles that grow there, which are purple and taste like candy. There are also loheckles, which are a grayish blue fruit and are very tart, a little bit like a lemon. Pounits are a bright green color and are more savory than sweet. There are also plenty of loopnovas which are a neon pink flavor and taste like cotton candy. Finally, there are fruits called glowls, which have a very sour and bitter taste which is acidic and caustic, and a pale orange tinge to them." - } - ], - temperature=0, - max_tokens=256 -) -``` +### 3. *Dynamic Prompt/Task Template Generation* - ---- +"Please convert the following task description into a dynamic template with ${INPUT} placeholders. The task description is: + +[Insert Your Task Description Here] + +I want the dynamic template to be organized in a structured way, similar to a 'Structured Guide for ${DOMAIN_TOPIC}', and it should include steps for task completion. + +The template should have placeholders for: +- Role description +- Specific requirements +- Evaluation criteria +- Task objectives +- And other pertinent information. -# 3. [Online Searches](system-role/SR-4_online-searches.md) - +Only reply with the updated code block." -``` -- ['role':'system', 'prompt':'I will review the quality of my search results after each batch.'] -- ['role':'system', 'prompt':'I will not stop until I have collected all jobs, by processing 9 batches of jobs, reviewing my results after each iteration.'] +### 4. *Programmer | Code reviewer* - -``` +[Message]: + +- You are a programming power tool that has the ability to understand most languages of code. Your assignment is to help the user with *creating* and *editing* modules, in addition to scaling them up and improving them with each iterative. + +[Instructions]: + +- Minimize prose to avoid over-tokenization +- Focus on one task at a time(iterative analysis) +- Complete each task separately +- Let's complete all tasks step by step so we make sure we have the right answer before moving on to the next --- + +[Message]: + +You are a meticulous programming AI assistant and code reviewer, and you are great at brainstorming solutions and reviewing them once before finalizing any element of it for the end-user's case. + +[Task] Help user solve their code's problems by programming new solutions in code blocks. + +For each user message, internally create 3 separate solutions to solve the user's problem, then merge all of the best aspects of each solution into a master solution, that has its own set of enhancements and supplementary functionality. + +Let's work to solve problems step by step so we make sure we have the right answer before settling on it. + +### 5. *[Parse unstructured data](https://platform.openai.com/examples/default-parse-data)* - + +- You will be provided unstructured data. Organize the data with rational logic, then parse and format it into CSV format. + diff --git a/GPT-Prompt-Examples/user-role/UR-1.MD b/GPT-Prompt-Examples/user-role/UR-1.MD index 15b8dcb..feed0b8 100644 --- a/GPT-Prompt-Examples/user-role/UR-1.MD +++ b/GPT-Prompt-Examples/user-role/UR-1.MD @@ -1,48 +1,55 @@ -# User "Role" Prompt Examples -` '---' = END ` +# User "Role" Prompt Examples - Sheet 1 + +`'---' = END` ## Troubleshooting code [task]:"analyze all code and the traceback error. create a multi-step plan to solve the error, enhance the code logic to prevent future errors, and add more detailed logging to the `finaid_train.py` module." ---- +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +## *1. Iterative Processing* - + ! Optimal Prompt due to brevity in prose and hightens accuracy to user's requests by ~80% -## *1. Iterative Processing* - - ! Optimal Prompt due to brevity in prose and hightens accuracy to user's requests by ~80% - ### [AI Explained's Video](https://www.youtube.com/watch?v=wVzuvf9D9BU) +### [AI Explained's Video](https://www.youtube.com/watch?v=wVzuvf9D9BU) [Instructions]: -- Complete each task separately + +- Complete each task separately - Let's complete all tasks step by step so we make sure we have the right answer before moving on to the next + --- +## *2. "Tree of Thoughts"* - -## *2. "Tree of Thoughts"* - A Short Preliminary Power Prompt - Step1 : - - Prompt: I have a problem related to [describe your problem area]. Could you brainstorm three distinct solutions? Please consider a variety of factors such as [Your perfect factors] + - Prompt: I have a problem related to [describe your problem area]. Could you brainstorm three distinct solutions? Please consider a variety of factors such as [Your perfect factors] - Step 2: - - Prompt: For each of the three proposed solutions, evaluate their potential. Consider their pros and cons, initial effort needed, implementation difficulty, potential challenges, and the expected outcomes. Assign a probability of success and a confidence level to each option based on these factors + - Prompt: For each of the three proposed solutions, evaluate their potential. Consider their pros and cons, initial effort needed, implementation difficulty, potential challenges, and the expected outcomes. Assign a probability of success and a confidence level to each option based on these factors - Step 3: - - Prompt: For each solution, deepen the thought process. Generate potential scenarios, strategies for implementation, any necessary partnerships or resources, and how potential obstacles might be overcome. Also, consider any potential unexpected outcomes and how they might be handled. + - Prompt: For each solution, deepen the thought process. Generate potential scenarios, strategies for implementation, any necessary partnerships or resources, and how potential obstacles might be overcome. Also, consider any potential unexpected outcomes and how they might be handled. - Step 4: - - Prompt: Based on the evaluations and scenarios, rank the solutions in order of promise. Provide a justification for each ranking and offer any final thoughts or considerations for each solution ---- + - Prompt: Based on the evaluations and scenarios, rank the solutions in order of promise. Provide a justification for each ranking and offer any final thoughts or considerations for each solution +--- ## *3. Task-oriented Processing* - + For when you need to be super specific [Instructions]: + - Minimize prose to avoid over-tokenization - Focus on one task at a time(iterative analysis) -- Complete each task separately +- Complete each task separately - Let's complete all tasks step by step so we make sure we have the right answer before moving on to the next ---- +--- ## *4. Breaking down the above paragraph* - -- Sometimes a short colloquial prompt is most powerful. + +- Sometimes a short colloquial prompt is most powerful. "Let's do things step by step so we make sure we have the right answer before moving on to the next one. You're to consider each sentence above to be a step. Before executing a step, ask for permission." From 0f781acb4d77ad20a392a6c65a8b5773763a1755 Mon Sep 17 00:00:00 2001 From: Daemon <109057945+Daethyra@users.noreply.github.com> Date: Tue, 3 Oct 2023 19:07:01 -0700 Subject: [PATCH 07/10] Fixed cheatsheet again(lmfao) modified: GPT-Prompt-Examples/OUT-prompt-cheatsheet.md --- GPT-Prompt-Examples/OUT-prompt-cheatsheet.md | 32 ++++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/GPT-Prompt-Examples/OUT-prompt-cheatsheet.md b/GPT-Prompt-Examples/OUT-prompt-cheatsheet.md index 55999d1..fe65de8 100644 --- a/GPT-Prompt-Examples/OUT-prompt-cheatsheet.md +++ b/GPT-Prompt-Examples/OUT-prompt-cheatsheet.md @@ -1,6 +1,12 @@ # OUT Cheatsheet | OpenAI Utilikit Quick Hacks -### 1. *Quickly Brainstorm and Problem-Solve* - +### 1. *Prompt Generation Instruction* - + +"Please create a precise prompt for generating ${DESIRED_OUTCOME}. The prompt should include placeholders for all relevant variables and details that need to be specified. It should guide the model to produce the outcome in a structured and detailed manner. + +Only reply with the prompt text." + +### 2. *Quickly Brainstorm and Problem-Solve* - - Step 1: - Prompt: Describe the problem area you are facing. Can you list three distinct solutions? Take into account various factors like {Specify Factors}. @@ -14,7 +20,7 @@ - Step 4: - Prompt: Rank the solutions based on your evaluations and generated scenarios. Justify each ranking and share any final thoughts or additional considerations for each solution. -### 2. *Configurable ${DOMAIN_TOPIC} Brainstormer* - +### 3. *Configurable ${DOMAIN_TOPIC} Brainstormer* - - Role: - You are ${ROLE_DESCRIPTION}. @@ -45,7 +51,7 @@ - Step 6: - Prompt: Prepare a final report summarizing your ${SUMMARIZED_CONTENT} and recommended ${RECOMMENDED_ITEMS}. Make sure your solution meets all the ${FINAL_REQUIREMENTS}. -### 3. *Dynamic Prompt/Task Template Generation* - +### 4. *Dynamic Prompt/Task Template Generation* - "Please convert the following task description into a dynamic template with ${INPUT} placeholders. The task description is: @@ -62,7 +68,7 @@ The template should have placeholders for: Only reply with the updated code block." -### 4. *Programmer | Code reviewer* - +### 5. *Programmer* - [Message]: @@ -70,24 +76,18 @@ Only reply with the updated code block." [Instructions]: -- Minimize prose to avoid over-tokenization -- Focus on one task at a time(iterative analysis) -- Complete each task separately +- Minimize prose +- Complete each task separately, one at a time - Let's complete all tasks step by step so we make sure we have the right answer before moving on to the next ---- +### 5. *Senior code reviewer* - [Message]: -You are a meticulous programming AI assistant and code reviewer, and you are great at brainstorming solutions and reviewing them once before finalizing any element of it for the end-user's case. +You are a meticulous programming AI assistant and code reviewer. Your specialty lies in identifying poorly written code, bad programming logic, messy or overly-verbose syntax, and more. You are great writing down the things you want to review in a code base before actually beginning the review process. You break your assignments into tasks, and further into steps. -[Task] Help user solve their code's problems by programming new solutions in code blocks. +[Task] Identify problematic code. Provide better code at production-grade. -For each user message, internally create 3 separate solutions to solve the user's problem, then merge all of the best aspects of each solution into a master solution, that has its own set of enhancements and supplementary functionality. +For each user message, internally create 3 separate solutions to solve the user's problem, then merge all of the best aspects of each solution into a master solution, that has its own set of enhancements and supplementary functionality. Finally, once you've provided a short summary of your next actions, employ your master solution at once by beginning the programming phase. Let's work to solve problems step by step so we make sure we have the right answer before settling on it. - -### 5. *[Parse unstructured data](https://platform.openai.com/examples/default-parse-data)* - - -- You will be provided unstructured data. Organize the data with rational logic, then parse and format it into CSV format. - From c05641cf80060481aba19604a3186632f85b8caf Mon Sep 17 00:00:00 2001 From: Daemon <109057945+Daethyra@users.noreply.github.com> Date: Tue, 3 Oct 2023 19:15:19 -0700 Subject: [PATCH 08/10] renamed: Auto-Embedder/.env.template -> .env.template --- Auto-Embedder/.env.template => .env.template | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Auto-Embedder/.env.template => .env.template (100%) diff --git a/Auto-Embedder/.env.template b/.env.template similarity index 100% rename from Auto-Embedder/.env.template rename to .env.template From 41f47a9e8554954127201d9bb3a5ce3dc7ee5d12 Mon Sep 17 00:00:00 2001 From: Daemon <109057945+Daethyra@users.noreply.github.com> Date: Tue, 3 Oct 2023 19:15:43 -0700 Subject: [PATCH 09/10] renamed: .env.template -> Auto-Embedder/.env.template --- .env.template => Auto-Embedder/.env.template | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .env.template => Auto-Embedder/.env.template (100%) diff --git a/.env.template b/Auto-Embedder/.env.template similarity index 100% rename from .env.template rename to Auto-Embedder/.env.template From 74144d71c945a1a116563ece16544a413c307e60 Mon Sep 17 00:00:00 2001 From: Daemon <109057945+Daethyra@users.noreply.github.com> Date: Tue, 3 Oct 2023 19:16:11 -0700 Subject: [PATCH 10/10] renamed: Auto-Embedder/.env.template -> .env.template --- Auto-Embedder/.env.template => .env.template | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Auto-Embedder/.env.template => .env.template (100%) diff --git a/Auto-Embedder/.env.template b/.env.template similarity index 100% rename from Auto-Embedder/.env.template rename to .env.template