はじめに
作ったものは記事のタイトル通り、Microsoft Teams に記事の URL を貼ったら、その内容を要約して投稿してくれる仕組みです。
Teams で情報共有している現場は多くあると思いますが、共有してもらった記事を全部読むのは意外に大変です。そんなとき短文で要約して、サッと中身がどんな内容なのか分かると便利だなと思い作ってみました。
英語の記事もそこそこいい感じに日本語で要約してくれます。↓↓
処理の流れ
Azure の Logic Apps でフローを組んでいます。
※PowerAutomate でも実装可能ですが、今回は HTTP コネクタを無料で使いたいので、Azure Logic Apps を使います。
Teams のコネクタをトリガーにし、Azure Functions と Azure OpenAI API を入れて、最後に要約結果を Teams に投げています。
①Teams に新たな投稿があるかチェック(5 分おき)
↓
②Azure Functions で投稿された URL 内のテキストをスクレイピング
下の「HTTP - Get Content 」の部分です。
(Python の BeautifulSoup で実装しています)
↓
③要約結果を Azure OpenAI の API に投げて、GPT-4 なりで要約
下の「HTTP - Summarize」の部分です。
↓
④要約結果を Teams コネクタでチャットに投げる
実際のコード
上記 ② で使用している Azure Functions のコードのみ紹介します。
import azure.functions as func
import requests
import json
from bs4 import BeautifulSoup
from extractcontent3 import ExtractContent
app = func.FunctionApp(http_auth_level=func.AuthLevel.FUNCTION)
@app.route(route="TextExtraction")
def TextExtraction(req: func.HttpRequest) -> func.HttpResponse:
# Teams に投稿された情報を取得
tag = req.get_json().get('tag')
req_soup = BeautifulSoup(tag, 'html.parser')
link = req_soup.find('a', href=True)
url = link['href']
# URL からウェブページを取得
response = requests.get(url)
response.raise_for_status() # エラーならここで例外を発生させる
# URLからタイトルと中身のテキストを抽出する
html = response.text
extractor = ExtractContent()
opt = {"threshold": 0}
extractor.set_option(opt)
extractor.analyse(html)
text, _ = extractor.as_text()
soup = BeautifulSoup(html, "html.parser")
title = soup.find("title").text
# 記事のタイトルと中身のテキストを返す
result = json.dumps({"title": f"{title}", "content": f"{text}"})
return func.HttpResponse(result, mimetype="application/json")
Azure OpenAI の API の利用方法などはドキュメントなどに詳しく書かれているので今回は省略します。以下に参考リンクを置いておきます。
さいごに
おそらく以下のケースには対応できないので、対応するためには改良が必要と思います。
- 貼られた記事が複数ページで構成されている(ページングで構成されている)場合、すべてのページを参照した要約できない(1ページ目だけをもとに要約する)
- 複数の URL を Teams に投稿した場合