nakaoka3の技術ブログ

2023年中に52本なにか書きます

ChatGPTを使ってMarkdownをはてな記法に変換しようとしたが結構難しかった

ChatGPTを使って、Markdownはてな記法に変換しようとしたが結構難しかった。

1つのプロンプトで正しく変換できなかったので、HTMLに変換するプロンプトを書いて、HTMLをはてな記法に変換するように指示をしたり、試行錯誤を重ねてようやくそれらしい変換ができた。

HTMLに変換した後に、はてな記法に変換するように指示をしたら変換できた

今回はChatGPT APIをjupyter notebookから実行してやってみた。

最初のセルに以下の関数を定義しておく。

import openai
import os

from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())

openai.api_key  = os.getenv('OPENAI_API_KEY')

def get_completion(prompt, model="gpt-3.5-turbo", temperature=0): 
    messages = [{"role": "user", "content": prompt}]
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=temperature, 
    )
    return response.choices[0].message["content"]

はてな記法の知識もプロンプトに含めることにした。公式サイトの説明をコピーしてきた。

hatena_format = """
記法名   書式  機能
大見出し記法  *~~ 日記に大見出し(h3)をつけます
中見出し記法  **~~    日記に中見出し(h4)をつけます
小見出し記法  ***~~   日記に小見出し(h5)をつけます
リスト記法 -~~ --~~ +~~ ++~~   リスト(li)を簡単に記述します
定義リスト記法   :~~:~~  定義リスト(dt)を簡単に記述します
表組み記法 | ~~ | ~~ | |*~~ | ~~ | 表組み(table)を簡単に記述します
引用記法    >> ~~ <<    引用ブロック(blockquote)を簡単に記述します
pre記法   >| ~~ |<  整形したテキストをそのまま表示します(pre)
スーパーpre記法   >|| ~~ ||<    整形したHTMLなどのソースをそのまま表示します(pre)
スーパーpre記法(シンタックス・ハイライト) >|ファイルタイプ| ~~ ||< >|??| ~~ ||<    整形したプログラムのソースコードを色付けして表示します(pre)
ハイライトできるソースコード一覧
脚注記法    (( ~~ ))    日記に脚注を設定します
続きを読む記法   ==== =====  その後の内容を「続きを読む」にします
改行記法    (連続した空白の行2つ)  p タグと p タグの間に、改行(br)を挿入します
pタグ停止記法 >< ~~ ><    自動挿入される p タグを停止します
tex記法   [tex:~~]    MathJax を使って数式を表示します
カテゴリー記法   [~~]~~  記事にカテゴリーを設定します
"""

最初、はてな記法の記事のHTMLをまるごと渡せば文章の構造も理解してくれていいだろうと思ったが、実際に渡してみるとトークン数がオーバーしてしまい無理だった。

InvalidRequestError: This model's maximum context length is 4097 tokens. However, your messages resulted in 4497 tokens. Please reduce the length of the messages.

色々と試行錯誤を重ね、最終的にはHTMLに変換して、HTMLを渡すことではてな記法に変換することに成功した。

ChatGPTは変換タスクが得意だと聞いていたので、サクッとできるかと思ったがそんなことなかったというのが今回の学びかな。