TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

ChatGPTで論文を3行に要約して感想を付けてSlack通知

何番煎じかわからないくらいのネタだが、Arxivの論文を3行に要約して、感想を付けてSlack通知する処理を実装した。

先行事例に付加した要素としては、感想を付けたことくらいである。
ChatGPTに驚いてもらい、AIによる「驚き屋」を再現した。

Arxivの論文抽出

先行事例にあるように、arxiv.orgのAPIなどを使用して新着論文を確認する。
ここについては省略する。

プロンプト

作成した要約するプロンプトは以下の通り。先行事例を参考にしている。

以下の文章を制約条件を満たすように要約して出力してください。
[制約条件]
* 文章は簡潔にわかりやすく
* タイトルを1行で出力
* 内容を箇条書きで3行で出力
* 1行あたりの文字数は80文字程度
* 重要なキーワードは取り逃がさない
* タイトルと要約した文章は日本語へ翻訳
* 内容に言及した短い驚きの感想を日本語で1行で出力
[出力]
タイトル:

要約:
1.
2.
3.

感想:

制約条件を箇条書きで指定している。
文章で指示すると、指示に従わない場合があるので、制約条件を分けて記述することは重要である。

また、出力の形式をプロンプトで与えている。
形式を与えないと、応答が長い文章になる場合があるので、形式を指定するのが有効である。

OpenAI APIとSlack Webhookを利用した実装

import requests
import json
from parsel import Selector

url = '' # ArxivのAbstractのURL
slack_webhook_url = '' # SlackのWebhookのURL

system_prompt = r'''以下の文章を制約条件を満たすように要約して出力してください。
[制約条件]
* 文章は簡潔にわかりやすく
* タイトルを1行で出力
* 内容を箇条書きで3行で出力
* 1行あたりの文字数は80文字程度
* 重要なキーワードは取り逃がさない
* タイトルと要約した文章は日本語へ翻訳
* 内容に言及した短い驚きの感想を日本語で1行で出力
[出力]
タイトル:

要約:
1.
2.
3.

感想:'''

response = requests.get(url)
if response.status_code == 200:
    selector = Selector(text=response.text)
    title_en = ' '.join(selector.xpath(r'//*[@id="abs"]/h1//text()').getall())
    title = selector.xpath(r'//*[@id="abs"]/h1')
    abstract = selector.xpath(r'//*[@id="abs"]/blockquote')
    ret = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": title.get() + '\n' + abstract.get()},
        ]
    )

    data = { "text": title_en + '\n' + ret['choices'][0]['message']['content'] + '\n' + url }
    json_data = json.dumps(data)
    requests.post(slack_webhook_url, data=json_data)

文章はHTMLのままuserメッセージに入力しているが、HTMLのままでも問題ない。
ArxivのAbstructは数式が入っていたりして、単純にタグを除いてテキストにできない場合があるのでHTMLのままとしている。

Slack通知の例

Title: Human Motion Diffusion as a Generative Prior
タイトル: 人の動きにおける散乱を生成するプライオリティとしての利用
要約:
1. データ不足により、一人の短いシーケンスにバイアスがかかっている。
2. このギャップを乗り越えるために、事前に学習された散乱ベースのモデルを生成プライオリティとして使用できることを示した。
3. 10秒間の生成に対してトレーニングされたプライオリティを使用して、10分間のアニメーションを生成することができた。
感想: データ不足を効果的に解決する方法として、散乱ベースのモデルを生成プライオリティとして使用する手法が興味深いと思いました。
https://arxiv.org/abs/2303.01418

要約だけでなく、感想があることで、興味を引きやすくなっている気がする。

まとめ

ChatGPTで論文を3行に要約して感想を付けてSlack通知する処理を実装した。
ChatGPTに驚きの感想を付けてもらうことで、興味を引きやすくなった気がする。
好みによって、感想に「やばっ」とかの感嘆詞を付けるようにプロンプトで指示すると良いかもしれない。