Dowiedz się, jak zintegrować nowy model OpenAI o1-preview w skrypcie Pythona, aby wzbogacić swoje projekty sztucznej inteligencji. Ten skrypt umożliwia interakcję z API OpenAI przy użyciu modelu o1-preview, z możliwością dołączania zawartości stron internetowych do promptów dzięki funkcji web scraping. Dodatkowo poprawnie obsługuje wyrażenia matematyczne LaTeX w odpowiedziach modelu, konwertując je na czytelny tekst Unicode w terminalu.
Wprowadzenie
12 września 2024 roku OpenAI wprowadziło nową serię modeli AI nazwaną OpenAI o1. Modele te są zaprojektowane tak, aby wykonywać głębsze rozumowanie przed udzieleniem odpowiedzi, co pozwala im rozwiązywać złożone problemy w nauce, programowaniu i matematyce. Model o1-preview wyróżnia się szczególnie w tych obszarach, przewyższając wcześniejsze modele, takie jak gpt-4o.
Najważniejsze punkty skryptu:
- Integracja modelu o1-preview: Skrypt domyślnie używa modelu o1-preview, oferując zaawansowane możliwości rozumowania.
- Wbudowany web scraping: Potrafi wydobywać treść stron internetowych, aby wzbogacić kontekst promptu.
- Obsługa wyrażeń LaTeX: Wyrażenia matematyczne w odpowiedziach są konwertowane na tekst Unicode dla wygodnego odczytu w terminalu.
- Możliwość dostosowania: Skrypt pozwala na wybór modelu OpenAI i może być dopasowany do różnych przypadków użycia.
W tym artykule szczegółowo omówię kod skryptu, wyjaśnię jego działanie i przeprowadzę serię złożonych promptów.
Wymagania wstępne
Zanim zaczniesz, upewnij się, że masz:
- Python 3.x zainstalowany na swoim komputerze.
- Klucz API OpenAI. Możesz go uzyskać, rejestrując się na stronie OpenAI.
- Wirtualne środowisko Pythona (zalecane do izolowania zależności).
- Niezbędne moduły Pythona.
Konfiguracja wirtualnego środowiska
Aby odizolować zależności tego projektu, zaleca się użycie wirtualnego środowiska. Oto jak je utworzyć i zainstalować wymagane zależności:
python3 -m venv env
source env/bin/activate # Sur Windows, utilisez env\Scripts\activate
pip install openai selenium webdriver-manager pylatexenc
Ustawienie klucza API OpenAI
Ustaw swój klucz API OpenAI jako zmienną środowiskową:
export OPENAI_API_KEY='votre_clé_api_ici'
Zastąp 'votre_clé_api_ici' swoim rzeczywistym kluczem API.
Pełny kod skryptu
Oto pełny kod skryptu Pythona:
#!/usr/bin/env python3
import os
import sys
import argparse
import re
from openai import OpenAI
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from pylatexenc.latex2text import LatexNodes2Text
def get_web_content(url):
if not url:
return ""
try:
# Configure les options de Chrome
chrome_options = Options()
# Ne pas utiliser le mode headless pour éviter les problèmes de vérification humaine
# Utilise ChromeDriverManager pour gérer l\'installation de ChromeDriver
driver = webdriver.Chrome(
service=Service(ChromeDriverManager().install()), options=chrome_options
)
# Charge la page web
driver.get(url)
# Récupère le contenu textuel de la page
web_content = driver.execute_script("return document.documentElement.innerText")
# Ferme le navigateur
driver.quit()
return web_content if web_content else None
except Exception as e:
return None
def convert_latex_to_text(latex_str):
# Convertit les expressions LaTeX en texte Unicode
return LatexNodes2Text().latex_to_text(latex_str)
def clean_output(content):
# Trouve toutes les expressions LaTeX dans le contenu et les convertit
patterns = [r"\\\\[.*?\\\\]", r"\\\(.*?\\\)", r"\$\$.*?\$\$", r"\$.*?\$"]
for pattern in patterns:
matches = re.findall(pattern, content, flags=re.DOTALL)
for match in matches:
plain_text = convert_latex_to_text(match)
content = content.replace(match, plain_text)
return content
def get_response(prompt, client, model="o1-preview"):
urls = re.findall(r"(https?://\S+)", prompt)
for url in urls:
web_content = get_web_content(url)
if web_content:
prompt = prompt.replace(url, web_content)
else:
return f"Erreur: Le contenu web pour {url} ne peut être récupéré."
try:
response = client.chat.completions.create(
model=model,
messages=[
{
"role": "user",
"content": prompt,
},
],
)
first_choice_message = response.choices[0].message
content = first_choice_message.content
# Convertit les expressions LaTeX en texte lisible
cleaned_content = clean_output(content)
return cleaned_content
except Exception as e:
return f"Une erreur est survenue : {e}"
def main():
parser = argparse.ArgumentParser()
parser.add_argument("prompt", nargs="?", help="Le prompt contenant des URLs")
parser.add_argument(
"--model",
default="o1-preview",
choices=["gpt-4o", "o1-preview", "o1-mini"],
help="Le modèle OpenAI à utiliser (par défaut o1-preview)",
)
args = parser.parse_args()
openai_api_key = os.getenv("OPENAI_API_KEY")
if not openai_api_key:
raise ValueError(
"La clé API OPENAI_API_KEY n'est pas définie dans les variables d\'environnement."
)
with OpenAI(api_key=openai_api_key) as client:
prompt = args.prompt or sys.stdin.read()
response = get_response(prompt, client, model=args.model)
print(response)
if __name__ == "__main__":
main()
Wyjaśnienie kodu
Importowanie niezbędnych modułów
Skrypt zaczyna się od zaimportowania podstawowych modułów:
- os, sys, argparse, re: Moduły standardowe do obsługi zmiennych środowiskowych, argumentów linii poleceń i wyrażeń regularnych.
- openai: Moduł do interakcji z API OpenAI.
- selenium i webdriver_manager: Do wykonywania web scrapingu.
- pylatexenc: Do konwersji wyrażeń LaTeX na czytelny tekst Unicode.
Funkcja get_web_content
Ta funkcja pobiera tekstową zawartość strony internetowej.
def get_web_content(url):
if not url:
return ""
try:
# Configure les options de Chrome
chrome_options = Options()
# Ne pas utiliser le mode headless pour éviter les problèmes de vérification humaine
# Utilise ChromeDriverManager pour gérer l\'installation de ChromeDriver
driver = webdriver.Chrome(
service=Service(ChromeDriverManager().install()), options=chrome_options
)
# Charge la page web
driver.get(url)
# Récupère le contenu textuel de la page
web_content = driver.execute_script("return document.documentElement.innerText")
# Ferme le navigateur
driver.quit()
return web_content if web_content else None
except Exception as e:
return None
Najważniejsze punkty:
- Opcje Chrome: Skrypt nie używa trybu headless, aby uniknąć problemów z weryfikacją ludzką, które niektóre strony narzucają przeglądarkom w trybie headless.
- ChromeDriverManager: Automatycznie zarządza instalacją i aktualizacją ChromeDriver.
- Ekstrakcja treści: Używa JavaScript do wydobycia pełnego tekstu ze strony.
- Obsługa wyjątków: W przypadku błędu funkcja zwraca
None.
Funkcja convert_latex_to_text
Ta funkcja konwertuje wyrażenia LaTeX na tekst Unicode.
def convert_latex_to_text(latex_str):
# Convertit les expressions LaTeX en texte Unicode
return LatexNodes2Text().latex_to_text(latex_str)
Najważniejsze punkty:
- Używa biblioteki
pylatexencdo konwersji wyrażeń LaTeX, dzięki czemu formuły matematyczne są czytelne w terminalu.
Funkcja clean_output
Ta funkcja przetwarza odpowiedź modelu, aby skonwertować wyrażenia LaTeX.
def clean_output(content):
# Trouve toutes les expressions LaTeX dans le contenu et les convertit
patterns = [r"\\\\[.*?\\\\]", r"\\\(.*?\\\)", r"\$\$.*?\$\$", r"\$.*?\$"]
for pattern in patterns:
matches = re.findall(pattern, content, flags=re.DOTALL)
for match in matches:
plain_text = convert_latex_to_text(match)
content = content.replace(match, plain_text)
return content
Najważniejsze punkty:
- Wyszukiwanie wyrażeń LaTeX: Korzysta z wyrażeń regularnych do identyfikacji formuł.
- Konwersja: Każda formuła jest konwertowana na tekst Unicode.
- Zastępowanie: Wyrażenia LaTeX są zastępowane ich czytelnymi odpowiednikami.
Funkcja get_response
Przygotowuje prompt, obsługuje web scraping jeśli to konieczne, wywołuje API OpenAI i oczyszcza odpowiedź.
def get_response(prompt, client, model="o1-preview"):
urls = re.findall(r"(https?://\S+)", prompt)
for url in urls:
web_content = get_web_content(url)
if web_content:
prompt = prompt.replace(url, web_content)
else:
return f"Erreur: Le contenu web pour {url} ne peut être récupéré."
try:
response = client.chat.completions.create(
model=model,
messages=[
{
"role": "user",
"content": prompt,
},
],
)
first_choice_message = response.choices[0].message
content = first_choice_message.content
# Convertit les expressions LaTeX en texte lisible
cleaned_content = clean_output(content)
return cleaned_content
except Exception as e:
return f"Une erreur est survenue : {e}"
Najważniejsze punkty:
- Obsługa URL-i: Jeśli prompt zawiera URL-e, ich zawartość jest wydobywana i wstawiana.
- Wywołanie API OpenAI: Wysyła zmodyfikowany prompt do określonego modelu.
- Oczyszczanie odpowiedzi: Wyrażenia LaTeX są konwertowane dla łatwiejszego odczytu.
Funkcja main
Obsługuje argumenty linii poleceń i uruchamia skrypt.
def main():
parser = argparse.ArgumentParser()
parser.add_argument("prompt", nargs="?", help="Le prompt contenant des URLs")
parser.add_argument(
"--model",
default="o1-preview",
choices=["gpt-4o", "o1-preview", "o1-mini"],
help="Le modèle OpenAI à utiliser (par défaut o1-preview)",
)
args = parser.parse_args()
openai_api_key = os.getenv("OPENAI_API_KEY")
if not openai_api_key:
raise ValueError(
"La clé API OPENAI_API_KEY n'est pas définie dans les variables d\'environnement."
)
with OpenAI(api_key=openai_api_key) as client:
prompt = args.prompt or sys.stdin.read()
response = get_response(prompt, client, model=args.model)
print(response)
Najważniejsze punkty:
- Argumenty: Skrypt akceptuje prompt i model jako argumenty.
- Klucz API: Sprawdza, czy klucz API jest ustawiony.
- Wykonanie: Wywołuje funkcję
get_responsei wyświetla odpowiedź.
Uruchomienie skryptu
if __name__ == "__main__":
main()
Przykłady użycia
Zadanie wymagające rozumowania
./openai_poc.py "Dans un triangle rectangle, si les côtés adjacents à l'angle droit mesurent 3 cm et 4 cm, calcule la longueur de l'hypoténuse."
Aby obliczyć długość przeciwprostokątnej w trójkącie prostokątnym, którego przyprostokątne mają długości 3 cm i 4 cm, używamy twierdzenia Pitagorasa:
Podstawiając wartości:
Biorąc pierwiastek kwadratowy z obu stron:
Zatem długość przeciwprostokątnej wynosi 5 cm.
Długość przeciwprostokątnej to 5 cm.
Wygenerowanie streszczenia strony internetowej
./openai_poc.py "Fais-moi un résumé de cette page : https://openai.com/index/introducing-openai-o1-preview/"
OpenAI ogłosiło 12 września 2024 wprowadzenie nowej serii modeli AI o nazwie OpenAI o1, zaprojektowanej tak, aby poświęcać więcej czasu na przemyślenie odpowiedzi. Modele te potrafią rozumować nad złożonymi zadaniami i rozwiązywać trudniejsze problemy niż wcześniejsze modele w dziedzinach nauki, kodowania i matematyki.
Pierwszy model z tej serii, o1-preview, jest już dostępny w ChatGPT i przez API OpenAI. Oferowana jest też lżejsza i tańsza wersja, nazwana OpenAI o1-mini, która zapewnia wydajne możliwości kodowania przy obniżonym koszcie o około 80% w porównaniu z o1-preview.
Rozwiązanie prostego mnożenia
./openai_poc.py "Quel est le résultat de 15 x 12 ?"
Wynik to 180.
Rozwiązanie prostej równania
./openai_poc.py "Résous l'équation 2x + 5 = 15."
Aby rozwiązać równanie , wykonaj następujące kroki:
- Odejmij 5 od obu stron równania, aby odizolować wyraz z niewiadomą:
- Podziel obie strony równania przez 2, aby rozwiązać dla :
Rozwiązanie: .
Obliczanie procentu
./openai_poc.py "Quel est 20% de 250 ?"
z to 50.
Obliczenia:
Obliczanie pola koła
./openai_poc.py "Calcule l'aire d'un cercle de rayon 5 cm."
Aby obliczyć pole koła o promieniu 5 cm, użyjemy wzoru na pole koła:
gdzie:
- to pole koła,
- to promień koła.
Podstawiając :
Zatem pole koła wynosi .
Jeśli chcesz wartość przybliżoną, przyjmując :
Tak więc pole koła wynosi w przybliżeniu 78,54 cm².
Obliczanie prostej całki
./openai_poc.py "Calcule l'intégrale de 0 à 1 de x^2 dx."
Aby obliczyć całkę od 0 do 1 funkcji , całkujemy względem i oceniamy wynik pomiędzy granicami 0 i 1.
Kroki obliczeń:
- Całkowanie funkcji :
gdzie C jest stałą całkowania.
- Ocena pomiędzy granicami 0 i 1:
- Obliczenia wartości na granicach:
- Odejmowanie wartości, aby uzyskać wynik końcowy:
Wniosek:
Wartość całki od 0 do 1 z wynosi .
Obliczanie średniej prędkości
./openai_poc.py "Si une voiture parcourt 150 km en 3 heures, quelle est sa vitesse moyenne ?"
Aby obliczyć średnią prędkość samochodu, który pokonuje 150 km w 3 godziny, używamy wzoru na prędkość średnią:
Podstawiając dane:
Średnia prędkość samochodu wynosi zatem 50 km/h.
Mechanika klasyczna
./openai_poc.py "Un bloc de 5 kg est tiré sur une surface sans frottement par une force de 20 N. Calcule son accélération."
Aby obliczyć przyspieszenie bloku, używamy drugiej zasady dynamiki Newtona, która mówi, że wypadkowa siła działająca na ciało równa się masie tego ciała pomnożonej przez przyspieszenie ().
Dane:
- Masa bloku,
- Przyłożona siła,
- Powierzchnia bez tarcia (czyli brak siły przeciwnej z tarcia)
Przekształcając wzór, aby rozwiązać dla przyspieszenia (), otrzymujemy:
Podstawiając wartości:
Odpowiedź: Przyspieszenie bloku wynosi 4 metry na sekundę do kwadratu ().
Rozwiązywanie równań różniczkowych
./openai_poc.py "Résous l'équation différentielle dy/dx = x^2 + y^2 avec la condition initiale y(0) = 1."
Aby rozwiązać równanie różniczkowe:
z warunkiem początkowym , zauważamy, że równanie to jest nieliniowe i nie można go rozwiązać za pomocą podstawowych metod takich jak separacja zmiennych czy standardowe czynniki całkujące. Możemy jednak spróbować przekształcić równanie do formy łatwiejszej do analizy.
Krok 1: Rozpoznanie typu równania
Podane równanie jest równaniem Riccatiego o ogólnej postaci:
W naszym przypadku ma postać:
Krok 2: Przekształcenie do liniowego równania drugiego rzędu
Aby rozwiązać równanie Riccatiego, można zastosować podstawienie:
gdzie jest funkcją do wyznaczenia, a oznacza pochodną względem .
Obliczenie w funkcji :
Stosujemy regułę różniczkowania ilorazu:
Krok 3: Podstawienie do równania początkowego
Podstawiamy i do oryginalnego równania:
Uprośćmy równanie:
Mnożymy obie strony przez , aby pozbyć się mianowników:
Uproszczenia:
Dzielimy przez (zakładając ):
Krok 4: Rozwiązanie liniowego równania drugiego rzędu
Otrzymujemy liniowe jednorodne równanie drugiego rzędu:
Jest to równanie różniczkowe liniowe z zmiennymi współczynnikami, znane jako zmodyfikowane równanie Airy. Rozwiązania tego równania nie są wyrażalne za pomocą funkcji elementarnych, lecz za pomocą funkcji specjalnych zwanych funkcjami Airy.
Rozwiązania ogólne:
Rozwiązania ogólne równania mają postać:
gdzie i to funkcje Airy pierwszego i drugiego rodzaju, a to jednostka urojona, dla której .
Krok 5: Powrót do
Przypomnijmy, że:
Znając , możemy znaleźć , obliczając pochodną i wykonując iloraz.
Krok 6: Zastosowanie warunku początkowego
Aby wyznaczyć stałe całkowania i , należy zastosować warunek początkowy . Jednak ze względu na złożoność funkcji Airy o argumentach zespolonych, wyprowadzenie jawnego rozwiązania jest skomplikowane.
Wniosek
Rozwiązanie równania różniczkowego
z warunkiem początkowym jest wyrażone za pomocą funkcji specjalnych (funkcji Airy) i nie da się go zapisać w postaci funkcji elementarnych.
Ostateczna odpowiedź:
Rozwiązanie równania różniczkowego z jest określone w sposób pośredni za pomocą funkcji Airy i nie może być zapisane explicite przy użyciu standardowych funkcji elementarnych.
Elektromagnetyzm
./openai_poc.py "Calcule le champ électrique à une distance r d'une charge ponctuelle Q."
Pole elektryczne wytwarzane przez ładunek punktowy w odległości jest dane prawem Coulomba. Wzór na pole elektryczne to:
gdzie:
- to pole elektryczne (w woltach na metr, V/m),
- to ładunek punktowy (w kulombach, C),
- to odległość od ładunku (w metrach, m),
- to przenikalność próżni, z wartością przybliżoną .
Przykład obliczeń:
Załóżmy, że mamy ładunek (2 mikroculomby) i chcemy obliczyć pole elektryczne w odległości .
- Oblicz stałą przed ułamkiem:
- Zastosuj wzór:
Wniosek:
Pole elektryczne w odległości od ładunku punktowego wynosi .
Tak więc, aby obliczyć pole elektryczne w określonej odległości od ładunku punktowego, użyj powyższego wzoru, podstawiając konkretne wartości i .
Równowaga chemiczna
./openai_poc.py "Explique comment le principe de Le Chatelier s'applique à l'équilibre suivant : N2 + 3H2 ⇌ 2NH3."
Zasada Le Chateliera mówi, że kiedy układ w stanie równowagi jest poddany zewnętrznej zmianie (zakłóceniu), układ reaguje w sposób minimalizujący to zakłócenie i dąży do ustanowienia nowej równowagi. Zastosowana do reakcji równowagi:
można przeanalizować, jak różne zmiany wpływają na położenie równowagi.
1. Zmiana stężenia: - Zwiększenie stężenia reagentów (N₂ lub H₂) : Jeśli do układu dodamy azot (N₂) lub wodór (H₂), stężenie tych reagentów wzrośnie. Zgodnie z zasadą Le Chateliera, równowaga przesunie się w kierunku zużywającym dodatkowe reagentów, czyli w prawo, sprzyjając tworzeniu amoniaku (NH₃).
-
Zmniejszenie stężenia produktów (NH₃) : Jeśli usuniemy amoniak z układu, stężenie NH₃ zmaleje. Równowaga przesunie się wtedy w prawo, aby skompensować to zmniejszenie, ponownie sprzyjając tworzeniu amoniaku.
-
Zwiększenie stężenia produktów (NH₃) : Jeśli dodamy amoniak do układu, równowaga przesunie się w lewo, aby zmniejszyć nadmiar NH₃, sprzyjając tworzeniu N₂ i H₂.
2. Zmiana ciśnienia :
-
Zwiększenie całkowitego ciśnienia układu : Dla gazów zwiększenie ciśnienia (przez zmniejszenie objętości) sprzyja reakcji, która produkuje najmniej moli gazowych. W tej reakcji przechodzimy od 4 moli gazów (1 N₂ + 3 H₂) do 2 moli gazów (2 NH₃). Zatem zwiększenie ciśnienia przesuwa równowagę w prawo, sprzyjając tworzeniu amoniaku.
-
Zmniejszenie całkowitego ciśnienia układu : Odwrotnie, zmniejszenie ciśnienia będzie sprzyjać reakcji produkującej najwięcej moli gazowych, przesuwając równowagę w lewo i sprzyjając dysocjacji NH₃ do N₂ i H₂.
3. Zmiana temperatury :
-
Egzotermiczny charakter reakcji : Synteza amoniaku jest reakcją egzotermiczną (), czyli wydziela ciepło.
-
Zwiększenie temperatury : Zwiększając temperaturę dostarczamy ciepło do układu. Zgodnie z zasadą Le Chateliera, równowaga przesunie się w kierunku pochłaniającym to dodatkowe ciepło, czyli w lewo (reakcja endotermiczna), sprzyjając dysocjacji NH₃ do N₂ i H₂.
-
Zmniejszenie temperatury : Obniżając temperaturę, układ reaguje przez wytwarzanie ciepła, aby skompensować jego utratę. Równowaga przesunie się więc w prawo (reakcja egzotermiczna), sprzyjając tworzeniu amoniaku.
4. Obecność katalizatora :
- Wpływ katalizatora : Dodanie katalizatora (takiego jak drobno podzielone żelazo z promotorami) zwiększa szybkość osiągnięcia równowagi, ale nie zmienia położenia równowagi. Przyspiesza zarówno reakcję prostą, jak i odwrotną w równym stopniu.
Podsumowanie :
Zasada Le Chateliera pozwala przewidzieć kierunek, w którym przesunie się równowaga chemiczna w odpowiedzi na zmianę warunków układu. Dla syntezy amoniaku:
- Wysokie ciśnienie sprzyja tworzeniu NH₃ (mniej moli gazowych).
- Niska temperatura sprzyja tworzeniu NH₃ (reakcja egzotermiczna).
- Zwiększenie stężeń N₂ lub H₂ sprzyja tworzeniu NH₃.
- Usuwanie NH₃ z układu sprzyja tworzeniu większej ilości NH₃.
Zasady te są stosowane w procesie Habera-Boscha w celu optymalizacji przemysłowej produkcji amoniaku.
Wnioski
Ten skrypt Pythona oferuje praktyczną integrację modelu OpenAI o1-preview, umożliwiając wykorzystanie jego zaawansowanych zdolności rozumowania do szerokiego zakresu pytań, od najprostszych po najbardziej złożone. Niezależnie od tego, czy jesteś ciekawskim początkującym, czy ekspertem chcącym przetestować granice modelu, ten skrypt jest przydatnym narzędziem dla Twoich projektów w dziedzinie sztucznej inteligencji.
Zasoby
- Ogłoszenie modelu OpenAI o1-preview
- Oficjalna dokumentacja API OpenAI
- Dokumentacja Selenium
- Dokumentacja pylatexenc
- Przewodnik po środowiskach wirtualnych w Pythonie
Ten dokument został przetłumaczony z wersji fr na język pl przy użyciu modelu gpt-5-mini. Aby uzyskać więcej informacji na temat procesu tłumaczenia, zobacz https://gitlab.com/jls42/ai-powered-markdown-translator