なんか日本語おかしいよ。
ChatGPTに添削してもらおう。
“修正前”: “今日はChatGPTのAPI使用して記事添削するブログ記事を書くので結果の内容を共有しようと思っているます。。”,
“修正後”: “今日はChatGPTのAPIを使用して記事を添削するブログ記事を書き、その結果を共有しようと思います。”
上記のように極端でなくとも、文章の違和感は自分では気が付かない場合も多々あります。
その解決方法として、ChatGPTのAPIを使って、添削処理を実装してみました。
本記事では、処理の流れと実装方法などについてご紹介します。
Contents
処理の流れ
大まかな処理の流れは以下です。
- Pythonコードの実行
- 添削したい記事のURLの入力
- URLからHTMLを呼び出し、本文を抽出
- ChatGPTが本文を添削して、応答
実際にブログ記事を添削してみた
実際に自身のブログ記事を添削してみました。
まず初めに、「【Alexaスキル】HOT PEPPERのAPIを呼び出して、おすすめの店をAmazon SNSでメール送信してみた。」というブログ内容を添削してみます。
以下のような添削結果となりました。
- “修正前”: “くれとむBlog AWS2024.03.172024.03.18 ※当サイトは、アフィリエイト広告を利用しています。”,
“修正後”: “くれとむBlog AWS 2024.03.17 – 2024.03.18 ※当サイトは、アフィリエイト広告を利用しています。” - “修正前”: “Lambdaで呼び出す環境変数は、Lambda関数の画面の「設定」→「「環境変数」から登録します。”,
“修正後”: “Lambdaで呼び出す環境変数は、Lambda関数の画面の「設定」→「環境変数」から登録します。” - “修正前”: “osコマンドを使用して、HOT PEPPERのAPIキーを環境変数を呼び出します。”,
“修正後”: “osコマンドを使用して、HOT PEPPERのAPIキーを含む環境変数を呼び出します。” - “修正前”: “アレクサのカスタムスキルとは、自身が実装した処理に従ってアレクサが応答を返してくれるというものです。”,
“修正後”: “アレクサのカスタムスキルとは、開発者が実装した処理に従ってアレクサが応答を返す機能です。” - “修正前”: “Lambda関数画面の「設定」→「アクセス権限」から実行ロール名をコピーします。”,
“修正後”: “Lambda関数の「設定」→「アクセス権限」から、実行ロール名をコピーします。” - “修正前”: “また今回は、地名とジャンルのみで店の検索を行いましたが、HOT PEPPERのAPIには他にも様々な機能があるようなので、さらに上手な活用方法も考えてみようかと思みたいと思います。”,
“修正後”: “また今回は、地名とジャンルのみで店の検索を行いましたが、HOT PEPPERのAPIには他にも多くの機能があり、これらをさらに上手く活用する方法も探求していきたいと思います。”
“修正前”: “osコマンドを使用して、HOT PEPPERのAPIキーを環境変数を呼び出します。”,
“修正後”: “osコマンドを使用して、HOT PEPPERのAPIキーを含む環境変数を呼び出します。”
上記のように違和感のある日本語が添削できてるね。
次に「【ずんだもんが喋る】アレクサとChatGPTとVOICEVOXを連携してみた【カスタムスキル】」というのブログを添削してみました。
添削した結果が以下です。
- “修正前”: “くれとむBlog AWS2023.05.272024.03.28”,
“修正後”: “くれとむBlog AWS 更新日: 2023.05.27 – 2024.03.28” - “修正前”: “前回アレクサとChatGPTを繋げてたけど、声が機械的すぎてイマイチ会話に感情がこもらないんだよね。”,
“修正後”: “前回は、アレクサとChatGPTを接続したのですが、声が機械的過ぎて、会話に感情がこもらなかったのです。” - “修正前”: “VOICEVOXって何なの?”,
“修正後”: “「VOICEVOXって何?」と思うかもしれませんね。” - “修正前”: “Alexaのカスタムスキルを作成し、アレクサとChatGPTとVOICEVOXを連携してみました。”,
“修正後”: “そこで、Alexaのカスタムスキルを作成し、Alexa、ChatGPT、VOICEVOXを連携させてみました。” - “修正前”: “主な構成要素は以下のとおりです。”,
“修正後”: “このプロジェクトの主な構成要素を以下に示します。” - “修正前”: “Lambdaのコンソール画面から、レイヤーを選択します。”,
“修正後”: “次に、Lambdaのコンソール画面からレイヤーを選択します。” - “修正前”: “EC2とLambdaが接続するためには、LambdaとEC2が同じVPC内にある必要があります。”,
“修正後”: “EC2とLambdaを接続するには、両者が同じVPC内に配置されている必要があります。” - “修正前”: “VOICEVOXはサーバ上で音声合成用のエンジンを立ち上げて使用します。”,
“修正後”: “VOICEVOXを使用するには、サーバ上で音声合成エンジンを起動します。” - “修正前”: “この時、ランタイムはPython3.8としてください。”,
“修正後”: “ラムダ関数のランタイムはPython 3.8に設定してください。” - “修正前”: “EC2の名前は任意で大丈夫です。”,
“修正後”: “EC2の名前は任意で問題ありません。” - “修正前”: “今後もChatGPT含め、思いついたものを作っていければなと思います。”,
“修正後”: “今後もChatGPTを含む、色々なアイデアを形にしていきたいと考えています。”
“修正前”: “主な構成要素は以下のとおりです。”,
“修正後”: “このプロジェクトの主な構成要素を以下に示します。”
“修正前”: “VOICEVOXはサーバ上で音声合成用のエンジンを立ち上げて使用します。”,
“修正後”: “VOICEVOXを使用するには、サーバ上で音声合成エンジンを起動します。”
特に上記のような添削は、主語の付け足し、読みやすい文章への修正がされており、良い添削だと感じました。
コード実装のポイント
コード実装のポイントは以下の3つです。
- 添削対象のURLをinputで受け取る
- BeautifulSoupライブラリで本文を抽出する
- OpenAIのAPI「gpt-4-0125-preview」で添削する
添削対象のURLをinputで受け取る
inputで入力を受け取ります。
これにより、コード実行時に添削対象のURLを指定できるようにしました。
# ユーザーからURLを入力として受け取る
user_input_url = input("記事のURLを入力してください: ")
上記のコードにより、実行時にURLを動的に格納することが可能です。
BeautifulSoupライブラリで本文を抽出する
入力したURLから本文を抽出するために「BeautifulSoup(※)」というライブラリを用います。
((※)PythonでHTMLやXMLファイルからデータを抽出するためのライブラリです。)
今回は、HTMLの<p>タグ(ウェブページ上でテキストを表示する際の情報)をもとに、本文を抽出しています。
import requests
from bs4 import BeautifulSoup
# URLからHTMLを取得
response = requests.get(url)
# ステータスコードのチェック
if response.status_code == 200:
html = response.content
soup = BeautifulSoup(html, 'html.parser')
article_contents = soup.find_all('p')
# 記事の本文を結合する
article_text = ' '.join([content.get_text(strip=True) for content in article_contents])
return article_text
else:
return f"Error: Status code {response.status_code}"
このコードにより、入力したURLから下記のように本文を抽出することが可能です。
OpenAIのAPI「gpt-4」で添削する
抽出した本文の添削には、OpenAIのAPI「gpt-4」を用います。
gpt-4を使うことで、より精度の高い添削が実現できます。
GPT-4 APIの場合、扱える最大トークン数は約8,000です。
8000字を超える記事の場合、全ての文章を添削できないので、注意が必要です。
import openai
import os
openai_key = os.getenv('OPENAI_API_KEY')
messages = [
{
"role": "system",
"content": ("ユーザーから渡されたpromptの具体的な修正案を箇条書きで提案してください。"
"修正案を提示するときは、具体的な修正箇所を明記し、元の文章と修正後の文章を比較してください。"
"修正案の記載形式は次を参考にして。"
"1. 修正前の文章。"
"→ 修正後の文章"
"最初に、「添削します。」という文字を出力してください。"
"出力形式は、以下のようにしてください。"
"○修正すべきポイントは以下です。"
"最後に、「添削が完了しました」という文字を出力してください。"
"出力形式は、No.を1列目に、修正前を2列目に、修正後を3列目にして、json形式で出力して。")
},
{
"role": "user",
"content": prompt,
}
]
res=openai.chat.completions.create(
model="gpt-4-0125-preview",
messages=messages,
max_tokens = 2000
)
answer = res.choices[0].message.content
print(answer)
GPTおよびDALL-E3のAPIを使用するためには、OpenAIのAPIキーが必要です。
APIキーを取得されていない方は、まずOpenAIのAPI発行画面からAPIキーを発行しましょう。
Create new secret keyを押下します。
「Create secret key」を押下します。
作成されたキーをコピーしておきます。
画面を閉じてしまうとキーがコピーできなくなるため、注意してください。
ChatGPTのAPIでは、応答の形式を細かく指定することが可能です。
今回は、以下のようにroleを設定しました。
(“ユーザーから渡されたpromptの具体的な修正案を箇条書きで提案してください。” “修正案を提示するときは、具体的な修正箇所を明記し、元の文章と修正後の文章を比較してください。”
“修正案の記載形式は次を参考にして。”
“1. 修正前の文章。”
“→ 修正後の文章”
“最初に、「添削します。」という文字を出力してください。”
“出力形式は、以下のようにしてください。”
“○修正すべきポイントは以下です。”
“最後に、「添削が完了しました」という文字を出力してください。”
“出力形式は、No.を1列目に、修正前を2列目に、修正後を3列目にして、json形式で出力して。”)
指示した内容に沿って応答が返ってきているね。
OpenAIのAPI「gpt-4」の料金
今回用いたOpenAIのAPI「gpt-4-0125-preview」の料金は、100万トークンで$10.00です。
Model | Input | Output |
gpt-4-0125-preview | $10.00 / 1M tokens | $30.00 / 1M tokens |
gpt-4-1106-preview | $10.00 / 1M tokens | $30.00 / 1M tokens |
gpt-4-1106-vision-preview | $10.00 / 1M tokens | $30.00 / 1M tokens |
4000字の本文を添削した場合、本文のinputで約0.04$です。
outputは、上記の実行例で約1000文字でしたので、約0.01$です。
したがって、今回の場合は1実行あたり約0.05$です。
(1文字をおおよそ1トークンと見積もった場合)
APIで記事の添削をするメリット
ところで、わざわざAPIでコード実装しなくても、Web版のChatGPTでも記事の添削できるんじゃないの?
記事の添削自体はできるけど、Web版のChatGPTだと、本文を手入力でコピペする手間が発生して面倒だと思ったんだ。
今回の実装だと「URLを入力するだけで記事が添削できる」から楽だよ。
Web版のChatGPTで添削する場合、コピペが大変でした。
特にブログ記事の場合、吹き出しや画像があったりするので、記事全部の本文をコピペしてChatGPTに入力するのはとても手間がかかると思います。
対して、今回の実装したコードを使って添削する場合、記事のURLを入力するだけです。
本文抽出からChatGPTによる添削までを自動で実施してくれます。
まとめ
今回は、ChatGPTのAPIを使って、添削するコードを実装してみました。
ChatGPTを使ってブログ記事を1から書かせることに注目されがちですが、自身で作成した記事のクオリティを高めるための利用も非常に便利だと思いました。
自分では気が付かない日本語の間違いも、一瞬で添削してくれるのが良いね。
リアルタイムの会話もChatGPTに日本語の添削をしてもらうのはどうかな。
喋ってる時に細かく指摘されるのはちょっと嫌かも・・・
最後まで読んでいただきありがとうございました!
今日はChatGPTのAPI使用して記事添削するブログ記事を書くので結果の内容を共有しようと思っているます。。