새로운 OpenAI o1-preview 모델을 Python 스크립트에 통합해 인공지능 프로젝트를 강화하는 방법을 알아봅니다. 이 스크립트는 o1-preview 모델을 사용해 OpenAI API와 상호작용할 수 있으며, 웹 스크래핑 기능을 통해 프롬프트에 웹 콘텐츠를 포함시킬 수 있습니다. 또한 모델 응답에 포함된 LaTeX 수식을 터미널에서 읽기 쉬운 유니코드 텍스트로 변환하여 올바르게 처리합니다.
소개
2024년 9월 12일, OpenAI는 OpenAI o1이라는 새로운 모델 계열을 출시했습니다. 이 모델들은 답변을 제공하기 전에 심층적인 추론을 수행하도록 설계되어 과학, 코딩, 수학 등 복잡한 문제를 해결하는 데 강점을 보입니다. 특히 o1-preview 모델은 이러한 영역에서 우수한 성능을 보이며 이전 모델들(gpt-4o 등)을 능가합니다.
스크립트의 핵심 포인트:
- o1-preview 모델 통합 : 스크립트는 기본적으로 o1-preview 모델을 사용하여 고급 추론 능력을 제공합니다.
- 내장 웹 스크래핑 : 프롬프트의 컨텍스트를 풍부하게 하기 위해 웹 페이지의 내용을 추출할 수 있습니다.
- LaTeX 수식 처리 : 응답에 포함된 수학 표현을 터미널에서 읽을 수 있는 유니코드 텍스트로 변환합니다.
- 커스터마이즈 가능 : OpenAI 모델을 선택할 수 있으며 다양한 사용 사례에 맞게 조정할 수 있습니다.
이 글에서는 스크립트 코드를 자세히 설명하고 동작 방식을 해설하며, 여러 복잡한 프롬프트 예시를 실행해 보겠습니다.
사전 요구사항
시작하기 전에 다음 항목을 준비하세요:
- 머신에 설치된 Python 3.x
- OpenAI API 키 (OpenAI 웹사이트에서 발급)
- Python 가상 환경(의존성 격리를 위해 권장)
- 필요한 Python 모듈들
가상 환경 구성
이 프로젝트의 의존성을 격리하기 위해 가상 환경을 사용하는 것을 권장합니다. 다음은 가상 환경을 만들고 필요한 의존성을 설치하는 방법입니다:
python3 -m venv env
source env/bin/activate # Sur Windows, utilisez env\Scripts\activate
pip install openai selenium webdriver-manager pylatexenc
OpenAI API 키 설정
OpenAI API 키를 환경 변수로 설정하세요:
export OPENAI_API_KEY='votre_clé_api_ici'
실제 API 키로 'votre_clé_api_ici'를 교체하세요.
전체 스크립트 코드
다음은 Python 스크립트의 전체 코드입니다:
#!/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()
코드 설명
필요한 모듈 가져오기
스크립트는 다음 핵심 모듈들을 임포트하며 시작합니다:
- os, sys, argparse, re : 환경 변수, 커맨드라인 인자 및 정규식 처리를 위한 표준 모듈들입니다.
- openai : OpenAI API와 상호작용하기 위한 모듈입니다.
- selenium 및 webdriver_manager : 웹 스크래핑을 수행하기 위해 사용합니다.
- pylatexenc : LaTeX 표현식을 읽기 쉬운 유니코드 텍스트로 변환하기 위해 사용합니다.
함수 get_web_content
이 함수는 웹 페이지의 텍스트 콘텐츠를 가져옵니다.
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
핵심 포인트:
- Chrome 옵션 : 일부 페이지는 헤드리스 모드에서 인간 확인을 요구할 수 있어 헤드리스 모드를 사용하지 않습니다.
- ChromeDriverManager : ChromeDriver의 자동 설치 및 업데이트를 담당합니다.
- 콘텐츠 추출 : 페이지 전체 텍스트를 추출하기 위해 JavaScript를 사용합니다.
- 예외 처리 : 오류 발생 시 함수는
None를 반환합니다.
함수 convert_latex_to_text
이 함수는 LaTeX 표현식을 유니코드 텍스트로 변환합니다.
def convert_latex_to_text(latex_str):
# Convertit les expressions LaTeX en texte Unicode
return LatexNodes2Text().latex_to_text(latex_str)
핵심 포인트:
- LaTeX 표현식을 변환하기 위해
pylatexenc라이브러리를 사용합니다. 이를 통해 수식이 터미널에서 읽기 쉬운 형태가 됩니다.
함수 clean_output
이 함수는 모델의 응답을 처리하여 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
핵심 포인트:
- LaTeX 식 탐지 : 정규식을 사용해 수식을 식별합니다.
- 변환 : 각 수식을 유니코드 텍스트로 변환합니다.
- 대체 : LaTeX 수식을 읽기 쉬운 형태로 교체합니다.
함수 get_response
프롬프트를 준비하고, 필요 시 웹 스크래핑을 수행하며 OpenAI API를 호출하고 응답을 정리합니다.
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}"
핵심 포인트:
- URL 처리 : 프롬프트에 URL이 포함되어 있으면 해당 콘텐츠를 추출해 삽입합니다.
- OpenAI API 호출 : 수정된 프롬프트를 지정된 모델로 전송합니다.
- 응답 정리 : LaTeX 표현식을 읽기 쉬운 형태로 변환합니다.
함수 main
커맨드라인 인자를 처리하고 스크립트를 실행합니다.
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)
핵심 포인트:
- 인자 : 스크립트는 프롬프트와 모델을 인자로 받습니다.
- API 키 : API 키가 설정되어 있는지 검사합니다.
- 실행 :
get_response함수를 호출하고 응답을 출력합니다.
스크립트 실행
if __name__ == "__main__":
main()
사용 예시
추론이 필요한 질문하기
./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."
직각삼각형에서 직각을 사이에 둔 두 변의 길이가 각각 3 cm와 4 cm일 때 빗변의 길이를 피타고라스 정리를 이용해 계산합니다:
주어진 값을 대입하면:
양변의 제곱근을 취하면:
따라서 빗변의 길이는 5 cm입니다.
빗변의 길이는 5 cm입니다.
웹 페이지 요약 생성
./openai_poc.py "Fais-moi un résumé de cette page : https://openai.com/index/introducing-openai-o1-preview/"
OpenAI는 2024년 9월 12일, 응답하기 전에 더 많은 시간을 들여 추론하도록 설계된 새로운 AI 모델 계열 OpenAI o1을 발표했습니다. 이 모델들은 복잡한 과제를 통해 추론할 수 있으며 과학, 코딩, 수학 분야에서 이전 모델들보다 더 어려운 문제를 해결할 수 있습니다.
이 계열의 첫 모델인 o1-preview는 이제 ChatGPT와 OpenAI API를 통해 사용할 수 있습니다. 더 경량화되고 비용 효율적인 버전인 OpenAI o1-mini도 제공되며, o1-preview에 비해 약 80% 저렴한 비용으로 코딩 능력을 제공합니다.
간단한 곱셈 해결
./openai_poc.py "Quel est le résultat de 15 x 12 ?"
의 결과는 180입니다.
간단한 방정식 풀기
./openai_poc.py "Résous l'équation 2x + 5 = 15."
방정식 를 풀려면 다음 단계를 따르세요:
- 양변에서 5를 빼서 변수 항을 고립시킵니다.
- 양변을 2로 나누어 x를 구합니다.
해답 : .
백분율 계산
./openai_poc.py "Quel est 20% de 250 ?"
의 는 50입니다.
계산 :
원의 넓이 계산
./openai_poc.py "Calcule l'aire d'un cercle de rayon 5 cm."
반지름이 5 cm인 원의 넓이를 계산하려면 원 넓이 공식을 사용합니다:
여기서:
- 는 원의 넓이,
- 는 원의 반지름입니다.
에 5 cm를 대입하면:
따라서 원의 넓이는 ****입니다.
근사값을 원하시면, 을 사용하여:
따라서 원의 넓이는 대략 78,54 cm²입니다.
간단한 적분 계산
./openai_poc.py "Calcule l'intégrale de 0 à 1 de x^2 dx."
함수 의 0에서 1까지의 적분을 계산하려면 를 에 대해 적분하고 얻은 식을 0과 1 사이에서 평가합니다.
계산 단계:
- 함수 의 적분:
여기서 C는 적분 상수입니다.
- 구간별 평가:
- 경계값 계산:
- 값을 빼서 최종 결과 도출:
결론 :
에서 까지의 값은 ****입니다.
평균 속도 계산
./openai_poc.py "Si une voiture parcourt 150 km en 3 heures, quelle est sa vitesse moyenne ?"
150 km를 3시간에 주행한 자동차의 평균 속도는 평균 속도 공식을 사용합니다:
주어진 값을 적용하면:
따라서 자동차의 평균 속도는 50 km/h입니다.
고전 역학
./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."
블록의 가속도를 계산하기 위해 뉴턴의 제2법칙을 사용합니다. 이 법칙은 물체에 작용하는 총 힘이 물체의 질량과 가속도의 곱과 같다고 말합니다 ().
주어진 값:
- 블록의 질량,
- 가해진 힘,
- 마찰이 없는 표면 (따라서 마찰력은 없음)
가속도 에 대해 식을 정리하면:
값을 대입하면:
답변 : 블록의 가속도는 입니다.
미분방정식 풀이
./openai_poc.py "Résous l'équation différentielle dy/dx = x^2 + y^2 avec la condition initiale y(0) = 1."
다음 미분방정식을 풉니다:
초기조건 이 주어졌을 때, 이 방정식은 비선형이므로 변수 분리나 표준 적분 인자법으로는 풀기 어렵습니다. 다만 형태를 변환해 풀 수 있습니다.
단계 1 : 방정식의 성질 인식
주어진 방정식은 일반적인 리카티(Riccati) 방정식의 형태입니다:
여기서는 다음과 같습니다:
단계 2 : 2차 선형 방정식으로 변환
리카티 방정식을 풀기 위해 다음 치환을 사용할 수 있습니다:
여기서 이고 는 의 도함수입니다.
를 로 표현하면:
몫의 미분 법칙을 적용하면:
단계 3 : 원래 방정식에 대입
와 를 원래 방정식에 대입하면:
식을 정리하면:
양변에 를 곱해 분모를 제거하면:
정리하면:
이라고 가정하고 로 나누면:
단계 4 : 2차 선형 방정식 풀이
다음과 같은 2차 선형 동차 방정식을 얻습니다:
이 방정식은 계수가 변수에 따라 달라지는 2차 선형 방정식으로, 수정된 에어리(Airy) 형식으로 알려져 있습니다. 이 방정식의 해는 초등함수로 표현되지 않으며 특수 함수로 주어집니다.
해의 형태:
여기서 와 는 에어리 함수(1종 및 2종), 는 허수 단위입니다 ().
단계 5 : 로 되돌아가기
기억하세요:
를 알면 의 도함수를 계산하고 이를 이용해 를 구할 수 있습니다.
단계 6 : 초기조건 적용
적분 상수 , 를 결정하려면 초기조건 을 적용해야 합니다. 다만 에어리 함수에 복소수 인자가 포함되어 있어 정확한 계산은 복잡합니다.
결론
초기조건 을 가진 방정식 의 해는 에어리 함수 등 특수 함수로 표현되며 초등함수로 명시적으로 나타낼 수 없습니다.
전자기학
./openai_poc.py "Calcule le champ électrique à une distance r d'une charge ponctuelle Q."
점전하 로부터 거리 에 생성되는 전기장 는 쿨롱 법칙으로 주어집니다. 전기장 계산식은 다음과 같습니다:
여기서:
- 는 전기장(단위: 볼트/미터, V/m),
- 는 점전하(단위: 쿨롱, C),
- 는 전하로부터의 거리(단위: 미터, m),
- 는 진공 유전율로 약 입니다.
계산 예시:
(2 마이크로쿨롱)인 전하에서 거리에서의 전기장을 계산한다고 가정합니다.
- 분수 앞의 상수 계산:
- 공식 적용:
결론 :
점전하 에서 거리 에 대한 전기장은 입니다.
따라서 점전하로부터 특정 거리에서 전기장을 계산하려면 위 공식을 사용해 와 값을 대입하세요.
화학적 평형
./openai_poc.py "Explique comment le principe de Le Chatelier s'applique à l'équilibre suivant : N2 + 3H2 ⇌ 2NH3."
르샤틀리에 원리는 평형 상태인 시스템에 외부 교란(stress)이 가해지면 시스템이 그 교란을 최소화하도록 반응하여 새로운 평형을 이루려 한다고 설명합니다. 다음 평형 반응에 적용해 보겠습니다:
이 반응에서 다양한 변화가 평형 위치에 어떤 영향을 미치는지 분석할 수 있습니다.
1. 농도 변화 : - 반응물(N₂ 또는 H₂) 농도 증가 : 질소(N₂) 또는 수소(H₂)를 계에 추가하면 이들 반응물의 농도가 증가한다. 르샤틀리에의 원리에 따르면 평형은 이러한 추가 반응물을 소비하는 방향, 즉 오른쪽으로 이동하여 암모니아(NH₃)의 생성을 촉진한다.
-
생성물(NH₃) 농도 감소 : 계에서 암모니아를 제거하면 NH₃ 농도가 감소한다. 평형은 이 감소를 보상하기 위해 오른쪽으로 이동하여 다시 암모니아 생성을 촉진한다.
-
생성물(NH₃) 농도 증가 : 계에 암모니아를 추가하면 평형은 과량의 NH₃를 줄이기 위해 왼쪽으로 이동하여 N₂와 H₂의 형성을 촉진한다.
2. 압력 변화 :
-
계의 전체 압력 증가 : 기체의 경우 압력 증가(부피 감소)는 기체 몰 수가 더 적은 반응을 유리하게 한다. 이 반응에서는 4몰의 기체(1 N₂ + 3 H₂)에서 2몰의 기체(2 NH₃)로 가므로, 압력 증가 시 평형은 오른쪽으로 이동하여 암모니아 생성이 촉진된다.
-
계의 전체 압력 감소 : 반대로 압력이 감소하면 기체 몰 수가 더 많은 반응이 유리해져 평형은 왼쪽으로 이동하고 NH₃의 분해(NH₃ → N₂ + H₂)가 촉진된다.
3. 온도 변화 :
-
반응의 발열성 : 암모니아 합성은 발열 반응()으로, 열을 방출한다.
-
온도 상승 : 온도를 올리면 계에 열을 공급하는 것이므로 르샤틀리에의 원리에 따라 이 추가 열을 흡수하는 방향, 즉 왼쪽(흡열 반응)으로 평형이 이동하여 NH₃의 분해를 촉진한다.
-
온도 하강 : 온도를 낮추면 계는 이 열 손실을 보상하기 위해 열을 생성하려 하고, 따라서 평형은 오른쪽(발열 반응)으로 이동하여 암모니아 형성이 촉진된다.
4. 촉매의 존재 :
- 촉매의 영향 : 촉매(예: 미세하게 분쇄된 철과 프로모터)의 첨가는 평형에 도달하는 속도를 높이지만 평형의 위치 자체는 변경하지 않는다. 촉매는 정반응과 역반응을 동일한 비율로 가속화한다.
요약 :
르샤틀리에의 원리는 계의 조건 변화에 따라 화학 평형이 어느 방향으로 이동하는지를 예측할 수 있게 해준다. 암모니아 합성에 대해:
- 높은 압력은 NH₃ 형성을 촉진한다(기체 몰 수가 적음).
- 낮은 온도는 NH₃ 형성을 촉진한다(발열 반응).
- N₂ 또는 H₂ 농도 증가는 NH₃ 형성을 촉진한다.
- NH₃ 제거는 계에서 더 많은 NH₃ 형성을 촉진한다.
이러한 원리는 하버-보쉬 공정에서 산업적 암모니아 생산을 최적화하는 데 적용된다.
결론
이 Python 스크립트는 모델 OpenAI o1-preview의 통합을 실용적으로 제공하여 단순한 질문부터 복잡한 문제까지 모델의 고급 추론 능력을 활용할 수 있게 해준다. 초보자의 호기심을 충족시키든 모델의 한계를 시험하고자 하는 전문가이든, 이 스크립트는 인공지능 프로젝트에 유용한 도구이다.
참고 자료
이 문서는 gpt-5-mini 모델을 사용하여 fr 버전에서 ko 언어로 번역되었습니다. 번역 과정에 대한 자세한 정보는 https://gitlab.com/jls42/ai-powered-markdown-translator 를 참조하십시오.