本連載は実際に業務で役立つプログラムやツールを使って業務の改善に取り組む様子を紹介する物語です。物語はフィクションですが、作中で紹介するプログラムは実際に使えるものです。係長となった主人公の田中君が後輩の葵お嬢さんと一緒に業務課題に取り組みます。

物語 - クレーム対応から始まったある朝のこと

ある不動産屋の支店で勤務している僕(田中)は係長になり、毎日充実した毎日を過ごしている。毎日いろいろな雑務が発生するので、とても忙しい。それでも、一つ一つの仕事に真摯に向き合って頑張っている。仕事を片付けたときには、なんとも言えない達成感があり、今日も頑張ろうという気持ちになる。

とは言え、全ての仕事が面白いわけではない。特にお客さんからのクレーム対応はとても難しく苦手だ。「そんなこと大した事ではない」と思って対応していると、それが態度に表れてしまうようで、お客さんを怒らせてしまうこともある。それは、ある朝の出来事だった。

その日の朝、社内で悪役令嬢と名高い葵さんが、また問題を起こしたのだ。彼女は眠そうに出社してきてすぐに、鳴り響く電話の受話器を持ち上げた。まだあまり頭が回ってなさそうなので大丈夫かなと僕は警戒していた。どうやら、電話の相手は、我が社のWebサイトに関して質問しているようだ。しばらくして、不味そうだと感じた僕は彼女の側に行って電話を替わったのだが、お客さんの話し声は怒りに満ちていた。

話を改めて聞いてみると、どうやら会社のWebサイトの情報が古くなっており、リンク切れがあったようだ。そして、その方はリンクの先の情報をどうしても知りたかったのだが、エラーが表示されてしまったので、直接電話してきたとのこと。しかし、電話対応が不味く、リンク切れよりも「接客態度が気に入らない」と怒りの矛先が変わってしまった。

クレーム対応の鉄則は、速やかな対応と真摯な態度、解決作の提示とフォローアップを行うことだ。クレームを言ってくれるお客さんを大切にするなら、そのお客さん自身が後に物件を購入してくれたり、友達を紹介してくれることもある。また、類似する問題を防ぐこともできるだろう。

そこで、僕は、まず真摯な態度で無礼を謝った。そして、リンク切れする前の情報をまとめてメールで伝えること、また、Webサイトを見直してリンク切れを直すこと、新人教育に力を入れることを約束して電話を切った。

僕が席に戻ると、すぐに葵さんがやってきた。電話対応でミスしたことを反省している様子で「すみませんでした」と頭を下げてきた。普段の彼女からは想像つかない姿に、ちょっと庇護欲が煽られた。

それで「気にしないで大丈夫だよ」の一言で済ませてあげたかった。しかし、僕は係長だ。心を鬼にして注意点や次回にどう対応したら良いかのシミュレーションを彼女にしてもらったのだった。

そして、今回の最大の問題点である「Webサイトのリンク切れ」の対処を彼女にお願いするのだった。そして、もう一つだけ注文する。

僕「最近、ChatGPTのような生成AIが流行っているよね?」
葵「そうみたいですね。ニュースで特集しているのを見ました。」
僕「そこで生成AIを使って、我が社のWebサイトのリンク切れを検出してみて!」
葵「えー?!面倒そう。私より直接AIに頼めば?」
僕「葵さん、実はぜんぜん反省していないね・・・」

それでも、僕は後でケーキを差し入れるという条件を出すことで、作業してもらえることになった。

僕「この作業を実行するヒントは、AIにプログラムを作ってもらうことだよ。」
葵「AIはウソばっかりつくって言ってたわ。AIが作ったプログラムを実行するなんて危ない気がする。」
僕「そうなんだよ。そこで、ColabっていうPythonのプログラムをクラウド上で実行できるサービスを使うと便利だよ。無料だし安全にプログラムを実行できるよ。」
葵「生成AIとColabって言うのを使って作れば良いのね?やってみるわ。」

そうして、作業をはじめた葵さんは、あっという間にWebサイトのリンク切れをリストアップして、リンク切れを修正してしまった。葵さん、問題行動は多いけど、僕の何倍も優秀だよね。

プログラム - あるWebサイトにあるリンク切れを探す

それでは、今回の物語の中で悪役令嬢の葵さんが作ったプログラムを一緒に見てみましょう。ちなみに、OpenAIのChatGPTやGoogle Bardと言った生成AIが人気です。これらの生成AIを使うと、簡単な指示から自動的にプログラムを生成してもらうことが可能です。対話的にプログラムを完成させることができるので、業務の自動化に大いに役立ちます。

とは言え、生成AIには「ハルシネーション」と呼ばれる問題もあります。これは、AIが事実とは異なる不正確な回答を生成するという問題です。AIは実にもっともらしく回答するのですが、全て創作だったり、事実無根のウソだったりするのです。この点に関して、プログラムの生成に関しても同様の問題を抱えています。

