user:
実行環境はGoogle Colaboratoryを想定します。AOAIを使って、次の要望を満たすPython関数を書いてください。
・ユーザは、PDFのあるURLを入力する。
・AOAIはそのPDFを読み込み、日本語で要約する。
assistant:
以下は、Google Colaboratory 上で動作し、ユーザーが指定した PDF の URL を読み込んで、日本語で要約する関数です。OpenAI の Azure OpenAI Service(AOAI)を使って要約を行います。
🔧 事前準備
- AOAI(Azure OpenAI)の エンドポイントとAPIキーが必要です。
- 使用モデル(例:
gpt-4
,gpt-35-turbo
など)を指定してください。
✅ コード全文
# 必要なライブラリをインストール
!pip install openai PyPDF2 requests
import requests
import PyPDF2
import io
import openai
# AOAI設定:Azure OpenAI のエンドポイントとキーを設定
openai.api_type = "azure"
openai.api_base = "https://<あなたのAOAIリソース名>.openai.azure.com/"
openai.api_version = "2023-07-01-preview"
openai.api_key = "<あなたのAPIキー>"
DEPLOYMENT_NAME = "<デプロイしたモデル名>" # 例: gpt-35-turbo や gpt-4
def summarize_pdf_from_url(pdf_url):
try:
# PDFをダウンロード
response = requests.get(pdf_url)
response.raise_for_status()
pdf_file = io.BytesIO(response.content)
# PDFのテキストを抽出
reader = PyPDF2.PdfReader(pdf_file)
full_text = ""
for page in reader.pages:
full_text += page.extract_text() or ""
# 要約用プロンプトを作成(日本語での要約指示)
prompt = f"""
次のPDFの内容を日本語で簡潔に要約してください:
\"\"\"
{full_text[:3000]} # AOAIの制限を考慮して最初の約3000文字に制限
\"\"\"
"""
# AOAI に要約を依頼
response = openai.ChatCompletion.create(
engine=DEPLOYMENT_NAME,
messages=[
{"role": "system", "content": "あなたは優秀な日本語の要約アシスタントです。"},
{"role": "user", "content": prompt}
],
temperature=0.5,
max_tokens=1000
)
# 要約結果を表示
summary = response["choices"][0]["message"]["content"]
print("📄 要約:")
print(summary)
except Exception as e:
print(f"❌ エラーが発生しました: {e}")
📝 使用方法
# 例: URLを指定して関数を呼び出す
pdf_url = "https://www.example.com/sample.pdf"
summarize_pdf_from_url(pdf_url)
🔐 注意事項
- AOAIのリソース名・APIキー・デプロイ名は自分の環境に置き換えてください。
- PDFの内容が長すぎるとトークン制限に引っかかるため、最初の数ページだけを使う簡易要約です。より正確にするには分割要約が必要です。
⚡ 拡張案(必要であれば)
- PDF全文を分割して複数回要約し、最終的に統合する。
- Web UI(Gradioなど)を組み合わせてアップロードを可能にする。
必要に応じて拡張もお手伝いできます。
user:
ありがとうございます。
実行環境はGoogle Colaboratoryを想定します。AOAIを使って、次の要望を満たすPython関数を書いてください。
・ユーザは、PDFのあるURLを入力する。
・AOAIはそのPDFを読み込み、日本語で要約する。
・AOAI(Azure OpenAI)の エンドポイントとAPIキーは、Google Drive 中の AOAI/config.json に次のような形で記載されているものとします。
{
"OPENAI_API_TYPE": …,
"OPENAI_API_VERSION": …,
"OPENAI_API_BASE": …,
"OPENAI_API_KEY": …,
"OPENAI_API_ENGINE": …
}
assistant:
了解しました。
以下は、Google Colaboratory 上で動作し、以下の要件すべてを満たす Python 関数です。
✅ 機能要件
- ユーザーが PDF の URL を入力
- AOAI を使って PDF 内容を 日本語で要約
- AOAI の API 情報は、Google Drive内の
AOAI/config.json
に保存されている - Google Drive をマウントして設定ファイルを読み込み
📌 Colab用コード全文
# 必要なライブラリのインストール(初回のみ)
!pip install openai PyPDF2 requests
import openai
import PyPDF2
import requests
import io
import json
import os
from google.colab import drive
def summarize_pdf_from_url_with_drive_config(pdf_url, config_path="/content/drive/MyDrive/AOAI/config.json"):
try:
# Google Drive をマウント
drive.mount('/content/drive')
# AOAIの設定を読み込む
if not os.path.exists(config_path):
raise FileNotFoundError(f"設定ファイルが見つかりません: {config_path}")
with open(config_path, "r") as f:
config = json.load(f)
openai.api_type = config["OPENAI_API_TYPE"]
openai.api_version = config["OPENAI_API_VERSION"]
openai.api_base = config["OPENAI_API_BASE"]
openai.api_key = config["OPENAI_API_KEY"]
deployment_name = config["OPENAI_API_ENGINE"]
# PDFの取得
response = requests.get(pdf_url)
response.raise_for_status()
pdf_file = io.BytesIO(response.content)
# PDFのテキスト抽出
reader = PyPDF2.PdfReader(pdf_file)
full_text = ""
for page in reader.pages:
text = page.extract_text()
if text:
full_text += text + "\n"
if not full_text.strip():
raise ValueError("PDFからテキストを抽出できませんでした。")
# テキストを最大トークン制限に合わせてカット(最初の約3000文字)
truncated_text = full_text[:3000]
# プロンプト作成
prompt = f"""
以下のPDFの内容を日本語でわかりやすく要約してください:
\"\"\"
{truncated_text}
\"\"\"
"""
# AOAI に問い合わせ
response = openai.ChatCompletion.create(
engine=deployment_name,
messages=[
{"role": "system", "content": "あなたは優秀な日本語の要約アシスタントです。"},
{"role": "user", "content": prompt}
],
temperature=0.5,
max_tokens=1000
)
summary = response["choices"][0]["message"]["content"]
print("📄 要約:")
print(summary)
except Exception as e:
print(f"❌ エラー: {e}")
✅ 使い方
pdf_url = "https://example.com/sample.pdf" # PDFのURL
summarize_pdf_from_url_with_drive_config(pdf_url)
🔐 AOAI/config.json の構成(Google Drive上)
My Drive/
└── AOAI/
└── config.json
config.json の内容:
{
"OPENAI_API_TYPE": "azure",
"OPENAI_API_VERSION": "2023-07-01-preview",
"OPENAI_API_BASE": "https://<your-resource-name>.openai.azure.com/",
"OPENAI_API_KEY": "<your-api-key>",
"OPENAI_API_ENGINE": "<your-deployment-name>"
}
🔄 補足・拡張案
- 長いPDFに対して「ページ単位で分割要約 → 結合」も可能です。
-
PyMuPDF
を使うと、レイアウト保持した精度の高い抽出もできます。
必要なら拡張もお手伝いできます!
user:
ありがとうございます。次のエラーが出たので、解決法を教えてください。
You tried to access openai.ChatCompletion, but this is no longer supported in openai>=1.0.0 - see the README at https://github.com/openai/openai-python for the API.
You can run `openai migrate` to automatically upgrade your codebase to use the 1.0.0 interface.
Alternatively, you can pin your installation to the old version, e.g. `pip install openai==0.28`
A detailed migration guide is available here: https://github.com/openai/openai-python/discussions/742
assistant:
このエラーは、OpenAIのPythonクライアントライブラリが v1.0.0以降にアップグレードされたことにより、openai.ChatCompletion.create(...)
のような 旧APIの記述方法が使えなくなったことが原因です。
✅ 解決方法:どちらかを選択
✅ 推奨(最新版APIを使う)
→ openai>=1.0.0
に対応した 新しい記法に書き換える
# 最新API用(openai>=1.0.0)
from openai import AzureOpenAI
def summarize_pdf_from_url_with_drive_config(pdf_url, config_path="/content/drive/MyDrive/AOAI/config.json"):
import requests, PyPDF2, io, json, os
from google.colab import drive
# Google Drive マウント
drive.mount('/content/drive')
# 設定の読み込み
with open(config_path, "r") as f:
config = json.load(f)
client = AzureOpenAI(
api_key=config["OPENAI_API_KEY"],
api_version=config["OPENAI_API_VERSION"],
azure_endpoint=config["OPENAI_API_BASE"]
)
# PDFダウンロード & テキスト抽出
response = requests.get(pdf_url)
response.raise_for_status()
pdf_file = io.BytesIO(response.content)
reader = PyPDF2.PdfReader(pdf_file)
full_text = "".join(page.extract_text() or "" for page in reader.pages)
if not full_text.strip():
raise ValueError("PDFからテキストを抽出できませんでした。")
# 要約対象テキストを切り出し
truncated_text = full_text[:3000]
prompt = f"""
以下のPDFの内容を日本語でわかりやすく要約してください:
\"\"\"
{truncated_text}
\"\"\"
"""
# 新しいAPIで要約実行
response = client.chat.completions.create(
model=config["OPENAI_API_ENGINE"], # Azureでのデプロイ名
messages=[
{"role": "system", "content": "あなたは優秀な日本語の要約アシスタントです。"},
{"role": "user", "content": prompt}
],
temperature=0.5,
max_tokens=1000
)
summary = response.choices[0].message.content
print("📄 要約:")
print(summary)
❌ 回避策(非推奨・一時的な対応)
もし古いコードをそのまま使いたい場合は、以下のように古いバージョンに戻す方法もあります:
!pip install openai==0.28
ただし、これは 将来的に非推奨なので、できれば上の 最新版の書き方に移行するのがベストです。
🧭 補足:必要なライブラリの再インストール
Colabで念のため最新版で再インストールする場合:
!pip install --upgrade openai PyPDF2 requests
必要であれば、複数ページの分割要約や精度向上の方法もご案内できます。
user:
ありがとうございます!解決しました!では、複数ページの分割要約や精度向上の方法もご案内してください!
assistant:
よかったです!🎉
では続いて、「複数ページの分割要約」「精度向上のための工夫」について、実践的な方法をご案内します。
✅ 目的
- 長いPDFを全部要約したい(トークン制限に引っかからないように)
- より自然な日本語で要約してほしい
✅ 改良ポイントまとめ
項目 | 内容 |
---|---|
1️⃣ ページ単位に分割 | PDFをページごとに読み込み・個別に要約 |
2️⃣ 中間要約の統合 | 最後に「ページ要約のまとめ」を生成 |
3️⃣ 精度向上の工夫 | テキスト整形、改行の最適化、日本語指示の強化など |
✅ 分割&統合型の実装例(Colab用)
from openai import AzureOpenAI
import requests, PyPDF2, io, json, os
from google.colab import drive
def summarize_pdf_by_page(pdf_url, config_path="/content/drive/MyDrive/AOAI/config.json"):
# Google Driveマウント
drive.mount('/content/drive')
# AOAIの設定読み込み
with open(config_path, "r") as f:
config = json.load(f)
client = AzureOpenAI(
api_key=config["OPENAI_API_KEY"],
api_version=config["OPENAI_API_VERSION"],
azure_endpoint=config["OPENAI_API_BASE"]
)
model = config["OPENAI_API_ENGINE"]
# PDF取得
response = requests.get(pdf_url)
response.raise_for_status()
pdf_file = io.BytesIO(response.content)
reader = PyPDF2.PdfReader(pdf_file)
page_summaries = []
# 各ページを個別に要約
for i, page in enumerate(reader.pages):
text = page.extract_text()
if not text or len(text.strip()) < 20:
continue # 空ページはスキップ
prompt = f"""
次の内容はPDFの第{i+1}ページです。日本語で簡潔に要約してください:
\"\"\"
{text.strip()[:3000]}
\"\"\"
"""
print(f"⏳ 第{i+1}ページを要約中...")
response = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": "あなたは優秀な日本語の要約アシスタントです。"},
{"role": "user", "content": prompt}
],
temperature=0.4,
max_tokens=700
)
summary = response.choices[0].message.content.strip()
page_summaries.append(f"第{i+1}ページの要約:\n{summary}")
# 全ページ要約を統合して、最終要約を生成
combined_summaries = "\n\n".join(page_summaries)
final_prompt = f"""
以下は各ページの要約です。これらを元に、PDF全体の内容を日本語で簡潔にまとめてください:
\"\"\"
{combined_summaries[:12000]} # 念のためトークン制限対応
\"\"\"
"""
print("🧠 全体要約を生成中...")
final_response = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": "あなたは優秀な日本語の要約アシスタントです。"},
{"role": "user", "content": final_prompt}
],
temperature=0.3,
max_tokens=1000
)
final_summary = final_response.choices[0].message.content.strip()
print("\n✅ 📄 PDF全体の要約:\n")
print(final_summary)
💡 精度向上のテクニック
テクニック | 内容 |
---|---|
システムプロンプト強化 | 例:「小学生にもわかるように要約してください」など文体指示 |
PDF抽出の改善 |
PyMuPDF (fitz) を使うとレイアウト維持した精度の高い抽出が可能 |
テキスト整形 |
strip() や長文の改行調整、不要な記号削除で精度向上 |
温度設定 |
temperature=0.3~0.5 の範囲で精度と多様性のバランス調整 |
ページスキップ条件 | 文字数が極端に少ないページは無視(例:目次や白紙) |
📦 さらに応用できること
- ページ数が多い場合:ページ群を「複数グループ」に分けてまとめ→統合
- 検索機能付きサマリー:要約 + 各ページのキーワード抽出
- PDF全体から「質問応答(Q&A)」生成も可能
必要に応じて、PyMuPDFを使った高精度版や、**Gradio UI化(Webフォーム)**などもご案内できますよ!興味ありますか?
user:
ありがとうございます。PyMuPDFを使った高精度版について、詳しく教えてください。
assistant:
喜んでご案内します!
ここでは、PDFからのテキスト抽出精度を高めるために PyMuPDF
(別名:fitz
) を使ったバージョンをご紹介します。
✅ なぜ PyMuPDF
を使うのか?
PyMuPDF
は PyPDF2
に比べて以下の点で優れています:
特徴 | 説明 |
---|---|
✅ レイアウト保持 | 改行・段落構造を忠実に再現 |
✅ 文字の欠損が少ない | 数式・図表・注釈付きPDFにも強い |
✅ ページ領域ごとの抽出 | 特定の領域だけを取り出すことも可能 |
📦 必要なパッケージのインストール(Colab用)
!pip install pymupdf openai requests
✅ PyMuPDF
を使った高精度要約コード(ページ分割 + AOAI要約)
import fitz # PyMuPDF
from openai import AzureOpenAI
import requests, json, os
from google.colab import drive
def summarize_pdf_with_pymupdf(pdf_url, config_path="/content/drive/MyDrive/AOAI/config.json"):
# Google Driveマウント
drive.mount('/content/drive')
# AOAI設定の読み込み
with open(config_path, "r") as f:
config = json.load(f)
client = AzureOpenAI(
api_key=config["OPENAI_API_KEY"],
api_version=config["OPENAI_API_VERSION"],
azure_endpoint=config["OPENAI_API_BASE"]
)
model = config["OPENAI_API_ENGINE"]
# PDFダウンロード
response = requests.get(pdf_url)
response.raise_for_status()
with open("temp.pdf", "wb") as f:
f.write(response.content)
# PyMuPDFで読み込み
doc = fitz.open("temp.pdf")
page_summaries = []
for i, page in enumerate(doc):
text = page.get_text("text").strip()
if not text or len(text) < 30:
continue # 空ページなどはスキップ
prompt = f"""
以下はPDFの第{i+1}ページの内容です。日本語でわかりやすく要約してください:
\"\"\"
{text[:3000]}
\"\"\"
"""
print(f"📄 第{i+1}ページの要約中...")
res = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": "あなたは優秀な日本語の要約アシスタントです。"},
{"role": "user", "content": prompt}
],
temperature=0.4,
max_tokens=700
)
summary = res.choices[0].message.content.strip()
page_summaries.append(f"第{i+1}ページの要約:\n{summary}")
# ページ要約を統合して全体要約
combined = "\n\n".join(page_summaries)
final_prompt = f"""
以下は各ページの要約です。これらを元に、PDF全体の内容を日本語で簡潔にまとめてください。
\"\"\"
{combined[:12000]}
\"\"\"
"""
print("🧠 全体要約を生成中...")
final_res = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": "あなたは優秀な日本語の要約アシスタントです。"},
{"role": "user", "content": final_prompt}
],
temperature=0.3,
max_tokens=1000
)
final_summary = final_res.choices[0].message.content.strip()
print("\n✅ 📄 PDF全体の要約:\n")
print(final_summary)
🔍 PyMuPDF
の強力な機能(活用例)
機能 | 用途 |
---|---|
page.get_text("blocks") |
段落・列の構造も保持(リスト形式) |
page.search_for("キーワード") |
特定語句の位置を検索可能 |
page.get_text("html") |
HTML形式でレイアウト保存して抽出 |
page.get_textbox(rect) |
特定の領域だけ抽出(図表除外などに便利) |
💡 拡張アイデア
- 📌 特定ページだけを要約(例:3〜5ページ目だけ)
- 🔍 キーワード抽出やQ&A生成との組み合わせ
- 🧠 要約+感想や分析文の生成(教育・研究向け)
✅ まとめ
目的 | 推奨ライブラリ |
---|---|
高速&簡易な抽出 | PyPDF2 |
正確で高品質な抽出 | ✅ PyMuPDF (推奨) |
必要であれば:
- 🔎 特定領域のみを抽出する方法
- 🌐 GradioなどでUI化
- 🤖 質問応答型PDFビューア
もすぐご案内できます。どれに興味ありますか?
user:
ありがとうございます。今日はこの辺で大丈夫です。ここまでの内容をブログに書き残したいので、タイトル案をいくつか提案してください。
assistant:
こちらこそ、ありがとうございました!
以下は、今日の内容をもとにしたブログ記事向けのタイトル案です(技術ブログ/Tips/教育系などを想定して、トーンを変えて複数案ご用意しました)。
💡 技術系・実用寄り
- Azure OpenAI × Google Colab でPDFを日本語要約する方法【PyMuPDF対応】
- ColabでPDFを要約!AOAIとPyMuPDFを使った高精度テキスト抽出&要約入門
- APIキーをGoogle Driveに保存して、Azure OpenAIで安全・簡単にPDF要約する方法
- PyPDF2は卒業?PyMuPDFで精度アップしたPDF日本語要約の完全ガイド
✨ 初心者向け・教育寄り
- PDFの中身を一瞬で要約!ColabとAzure OpenAIの最強タッグ入門
- ノーコピペでPDFを理解!AIで日本語要約する方法をやさしく解説
- 研究・勉強に便利!ChatGPT APIでレポートや論文PDFを要約しよう
🎯 特化・応用寄り
- 長いPDFも安心!ページ分割と統合要約で日本語サマリを自動生成する方法
- Azure OpenAI + PyMuPDFで構築する「要約特化型PDFリーダー」
- GPTで要約+精度重視ならPyMuPDF一択!Colab環境で作る本格PDF要約システム
気に入ったテイストがあれば、本文の構成や導入文も一緒にお手伝いできます!
いつでもご相談ください ☺
user:
「Azure OpenAI × Google Colab でPDFを日本語要約する方法【PyMuPDF対応】」でいきたいと思います。このタイトルに沿って、今回の内容のまとめを詳しく書いてください。
assistant:
了解しました!
以下はご指定のタイトル 「Azure OpenAI × Google Colab でPDFを日本語要約する方法【PyMuPDF対応】」 に沿った、ブログ記事形式の詳しいまとめです。
技術ブログ向けにわかりやすく丁寧に書いてあります。
Azure OpenAI × Google Colab でPDFを日本語要約する方法【PyMuPDF対応】
AIを活用してPDFの内容を効率的に把握したい――そんなニーズに応えるべく、この記事では Azure OpenAI(AOAI)とGoogle Colab を組み合わせて、PDFファイルを日本語で自動要約する方法をご紹介します。
さらに、テキスト抽出の精度を高めるために PyMuPDF
(fitz) を使った高精度な実装を解説します。
✅ この記事でできること
- PDFファイルのURLを指定して内容を抽出
- Azure OpenAIのChatモデル(例:GPT-4)で日本語要約
- トークン制限を回避するため、ページ単位で要約 → 全体要約に統合
- Google Driveに保存されたAPIキーを安全に読み込む
-
PyMuPDF
を使ってテキスト抽出の精度を向上させる
🛠 準備するもの
- Azure OpenAI のアカウントと APIキー、エンドポイント、モデルのデプロイ名
- Google アカウント(Colab + Drive 使用)
- 対象のPDFファイルのURL
📁 1. Google Drive に AOAI の設定ファイルを保存する
Google Drive に次のような JSON ファイルを AOAI/config.json
というパスで保存しておきます。
{
"OPENAI_API_TYPE": "azure",
"OPENAI_API_VERSION": "2023-07-01-preview",
"OPENAI_API_BASE": "https://<your-resource-name>.openai.azure.com/",
"OPENAI_API_KEY": "<your-api-key>",
"OPENAI_API_ENGINE": "<your-deployment-name>"
}
💡 2. PyMuPDF
を使ったPDF要約スクリプト(Colab対応)
以下のコードをGoogle Colabで実行することで、PDFを日本語で要約できます。
!pip install pymupdf openai requests
import fitz # PyMuPDF
from openai import AzureOpenAI
import requests, json, os
from google.colab import drive
def summarize_pdf_with_pymupdf(pdf_url, config_path="/content/drive/MyDrive/AOAI/config.json"):
drive.mount('/content/drive') # Google Driveマウント
with open(config_path, "r") as f:
config = json.load(f)
client = AzureOpenAI(
api_key=config["OPENAI_API_KEY"],
api_version=config["OPENAI_API_VERSION"],
azure_endpoint=config["OPENAI_API_BASE"]
)
model = config["OPENAI_API_ENGINE"]
# PDF取得
response = requests.get(pdf_url)
with open("temp.pdf", "wb") as f:
f.write(response.content)
doc = fitz.open("temp.pdf")
page_summaries = []
for i, page in enumerate(doc):
text = page.get_text("text").strip()
if not text or len(text) < 30:
continue
prompt = f"""
以下はPDFの第{i+1}ページの内容です。日本語でわかりやすく要約してください:
\"\"\"
{text[:3000]}
\"\"\"
"""
print(f"第{i+1}ページを要約中...")
res = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": "あなたは優秀な日本語の要約アシスタントです。"},
{"role": "user", "content": prompt}
],
temperature=0.4,
max_tokens=700
)
summary = res.choices[0].message.content.strip()
page_summaries.append(f"第{i+1}ページの要約:\n{summary}")
# ページごとの要約を統合して、全体の要約を生成
combined = "\n\n".join(page_summaries)
final_prompt = f"""
以下は各ページの要約です。これらを元に、PDF全体の内容を日本語で簡潔にまとめてください:
\"\"\"
{combined[:12000]}
\"\"\"
"""
print("全体要約を生成中...")
final_res = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": "あなたは優秀な日本語の要約アシスタントです。"},
{"role": "user", "content": final_prompt}
],
temperature=0.3,
max_tokens=1000
)
final_summary = final_res.choices[0].message.content.strip()
print("\n✅ PDF全体の要約:\n")
print(final_summary)
✅ 実行方法
pdf_url = "https://example.com/your-pdf.pdf"
summarize_pdf_with_pymupdf(pdf_url)
💎 実装のポイントと工夫
工夫 | 内容 |
---|---|
✅ PyMuPDF 使用 |
テキスト抽出の精度が大幅アップ |
✅ ページ分割 | トークン制限(GPTの最大入力)に対応 |
✅ Google Drive APIキー管理 | セキュリティ&再利用性向上 |
✅ システムプロンプト強化 | 日本語要約としての品質向上 |
🌱 応用アイデア
- ページグループごとの中間要約 → 最終要約(段階的集約)
- 質問応答(Q&A)機能の追加
- GradioなどでインタラクティブなUI化
✍️ おわりに
Azure OpenAI と Google Colab の組み合わせは、研究・教育・ビジネス問わずとても強力なツールになります。とくに、PyMuPDF
を用いたPDFの高精度な要約は、論文や長文レポートの理解を圧倒的に効率化できます。
今後は、Q&A生成や複数PDFの比較分析、Web UIへの応用も視野に入れて、さらに発展させていく予定です。
ぜひ、あなたのワークフローにも取り入れてみてください!
ご希望であれば、この内容をMarkdown形式のブログ記事ファイルにも変換できます。ご希望があればお知らせください!
user:
ありがとうございました!
assistant:
こちらこそ、ありがとうございました!😊
またいつでもお気軽にご相談ください。よいブログ執筆を!📝✨
Have a great day! 🚀