Files
DBAdmin/inbox/Python/ai/prompt_generator.py
T
2026-05-18 06:40:19 +00:00

441 lines
20 KiB
Python

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")