新しい OpenAI o1-preview モデルを Python スクリプトに組み込み、あなたの人工知能プロジェクトを強化する方法を紹介します。このスクリプトは、o1-preview モデルを使って OpenAI API と対話し、web スクレイピング機能でプロンプトにウェブコンテンツを含めることができます。さらに、モデルの応答に含まれる数学式(LaTeX)をターミナルで読みやすい Unicode テキストに変換して適切に処理します。
はじめに
2024年9月12日、OpenAI は新しい AI モデルシリーズである OpenAI o1 を発表しました。これらのモデルは、回答を出す前に深い推論を行うよう設計されており、科学、コーディング、数学における複雑な問題を解決することができます。特に o1-preview モデルはこれらの領域で優れており、従来の gpt-4o のようなモデルを上回る性能を発揮します。
スクリプトの主なポイント:
- o1-preview モデルの統合:スクリプトはデフォルトで o1-preview モデルを使用し、高度な推論能力を提供します。
- 統合された web スクレイピング:プロンプトの文脈を豊かにするためにウェブページの内容を抽出できます。
- LaTeX 式の処理:応答中の数式を Unicode テキストに変換し、ターミナルで読みやすくします。
- カスタマイズ可能: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:web スクレイピングを行うため。
- pylatexenc:LaTeX 表現を読みやすい Unicode テキストに変換するため。
関数 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 表現を Unicode テキストに変換します。
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 式の検出:正規表現を使って数式を特定します。
- 変換:各式を Unicode テキストに変換します。
- 置換:元の LaTeX 式を読みやすい表現に置き換えます。
関数 get_response
この関数はプロンプトを準備し、必要に応じて web スクレイピングを行い、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 を引きます:
- x を求めるために両辺を 2 で割ります:
解: .
パーセンテージを計算する
./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 ?"
3時間で 150 km を走行する車の平均速度を計算するには、平均速度の公式を使います:
与えられた値を代入すると:
したがって、この車の平均速度は 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."
ブロックの加速度を計算するには、ニュートンの第二法則を使います。これは物体に作用する合力がその質量と加速度の積に等しいことを示します()。
与えられた値:
- ブロックの質量
- 加えられた力
- 摩擦がない(摩擦力はゼロ)
加速度 を求めるために式を変形すると:
値を代入すると:
答え: ブロックの加速度は です。
微分方程式の解法
./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種の Airy 関数、 は虚数単位です。
ステップ 5: へ戻す
元の置換を思い出すと:
がわかれば、その導関数を計算して を求めることができます。
ステップ 6:初期条件の適用
積分定数 と を決めるには初期条件 を使います。ただし、複素引数を持つ Airy 関数を扱うため、具体的な解析計算は複雑になります。
結論
与えられた微分方程式 、初期条件 の解は Airy 関数を含む特殊関数で表され、基本的な初等関数では表現できません。
最終的な答え:
与えられた微分方程式の解は Airy 関数を用いて暗黙的に与えられ、初等関数では表せません。
電磁気学
./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."
ル・シャトリエの原理は、平衡状態にある系に外部から変化(ストレス)が加えられると、系はその変化を最小化する方向に反応して新たな平衡を確立する、というものです。次の化学平衡に適用すると:
様々な変化が平衡の位置にどのように影響するかを解析できます。
1. 濃度の変化: - 反応物(N₂またはH₂)の濃度増加: システムに窒素(N₂)や水素(H₂)を追加すると、これら反応物の濃度が増加します。ル・シャトリエの原理に従い、平衡は余分な反応物を消費する方向、すなわち右方向へ移動し、アンモニア(NH₃)の生成を促進します。
-
生成物(NH₃)の濃度減少: システムからアンモニアを除去すると、NH₃の濃度が減少します。平衡はこの減少を補償するために右方向へ移動し、再びアンモニアの生成を促進します。
-
生成物(NH₃)の濃度増加: システムにアンモニアを追加すると、平衡は過剰なNH₃を減らすために左方向へ移動し、N₂およびH₂の生成を促進します。
2. 圧力の変化:
-
系の全圧増加: 気体に対して圧力を増加させる(体積を減少させる)と、気体のモル数が少ない反応が有利になります。この反応では、4モルの気体(1 N₂ + 3 H₂)から2モルの気体(2 NH₃)へと変化します。したがって、圧力の増加は平衡を右方向へ移動させ、アンモニアの生成を有利にします。
-
系の全圧減少: 逆に、圧力の減少はより多くの気体モル数を生成する反応を有利にし、平衡を左方向へ移動させ、NH₃の解離(N₂とH₂への分解)を促進します。
3. 温度の変化:
-
反応の発熱性: アンモニア合成は発熱反応であり()、熱を放出します。
-
温度上昇: 温度を上げると系に熱が供給されます。ル・シャトリエの原理により、平衡はこの追加された熱を吸収する方向、すなわち左方向(吸熱反応)へ移動し、NH₃の分解を促進します。
-
温度低下: 温度を下げると系は熱を生成してこの損失を補おうとします。したがって平衡は右方向(発熱反応)へ移動し、アンモニアの生成を促進します。
4. 触媒の存在:
- 触媒の効果: 鉄の微粉(促進剤を伴うものなど)のような触媒を加えると、平衡に達する速度は増加しますが、平衡位置自体は変わりません。触媒は正反応と逆反応の両方を等しく加速します。
要約:
ル・シャトリエの原理は、系の条件が変化したときに化学平衡がどの方向に移動するかを予測する手助けをします。アンモニア合成については:
- 高圧 はNH₃の生成を有利にする(気体モル数が少ないため)。
- 低温 はNH₃の生成を有利にする(発熱反応であるため)。
- N₂またはH₂の濃度増加 はNH₃の生成を有利にする。
- NH₃の除去 はより多くのNH₃生成を促進する。
これらの原理はハーバー・ボッシュ法で工業的アンモニア生産を最適化するために適用されています。
結論
この Python スクリプトは、OpenAI o1-preview モデルの統合を実用的に提供し、単純な質問から複雑な問いまで広範な問題に対する高度な推論能力を活用できます。初心者の好奇心を満たす場合でも、モデルの限界を試したい専門家の場合でも、このスクリプトはAIプロジェクトにとって便利なツールです。
参考資料
- OpenAI o1-preview モデルの発表
- OpenAI API 公式ドキュメント
- Selenium のドキュメント
- pylatexenc のドキュメント
- Python 仮想環境(venv)ガイド
この文書は fr 版から ja 言語へ gpt-5-mini モデルを使用して翻訳されました。翻訳プロセスの詳細については https://gitlab.com/jls42/ai-powered-markdown-translator をご覧ください