はじめに
本記事は、Google Cloud の Vertex AI を利用する方に向けた内容です。
今回、Vertex AI を利用して、技術記事の内容を読み取りキーワードを抽出する仕組みを作成しました。
背景
普段記事を読んでいて、以下のような思い付きがあり、今回の取り組みに着手しました。
- どういった内容なのかをぱっと可視化できるものがあれば把握がしやすい
- 読みたい記事リストを作るときにキーワードでジャンル分けできたら楽に管理できて良いな
ここでのキーワードとは、技術名やクラウド名など単語レベルのものをイメージしています。
実際に作ってみた
技術記事の一例として、Qiitaの記事を実際に読み取り、本文内容からキーワードを抽出する仕組みを作成しました。
具体的には、以下の項目を実装しています。
- 記事を読み取る
- 本文の内容からキーワードを抽出する
- 【改善案】キーワード抽出前に本文の内容を要約する
1. 記事を読み取る
まず、記事の内容をhtmlファイルから読み取ります。
読み取る元記事:https://qiita.com/Kumagai_Keima/items/2aa50233a1a1e5e4e173
パーサ(parser)を利用して記事のHTMLからデータを抽出し、このあと利用するプロンプトで使いやすいデータの形にします。
ここでのポイントは、記事のフッター、ヘッタ―などを除き、本文箇所のみ抽出していることです。
そうすることで、キーワードを抽出するときに不要な情報をプロンプトに与えないようにします。
(補足)
今回はBeautiful Soup ライブラリを利用して行っています。
以下のようにデータ箇所を限定して抽出する処理を実装しました。
# Beautiful Soupでデータを抽出
with open(file_path, "r", encoding="utf-8") as f:
html_content = f.read()
soup = BeautifulSoup(html_content, "html.parser")
# 抽出箇所を本文箇所に限定
tag = soup.select_one("main article section")
if tag:
text = tag.get_text(strip=True)
公式ドキュメント:https://www.crummy.com/software/BeautifulSoup/bs4/doc/
2. 本文の内容からキーワードを抽出する
次に、プロンプトを利用して記事内容からキーワードを抽出します。
1で取得した本文データをもとに行っていきます。
まず、キーワードの抽出を指示するプロンプトを作成します。
tags_prompt = f"以下の入力内容について記載のある言語や技術について教えてください。言語名か技術名の単語名で回答する。必ず最大数まで出力する必要はありません\n{summary}"
今回はシンプルなキーワードで分類したいという意図も踏まえ、「言語名か技術名の単語名で回答」という指示にしました。
では実際に、キーワードを抽出する処理を実装し動かしてみましょう。
# Geminiモデルとの会話セッションを開始
chat_session = model.start_chat(response_validation=False)
def get_tags(chat: ChatSession, prompt: str) -> str:
text_response = []
# config設定
generation_config = GenerationConfig(
temperature=0.95,
top_p=0.9,
top_k=40,
max_output_tokens=500,
response_mime_type="application/json",
response_schema=response_schema,
)
responses = chat.send_message(
prompt,
stream=True,
generation_config=generation_config,
)
for chunk in responses:
text_response.append(chunk.text)
return "".join(text_response)
tags = get_tags(chat_session, tags_prompt)
出力結果
本文内容をもとにキーワードを抽出してみたところ、このような結果になりました。
「Python」といったあまり記事と関連のない言葉までキーワード化されていますね…
重要度の低いワードはあまり入れたくないところです。
3. (改善案)キーワード抽出前に本文の内容を要約する
キーワードに記事との関連性が低いワードが選ばれたことを踏まえ、抽出する前に「記事の内容を要約する処理」を追加してみようと思います。
要約することで本文が重要な内容のみになり、キーワードも関連性が高くなるのでは、といった狙いです。
実際に要約を指示するプロンプトを作成して処理を実行してみましょう。
# 要約を指示するプロンプト
summary_prompt = f"以下のHTMLファイルの内容について要約してください。\n{text}"
# Geminiモデルとの会話セッションを開始
chat_session = model.start_chat(response_validation=False)
def get_summary(chat: ChatSession, prompt: str) -> str:
text_response = []
responses = chat.send_message(
prompt,
stream=True,
generation_config=config,
)
for chunk in responses:
text_response.append(chunk.text)
return "".join(text_response)
summary = get_summary(chat_session, summary_prompt)
出力結果
うまく重要なワードが選出されるようになっています。
要約することで、記事内容に沿ったキーワードになりましたね。
要約内容も要点を抑えた良い内容ではないでしょうか。
まとめ
今回は Vertex AI を活用して記事の内容を読み取りキーワードを抽出する、といった検証についてまとめました。
プロンプトはただ作成するだけでなく、今回の要約してからキーワードを抽出するといったように、少し工夫を凝らすことで AI の生成結果が改善されることを実感しました。
AI を最大限に活用するためには、単にツールとして使うだけでなく、試行錯誤を重ねながら開発を進めていくことが大切ですね。