そのため、自分が普段使っているPCで、AIが自動生成したプログラムを実行するのは、とても危険な行為とも言えます。もちろん、危険がないことを確認すれば良いのですが、うっかり危険を見落としてしまう可能性もあります。

そこで、筆者がオススメするのは、普段使っているPCではなく、Googleが無料でプログラミングの学習のために提供しているColabというサービスを利用する方法です。このColabはプログラミング言語のPythonを、Googleが用意したクラウドサーバー上で動かすことができるというものです。

なお、Colabに関する詳しい記事がこちらにあります。Colabを使うには、Googleアカウントが必要なのでアカウントを作成した上でアクセスしましょう。

手順1 - ChatGPTにプログラムの作成を依頼する

なお、ChatGPTを利用するにも、こちらOpenAIのWebサイトから利用登録が必要です。登録したら画面下部のテキストボックスに次のように入力しましょう。なお、指定のWebページの部分を任意のサイトに変更して入力しましょう。

指定のWebページにリンク切れがあります。
リンク切れをリストアップするPythonのプログラムを作成してください。
ただし、リンク切れを確認する際、1秒のウェイトを入れてください。
また、相対リンクは絶対リンクに変更してください。

指定のWebページ: https://example.com/

すると、ChatGPTがPythonのプログラムを生成してくれます。うまく生成されない時は、画面下部にある[Regenarate response]ボタンを押すことで再生成してくれます。

  • ChatGPTでプログラムを生成したところ

    ChatGPTでプログラムを生成したところ

手順2 - 作成したプログラムを確認しよう

ここでは、下記のようなプログラムが生成されました。ChatGPTが作成したプログラムを元に筆者が手を加えたものが以下になります。なお、ChatGPTが生成したプログラムが必ずしも正しいものではありません。指示を無視することもあります。そこで、プログラムが正しいかを、必ず確認しましょう。

import requests
from bs4 import BeautifulSoup
import time
from urllib.parse import urljoin

# 指定のurlがリンク切れかどうかを確認する関数 --- (*1)
def check_link(url):
    print('- ', url)
    try:
        response = requests.get(url) # URLが存在するかチェック
        if response.status_code == 200: # ステータスコードを確認 --- (*2)
            return True
        else:
            return False
    except requests.exceptions.RequestException:
        print('[ERROR]', url) # エラーならここでその旨を表示
        return False

# 引数に指定したwebpage_urlのリンク切れをチェックする --- (*3)
def check_webpage_links(webpage_url):
    response = requests.get(webpage_url) # ページを取得
    soup = BeautifulSoup(response.text, 'html.parser')
    links = soup.find_all('a') # リンク(aタグ)の一覧を得る

    broken_links = []
    for link in links:
        href = link.get('href') # リンク先を得る --- (*4)
        if href:
            absolute_url = urljoin(webpage_url, href) # 相対リンクを絶対リンクに変換
            time.sleep(1)  # 1秒のウェイト --- (*5)
            if not check_link(absolute_url):
                broken_links.append(absolute_url)

    return broken_links

webpage_url = "https://example.com/"
broken_links = check_webpage_links(webpage_url)

# リンク切れの一覧を取得して表示 --- (*6)
if broken_links:
    print("以下のリンクがリンク切れです:")
    for link in broken_links:
        print(link)
else:
    print("リンク切れはありません。")

今回、特に確認したいポイントは次の点です。

  • リンク切れを確認する際、1秒のウェイトを入れているか?
  • 相対リンクが絶対リンクに変更されているか?
上記の点は、プログラム生成時の指示に入れていますが、必ずしも反映されているとは限りませんので、上記のプログラムと下記の解説を参考にして確認しましょう。

ポイントを確認してみます。(*1)の関数check_linkでは指定した一つのURLを確認します。正しく存在するページであればTrueを返し、リンク切れなどがあればFalseを返します。具体的には(*2)の部分で正しく取得できたかどうかを確認します。

(*3)では、引数に指定したwebpage_urlのリンク切れをチェックします。webpage_urlからHTMLをダウンロードし、そこに含まれるaタグの一覧を取得し、一つずつ正しくチェックできるかどうかを確認します。ただし、リンクは絶対リンクと呼ばれる「https://」からはじまるリンクだけでなく、現在のページを元にした相対リンクでURLが指定されることがあります。そこで、(*4)で取得したリンクをurljoin関数を使って絶対URLに変換します。

また、(*5)でリンク切れがあれば、リスト型の変数broken_linksに追加し、(*6)で一覧を画面に出力します。

手順3 - Colabで実行してみよう

ここまでの手順で生成されたプログラムを、Colabで実行してみましょう。こちらにアクセスして、Googleアカウントでサインインしましょう。続いて「ノートブックを新規作成」のボタンを押しましょう。

この記事は
Members+会員の方のみ御覧いただけます

ログイン/無料会員登録

会員サービスの詳細はこちら