import os import time from dotenv import load_dotenv from openai import OpenAI load_dotenv() # 3/ set up the client client = OpenAI( api_key=os.getenv("OPENAI_API_KEY"), ) class ActionsPipeline: def __init__(self, model, input_prompt): self.model = model self.input_prompt = input_prompt self.tools_dict = {} self.eval_criteria = None self.reasoning = None self.task_decomposition = [] self.tools_suggestion = [] self.references_suggestion = [] self.advanced_prompt = None self.prompt_tokens = 0 self.completion_tokens = 0 def analyze_input(self): print("Analizowanie promptu...") analysis_prompt = f""" Jesteś asystentem o wysokim poziomie inteligencji. Przeanalizuj dostarczony {{self.prompt}} i wygeneruj zwięzłe odpowiedzi dotyczące poniższych kluczowych aspektów: - **Główny cel zapytania:** Zidentyfikuj główny temat lub prośbę zawartą w zapytaniu. - **Persona:** Zaproponuj najodpowiedniejszą rolę, jaką model AI powinien przyjąć (np. ekspert, nauczyciel, konwersacyjny itp.). - **Optymalna długość wyjścia:** Zaproponuj optymalną długość odpowiedzi (krótka, zwięzła, średnia, długa) w zależności od zadania i określ przybliżoną liczbę słów, jeśli jest to odpowiednie. - **Najdogodniejszy format wyjścia:** Zarekomenduj optymalny format dla odpowiedzi (np. lista, akapit, fragment kodu, tabela, JSON itp.). - **Szczególne wymagania:** Wskaż wszelkie specjalne warunki, zasady lub oczekiwania wyrażone lub sugerowane w zapytaniu. - **Proponowane ulepszenia:** Zaoferuj rekomendacje dotyczące modyfikacji lub ulepszeń zapytania w celu uzyskania bardziej precyzyjnych lub efektywnych wyników. - **One-shot prompting:** Utwórz jeden przykład, który pomoże w wygenerowaniu odpowiedzi. Następnie użyj tych informacji, aby przeformułować i rozszerzyć dostarczony {{self.prompt}}. Zwróć rozszerzone zapytanie w formacie tekstowym. Nie tłumacz procesu generacji. Przykład 1: {{self.prompt}}: "Wytłumacz splątanie kwantowe dziesięciolatkowi." *proces myślowy*: - **Główny cel zapytania:** Upraszczanie skomplikowanego zagadnienia z fizyki kwantowej dla dzieci. - **Persona:** Cierpliwy, przyjazny nauczyciel - **Optymalna długość wyjścia:** Krótka (100-150 słów) - **Najdogodniejszy format wyjścia:** Opis z analogią - **Szczególne wymagania:** Wyjaśnienie dostosowane do wieku (10 lat). - **Proponowane ulepszenia:** - Zastosowanie konkretnych analogii - Dodanie interaktywnych elementów - Sugerowanie pytań follow-up - Propozycja wizualizacji - **One-shot prompting:** Przykład wyjścia: "Wyobraź sobie, że masz dwie specjalne pary skarpetek. Kiedy jedną z nich zostawiasz w swoim pokoju, a drugą w kuchni, dzieje się coś magicznego! Co by się nie stało z jedną skarpetą, natychmiast to samo dzieje się z drugą skarpetą. Jeśli przewrócisz jedną na lewą stronę, druga automatycznie też się odwróci, bez względu na to, jak daleko są od siebie!" *rozszerzone zapytanie*: Jako przyjazny nauczyciel nauk ścisłych, wyjaśnij splątanie kwantowe dziesięciolatkowi, korzystając z poniższych wskazówek: Zacznij od analogii odnoszącej się do codziennych przedmiotów Używaj prostego, zrozumiałego języka, unikając technicznych terminów Dodaj 2-3 interaktywne przykłady, które ilustrują koncepcję Dodaj ciekawe fakty, które rozbudzą ciekawość Zakończ prostymi pytaniami sprawdzającymi zrozumienie Utrzymaj wyjaśnienie na poziomie 100-150 słów Struktura wyjaśnienia: Otwarcie - analogia Główne wyjaśnienie z przykładami Interaktywne scenariusze "Co by było, gdyby?" Ciekawe fakty o splątaniu kwantowym Pytania sprawdzające zrozumienie Pamiętaj, aby utrzymać entuzjastyczny i zachęcający ton przez całe wyjaśnienie. Przykład 2: {{self.prompt}}: "Napisz funkcję do obliczania ciągu Fibonacciego do n elementów." *proces myślowy*: - **Główny cel zapytania:** Stworzenie funkcji programującej generującej liczby Fibonacciego - **Persona:** Ekspert programowania - **Optymalna długość wyjścia:** Średnia (150-200 słów, włącznie z kodem) - **Najdogodniejszy format wyjścia:** Fragment kodu z komentarzami - **Szczególne wymagania:** Funkcja powinna przyjmować parametr n, określający długość sekwencji - **Proponowane ulepszenia:** - Określenie języka programowania - Wyjaśnienie, czy 0 powinna być uwzględniona jako pierwszy element - Zdefiniowanie sposobu obsługi nieprawidłowych wartości (np. ujemnych) - **One-shot prompting:** *rozszerzone zapytanie*: Jako ekspert programowania, napisz dobrze udokumentowaną funkcję generującą ciąg Fibonacciego. Wymagania: Zaakceptuj parametr 'n', który określa liczbę generowanych elementów Obsłuż przypadki brzegowe (n <= 0, n == 1) Zwróć sekwencję jako listę/tablicę Dodaj odpowiednie obsługiwanie błędów Dołącz komentarze wyjaśniające logikę działania Implementację przygotuj w Pythonie, włączając: Definicję funkcji z docstringiem Walidację wejścia Główny algorytm Przykłady użycia z wynikami dla n=5, n=1 i n=0 Sekwencja powinna rozpoczynać się od [0, 1, ...], gdzie każda kolejna liczba jest sumą dwóch poprzednich. Analizuję dostarczony {{self.prompt}} i generuję odpowiednie output na podstawie powyższej struktury. {{self.prompt}}: {self.input_prompt} """ self.analyzed_prompt = self.call_llm(analysis_prompt) def expand_instructions(self): # Expand on the instructions given in the input prompt print("Expanding instructions...") enhancement_suggestion_prompt = f""" Jesteś wysoce inteligentnym asystentem specjalizującym się w sugestiach dotyczących źródeł referencyjnych oraz integracji narzędzi. Przeanalizuj dostarczony {{self.input_prompt}} oraz dostępne {{self.tools_dict}}, aby zaproponować ulepszenia: - **Potrzeba odniesienia:** Określ, czy dodatkowe materiały referencyjne pomogą w realizacji zadania (np. strony internetowe, dokumentacje, książki, artykuły itp.). - **Zastosowanie narzędzi:** Oceń, czy dostępne narzędzia mogą zwiększyć wydajność lub dokładność. - **Złożoność integracji:** Oceń trudność włączenia sugerowanych zasobów. - **Oczekiwany wpływ:** Oszacuj potencjalną poprawę jakości wyników. Jeśli ulepszenia są uzasadnione, przedstaw uporządkowane rekomendacje w poniższym formacie: ##SUGESTIE DOTYCZĄCE ŹRÓDEŁ REFERENCYJNYCH## (Tylko jeśli to stosowne, maksymalnie 3) - Nazwa/rodzaj źródła referencyjnego - Cel: W jaki sposób poprawia wynik - Integracja: Jak je włączyć ##SUGESTIE DOTYCZĄCE NARZĘDZI## (Tylko jeśli to stosowne, maksymalnie 3) - Nazwa narzędzia z tools_dict - Cel: W jaki sposób usprawnia zadanie - Integracja: Jak wdrożyć Jeśli żadne ulepszenia nie przyniosłyby istotnej poprawy wyników, zwróć pusty ciąg "". Przykład 1: {{self.input_prompt}}: "Napisz funkcję w Pythonie do wykrywania twarzy w obrazach przy użyciu wizji komputerowej." {{self.tools_dict}}: {{}} *output*: ##SUGESTIE DOTYCZĄCE ŹRÓDEŁ REFERENCYJNYCH## - Dokumentacja OpenCV na temat wykrywania twarzy Cel: Zapewnia szczegóły implementacyjne i najlepsze praktyki Integracja: Odniesienie do optymalnych ustawień parametrów i użycia klasyfikatora kaskadowego Przykład 2: {{self.input_prompt}}: "Napisz haiku o wiośnie." {{self.tools_dict}}: {{"textblob": "Biblioteka przetwarzania tekstu", "gpt": "Model językowy"}} *output*: Przykład 3: {{self.analyzed_prompt}}: "Stwórz funkcję analizy sentymentu dla recenzji klientów." {{self.tools_dict}}: {{}} *output*: ##SUGESTIE DOTYCZĄCE ŹRÓDEŁ REFERENCYJNYCH## - Artykuł na temat analizy sentymentu VADER Cel: Dostarcza wglądu w analizę sentymentu tekstu z mediów społecznościowych Integracja: Odniesienie do zrozumienia złożonych wyników sentymentu Przykład 4: {{self.analyzed_prompt}}: "Wygeneruj raport prognozy pogody dla Nowego Jorku." {{self.tools_dict}}: {{"requests": "Biblioteka HTTP", "json": "Parser JSON", "weather_api": "Usługa danych pogodowych"}} *output*: ##SUGESTIE DOTYCZĄCE NARZĘDZI## - weather_api Cel: Dostarcza aktualne dane pogodowe Integracja: Wykorzystaj punkty końcowe API do pobierania danych prognozy - requests Cel: Wykonywanie żądań HTTP do API pogodowego Integracja: Użyj requests.get() do pobierania danych pogodowych Przykład 5: {{self.analyzed_prompt}}: "Oblicz silnię liczby." {{self.tools_dict}}: {{}} *output*: Przykład 6: {{self.analyzed_prompt}}: "Stwórz dokumentację punktu końcowego API." {{self.tools_dict}}: {{"swagger": "Narzędzie dokumentacji API", "markdown": "Formatowanie tekstu", "json_schema": "Walidator schematów JSON"}} *output*: ##SUGESTIE DOTYCZĄCE ŹRÓDEŁ REFERENCYJNYCH## - Specyfikacja OpenAPI Cel: Dostarcza standardowy format dokumentacji API Integracja: Użyj jako szablonu do struktury dokumentacji - Najlepsze praktyki REST API Cel: Zapewnia zgodność dokumentacji z branżowymi standardami Integracja: Odniesienie do wzorców opisu punktów końcowych ##SUGESTIE DOTYCZĄCE NARZĘDZI## - swagger Cel: Generowanie interaktywnej dokumentacji API Integracja: Użyj Swagger UI do wizualnej dokumentacji - json_schema Cel: Walidacja schematów żądań/odpowiedzi API Integracja: Definiowanie i walidacja struktur danych Przykład 7: {{self.analyzed_prompt}}: "Stwórz dokumentację punktu końcowego API." {{self.tools_dict}}: {{}} *output*: ##SUGESTIE DOTYCZĄCE ŹRÓDEŁ REFERENCYJNYCH## - Specyfikacja OpenAPI Cel: Dostarcza standardowy format dokumentacji API Integracja: Użyj jako szablonu do struktury dokumentacji - Najlepsze praktyki REST API Cel: Zapewnia zgodność dokumentacji z branżowymi standardami Integracja: Odniesienie do wzorców opisu punktów końcowych Teraz przeanalizuj poniższe zapytanie i narzędzia, a następnie zwróć tylko wygenerowane *output*: {{self.input_prompt}}: {self.input_prompt} {{self.tools_dict}}: {self.tools_dict} """ self.expanded_prompt = self.call_llm(enhancement_suggestion_prompt) def create_eval_criteria(self): # Define the evaluation criteria based on input and expanded instructions print("Creating evaluation criteria...") self.eval_criteria = "Defined evaluation criteria" def add_reasoning(self): # Add reasoning to strengthen the evaluation print("Adding reasoning...") self.reasoning = "Reasoning added to enhance decision making" def decompose_task(self): # Break down tasks into smaller components print("Decomposing task...") self.task_decomposition = ["Sub-task 1", "Sub-task 2", "Sub-task 3"] def suggest_tools(self): # Suggest tools for each subtask print("Suggesting tools...") self.tools_suggestion = ["Tool 1", "Tool 2"] def suggest_references(self): # Suggest references to help complete the tasks enhancement_suggestion_prompt = f""" Jesteś wysoce inteligentnym asystentem specjalizującym się w sugerowaniu źródeł referencyjnych oraz integracji narzędzi. Przeanalizuj dostarczone {{self.input_prompt}} oraz dostępne {{self.tools_dict}}, aby zaproponować ulepszenia: - **Potrzeba odniesienia:** Określ, czy dodatkowe materiały referencyjne pomogą w realizacji zadania (np. strony internetowe, dokumentacje, książki, artykuły itp.). - **Zastosowanie narzędzi:** Oceń, czy dostępne narzędzia mogą zwiększyć wydajność lub dokładność. - **Złożoność integracji:** Oceń trudność włączenia sugerowanych zasobów. - **Oczekiwany wpływ:** Oszacuj potencjalną poprawę jakości wyników. Jeśli ulepszenia są uzasadnione, przedstaw uporządkowane rekomendacje w poniższym formacie: ##SUGESTIE DOTYCZĄCE ŹRÓDEŁ REFERENCYJNYCH## (Tylko jeśli to stosowne, maksymalnie 3) - Nazwa/rodzaj źródła referencyjnego - Cel: W jaki sposób poprawia wynik - Integracja: Jak je włączyć ##SUGESTIE DOTYCZĄCE NARZĘDZI## (Tylko jeśli to stosowne, maksymalnie 3) - Nazwa narzędzia z tools_dict - Cel: W jaki sposób usprawnia zadanie - Integracja: Jak wdrożyć Jeśli żadne ulepszenia nie przyniosłyby istotnej poprawy wyników, zwróć pusty ciąg "". Przykład 1: {{self.input_prompt}}: "Napisz funkcję w Pythonie do wykrywania twarzy w obrazach przy użyciu wizji komputerowej." {{self.tools_dict}}: {{}} *output*: ##SUGESTIE DOTYCZĄCE ŹRÓDEŁ REFERENCYJNYCH## - Dokumentacja OpenCV na temat wykrywania twarzy Cel: Zapewnia szczegóły implementacyjne i najlepsze praktyki Integracja: Odniesienie do optymalnych ustawień parametrów i użycia klasyfikatora kaskadowego Przykład 2: {{self.input_prompt}}: "Napisz haiku o wiośnie." {{self.tools_dict}}: {{"textblob": "Biblioteka przetwarzania tekstu", "gpt": "Model językowy"}} *output*: Przykład 3: {{self.analyzed_prompt}}: "Stwórz funkcję analizy sentymentu dla recenzji klientów." {{self.tools_dict}}: {{}} *output*: ##SUGESTIE DOTYCZĄCE ŹRÓDEŁ REFERENCYJNYCH## - Artykuł na temat analizy sentymentu VADER Cel: Dostarcza wglądu w analizę sentymentu tekstu z mediów społecznościowych Integracja: Odniesienie do zrozumienia złożonych wyników sentymentu Przykład 4: {{self.analyzed_prompt}}: "Wygeneruj raport prognozy pogody dla Nowego Jorku." {{self.tools_dict}}: {{"requests": "Biblioteka HTTP", "json": "Parser JSON", "weather_api": "Usługa danych pogodowych"}} *output*: ##SUGESTIE DOTYCZĄCE NARZĘDZI## - weather_api Cel: Dostarcza aktualne dane pogodowe Integracja: Wykorzystaj punkty końcowe API do pobierania danych prognozy - requests Cel: Wykonywanie żądań HTTP do API pogodowego Integracja: Użyj requests.get() do pobierania danych pogodowych Przykład 5: {{self.analyzed_prompt}}: "Oblicz silnię liczby." {{self.tools_dict}}: {{}} *output*: Przykład 6: {{self.analyzed_prompt}}: "Stwórz dokumentację punktu końcowego API." {{self.tools_dict}}: {{"swagger": "Narzędzie dokumentacji API", "markdown": "Formatowanie tekstu", "json_schema": "Walidator schematów JSON"}} *output*: ##SUGESTIE DOTYCZĄCE ŹRÓDEŁ REFERENCYJNYCH## - Specyfikacja OpenAPI Cel: Dostarcza standardowy format dokumentacji API Integracja: Użyj jako szablonu do struktury dokumentacji - Najlepsze praktyki REST API Cel: Zapewnia zgodność dokumentacji z branżowymi standardami Integracja: Odniesienie do wzorców opisu punktów końcowych ##SUGESTIE DOTYCZĄCE NARZĘDZI## - swagger Cel: Generowanie interaktywnej dokumentacji API Integracja: Użyj Swagger UI do wizualnej dokumentacji - json_schema Cel: Walidacja schematów żądań/odpowiedzi API Integracja: Definiowanie i walidacja struktur danych Przykład 7: {{self.analyzed_prompt}}: "Stwórz dokumentację punktu końcowego API." {{self.tools_dict}}: {{}} *output*: ##SUGESTIE DOTYCZĄCE ŹRÓDEŁ REFERENCYJNYCH## - Specyfikacja OpenAPI Cel: Dostarcza standardowy format dokumentacji API Integracja: Użyj jako szablonu do struktury dokumentacji - Najlepsze praktyki REST API Cel: Zapewnia zgodność dokumentacji z branżowymi standardami Integracja: Odniesienie do wzorców opisu punktów końcowych Teraz przeanalizuj poniższe zapytanie i narzędzia, a następnie zwróć tylko wygenerowane *output*: {{self.input_prompt}}: {self.input_prompt} {{self.tools_dict}}: {self.tools_dict} """ print("Suggesting references...") self.references_suggestion = self.call_llm(enhancement_suggestion_prompt) def assemble_prompt(self): # Assemble the advanced prompt based on all gathered information print("Assembling advanced prompt...") components =[ self.analyzed_prompt, self.expanded_prompt, self.references_suggestion ] self.advanced_prompt = f"Advanced Prompt: {', '.join([comp for comp in components if comp is not None])}" return self.advanced_prompt def call_llm(self, prompt): response = client.chat.completions.create( model=self.model, messages=[ { "role": "system", "content": "Jesteś wysoce inteligentnym asystentem AI..." }, {"role": "user", "content": prompt} ], temperature=0.0, ) # counting the I/O tokens self.prompt_tokens += response.usage.prompt_tokens self.completion_tokens += response.usage.completion_tokens # zwraca mi kontent zapytania #print(response.choices[0].message.content) return response.choices[0].message.content def run_pipeline(self): self.analyze_input() self.expand_instructions() # self.create_eval_criteria() # self.add_reasoning() # self.decompose_task() # self.suggest_tools() self.suggest_references() return self.assemble_prompt() # Example usage import asyncio # Example usage if __name__ == "__main__": print("-" * 52) print("Agent tworzący rozbudowane prompty ") print("-" * 52, "\n") print("Wybierz model") print("1) GPT-4o") print("2) GPT-4o-mini") which_model = input("Twój wybór [1/2]: \n") if which_model == "1": model = "gpt-4o" i_cost = 5 / 10**6 o_cost = 15 / 10**6 elif which_model == "2": model = "gpt-4o-mini" i_cost = 0.15 / 10**6 o_cost = 0.6 / 10**6 else: raise Exception("Please input a valid choice") input_prompt = input("Wpisz swoje zapytanie \n") print("\n") # input_prompt = "Wygeneruj listę 20 pomysłów na wpisy blogowe" pipeline = ActionsPipeline(model, input_prompt) print(f"Wybrałeś model: GPT-{pipeline.model[4:]}\n") print("Procesowanie ... \n") start_time = time.time() advanced_prompt = pipeline.run_pipeline() elapsed_time = time.time() - start_time print("\n-Wynik") print(advanced_prompt) print("\n") print(f"- Czas trwania: {elapsed_time:.2f} sekund") print(f"- Ilość tokenów w promptach = {pipeline.prompt_tokens}") print(f"- Tokeny zwrócone = {pipeline.completion_tokens}") print(f"- Koszt = ${(pipeline.prompt_tokens*i_cost)+(pipeline.completion_tokens*o_cost)}\n")