PythonでChatGPTをAPIで操作してみました。
簡単にできるかと思っていたのですが、OpenAIのライブラリが新しくなって間もないのか?英語の苦手な秋田にとっては情報が少なくて・・・まる1日使っちゃいました・・・
結果、出来たのでよしとします。
そんなもん ChatGPTに書かせりゃいいじゃん
ChatGPTはプログラムをいい感じで書いてくれるので、Pythonコードなんて簡単に書いてくれるはず。
確かに簡単に書いてくれたのですが、どうやら openai のバージョンが新しくなったようで、いくらやってもエラー。結構泣きました・・・
ChatGPTは情報が最新じゃないので、古いopenai のコードを書いてくれていて・・・なかなかそれに気づけなかった。自分の所くらいは最新の情報にアップデートしておいてほしかったなぁ〜
色々とやってとりあえずやりたい事ができるようになったので、備忘録も兼ねてブログに書き残しておきます。
やりたかった事
やりたかった事は、ある URLを読み込んでその内容を元に答えを返す。
上記しましたが、ChatGPTは最新の事やChatGPTが知らない事は知らない。たとえば今日のニュースや天気は知らないのです。
ある会社のドキュメントやマニュアルを読み込んで、そのFAQを作ったり要約をしたり出来たらとっても便利。まあ、これ自体はChatGPTにプラグイン「Link Reader」ってプラグインを入ればできるのですが、これを APIでやりたい。
最終的にはチャットボットの AI 版みたいなのが出来たらいいなぁ〜って
今回の環境
今回の秋田の環境です。openai:1.14.1 ってのが悩ましかった・・・
PC:MacBook Air
OS:Ventura 13.2.1
Python:3.12.2
openai:1.14.1
PCのセットアップとかは「ChatGPT API 環境構築」あたりでググったり ChatGPT に聞いちゃってください。
プログラム
Python そのものをあまりいじったことがないので、間違っていたらごめんなさい。
ソース
from openai import OpenAI
import requests
from bs4 import BeautifulSoup
def extract_text(html_content):
"""HTMLコンテンツからテキストを抽出する"""
soup = BeautifulSoup(html_content, 'html.parser')
text = soup.get_text(separator=' ', strip=True)
text = text.replace('\xa9', '')
text = text.replace('\xb7', '')
return text
def fetch_web_page_content(url):
"""指定されたURLのWebページの内容を取得する"""
response = requests.get(url)
if response.status_code == 200:
return response.text
else:
print(f"Error fetching the web page: {response.status_code}")
return None
url = "https://news.yahoo.co.jp/"
html_content = fetch_web_page_content(url)
if html_content:
text = extract_text(html_content)
else:
print("Failed to fetch web page content.")
client = OpenAI()
res = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "あなたは日本の有名なアナウンサーです"}, # 役割(省略可)
{"role": "assistant", "content": text}, #URLのテキストを読ませる
{"role": "user", "content": "この記事を要約してください"}, #質問内容
],
)
print(res.choices[0].message.content) # 答えが返る
これを chatgpttest.py として保存。
解説してみます
呼び方の作法があまりわかっていないので、これでいいかどうか?わからないですが、必要なライブラリをインポートしてます。
from openai import OpenAI
import requests
from bs4 import BeautifulSoup
取得してきたHTMLをテキストだけに変換。
def extract_text(html_content):
"""HTMLコンテンツからテキストを抽出する"""
soup = BeautifulSoup(html_content, 'html.parser')
text = soup.get_text(separator=' ', strip=True)
text = text.replace('\xa9', '')
text = text.replace('\xb7', '')
return text
この辺りは、ターミナルで文字を表示する時にうまく処理できないって言われたので変換してます。ターミナルでなければ問題ないのかも。ここはまだよく理解できてません。
text = text.replace('\xa9', '')
text = text.replace('\xb7', '')
URLから情報を取得してくる関数です。
def fetch_web_page_content(url):
"""指定されたURLのWebページの内容を取得する"""
response = requests.get(url)
if response.status_code == 200:
return response.text
else:
print(f"Error fetching the web page: {response.status_code}")
return None
URLを指定して、関数「fetch_web_page_content」で内容を取得しています。
url = "https://news.yahoo.co.jp/"
html_content = fetch_web_page_content(url)
取得してきた情報を関数「extract_text」にて文字だけにしています。
if html_content:
text = extract_text(html_content)
else:
print("Failed to fetch web page content.")
openai の api key を環境変数に入れたので、ここで上手いこと処理をしてくれているはずです。
client = OpenAI()
ここがキモ。「client.chat.completions.create」これにたどり着くまで時間がかかりました。
「client.chat.completions.create」で ChatGPT と会話をします。
利用するモデルは「gpt-3.5-turbo」利用料が安いので、これにしています。4 とかを使うともっと賢く答えてくれるはずです。
messages に渡すデータは
ここがとっても参考になりました。ありがとうございます。感謝。
res = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "あなたは日本の有名なアナウンサーです"}, # 役割(省略可)
{"role": "assistant", "content": text}, #URLのテキストを読ませる
{"role": "user", "content": "この記事を要約してください"}, #質問内容
],
)
ここで ChatGPT からの返事を表示させてます。
print(res.choices[0].message.content) # 答えが返る
実際に動かしてみると
$ python3 chatgpttest.py
記事の要約:大リーグの選手である大谷翔平の妻である真美子夫人が野球の試合を生で観戦し、その様子が話題となっています。真美子夫人は左手薬指に光る指輪を身に着けており、その指輪が注目を集めています。また、真美子夫人の過去についての情報や友人に関するネット上の議論も活発化しています。
こんな感じ。
まとめ
ここから色々と手を加えて、ブラウザから動かせるようにしたら色々とアイデア膨らみます。
注意しなきゃいけないのは、利用料。日本語でのやりとりは結構お金かかる感じがします。お金がかかるポイントは
・こちらから取得してきたテキストを送る時
・質問を送る時
・答えが返された時
になるので、取得してきたテキストをなるべくするなくしたりする努力が必要。また、毎回同じアドレスの情報を取りにいくとレスポンスが悪くなるので、その辺りの処理をしたりとか・・・
考えると結構やる事ありますね。
とりあえずここまでできたので、これからどうするか?じっくり考えてみたいと思います。
このブログがどなたかの参考になれば幸いです。
追伸:いくつか参考にさせていただいたサイトがあります。ありがとうございました。