Enludus
お問い合わせ

求人を「近い・違う・まだ分からない」に分けて読む

公開されている求人と、自分が仕事に求めていることを並べて比べる Web ツール job match を作っています。何ができるのか、AI をどこまで使うのか、作りながら何に悩んだのかを書きます。

job match(career.enludus.com)は、公開されている求人ページと、自分が仕事に求めていることを並べて、近い点・違う点・まだ分からない点 に分けて見せる Web ツールです。採否や能力を判定するものではありません。応募するかどうかを考えるときの材料を、整理して手元に置くためのものです。

この記事では、何を作ったのか、どう使うのか、作りながら何に悩んだのかを書きます。

なぜ作ったか

求人の条件は、会社ごとに書き方がばらばらで、自分に合うかどうかを比べにくいと感じていました。

年収を表の中に書く会社もあれば、本文の途中に書く会社もあります。「リモート可」も、週に何日出社するのか、会社全体の制度の話なのか、その求人の話なのかで意味が変わります。何件か見比べているうちに、自分が何を基準に比べていたのかが分からなくなってきます。

そこで、先に自分の基準を決めておき、どの求人もその同じ基準で読む、という道具を作ることにしました。

使い方

1. 自分の軸を入力する

最初に 3 つのことを聞きます。3 分ほどで終わります。

  • 見ている職種
  • 8 つの軸:働く場所、裁量、協働、成長の方向、仕事の変化、勤務時間の柔軟性、役割の幅、顧客との接点。それぞれ 0〜100 のスライダーで希望を入れ、別に「どれくらい重視するか」を選びます。「比較しない」を選んだ軸は、比較から外れます。
  • 譲れない条件:最低年収(額面)、勤務地(都道府県)、フルリモート必須。

希望と重視度を分けているのは、「在宅が多い方がいいけれど、そこまでこだわらない」と「フルリモートでなければ困る」を区別したいからです。後者は軸の一つとしてではなく、譲れない条件として別に確かめます。軸が近くても、譲れない条件を満たさなければ「満たさない」と表示します。

2. 求人を選ぶ

企業名を入れると、その会社の公開求人を探します。職種も入れると、候補を絞り込めます。求人の URL を知っていれば、直接貼ることもできます。

初めて見る求人は、裏で取得と解析をするので少し待ちます。一度解析した求人は、ほかの人が同じ求人を見るときにも使い回します。

3. 結果を読む

結果画面は、前半と後半に分けています。

  • 前半は 「求人に書いてあること」。給与・勤務地・出社条件などの概要と、仕事内容・働き方・求める人物を、ページの原文のまま引用します。要約はしません。
  • 後半は 「あなたとの比較」。譲れない条件を満たすかどうかと、8 つの軸が近いか違うか。どの判定にも、ページ上の根拠を付けます。

軸の判定は「近い」「相違」「一部近い」「不明」といった言葉だけで示します。総合点や「適合率 ◯%」は出しません。会社全体の情報も見られますが、「この求人に当てはまるとは限らない参考」として、求人の結果とは分けて表示します。

サンプルテック株式会社(サンプル企業)の結果画面。近い 5・相違 1・不明 2 の数と、裁量や働く場所ごとに「あなた」と「求人」の値を並べたバー、「根拠を見る」のリンクが並ぶ
結果画面(サンプル企業)。軸ごとの判定の数だけを出し、総合点は出さない

4. あとから見比べる

比べた求人は「分析履歴」に残ります。希望職種で絞り込んだり、「相違あり」「不明あり」の求人だけを出したり、「近いが多い順」「不明が少ない順」に並べたりできます。ここでも並べ替えに使うのは軸の数え方だけで、求人に点数を付けることはしていません。

分析履歴の画面。職種と判定で絞り込む欄、並び順の欄の下に、サンプル企業 4 社が近い・相違・不明の数とともに並ぶ
分析履歴(サンプル企業)。絞り込みと並べ替えも、軸の数え方だけで行う

希望条件はいつでも見直せます。見直すと新しい版として保存され、過去の比較は、当時の希望で比べた結果のまま残り、新しい希望で上書きされることはありません。

AI は整理するだけ、決めるのは本人

このツールで一番大事にしているのはここです。

求人ページを読む部分では AI を使っています(TypeSafe の Jev という、判定のためのモデルです)。ただし、AI に文章を書かせたり、数値を作らせたりはしていません。AI に尋ねるのは、たとえば次のような 決まった選択肢から選ぶ質問 だけです。

  • この求人の「働く場所」は、0(出社前提)・50(出社と在宅の併用)・100(フルリモート可)・記述が矛盾・判断材料なし、のどれか
  • その判断を支えているのは、ページのどの断片か

選択肢にないものは、仕組みの上で返せません。存在しない引用や、ページにない URL が結果に混ざることはありません。さらに、自信が足りない判定や、根拠の場所を指せない判定は、すべて「不明」にします。

給与や「週 2 日出社」のように書き方が決まっているものは、AI に聞く前にプログラムで読み取ります。AI に頼るのは、言い回しの幅が大きく、プログラムでは読み切れない部分だけです。

もう一つの約束は、「不明」を 0 点として扱わない ことです。書いていないことを、低い評価にすり替えない。会社全体の制度を、その求人にも当てはまると推測しない。この約束は画面の文言だけでなく、プログラムの型やデータベースの制約にまで入れてあります。

総合点を出さないのも、同じ考えからです。どの違いが決定的で、どの違いは気にならないかは、人によって違います。点数にまとめてしまうと、その判断をツールが勝手にしてしまう。だから、並べて見せるところまでにとどめています。画面にも「採否・能力・人柄を判定するものではありません」と書いています。

難しかったこと

「不明」だらけになった

最初の版で実際の求人を解析すると、8 軸のうち 6 軸が「不明」になる結果が続きました。ところが本文を見ると、判断材料はちゃんと書いてあります。原因を追うと、いくつかが重なっていました。

  • 求人ページが給与欄を描くのに使う 2MB ほどのプログラムを、安全のための容量制限で読み込まずにいた。そのため、給与の欄が空のまま読んでいた。
  • 表の「年収」というラベルと「600万円〜1600万円」という値を、別々の断片として扱っていた。
  • 長い文を機械的に 200 文字で切っていて、条件の途中で文が切れていた。
  • 判定の基準が、利用者に聞いている質問の意味より厳しすぎた。

どれも、AI の自信の基準を下げて「不明」を減らす方向では直していません。それは推測を増やすだけだからです。ページに書いてあることを、落とさずに読む 方を直しました。

「書いていない」と「幅がある」

直したあとに残った「不明」を調べると、多くは「根拠ははっきりあるのに、50 と 100 のどちらとも言い切れない」状態でした。同じページで何度聞いても、確率がほぼ半々に割れます。

これを「不明」と表示すると、「何も書いていない」と区別がつきません。かといって、少しでも高い方を採るのはコイン投げと同じです。

そこで、隣り合う 2 つの点のあいだと読めるときは「50〜100」という 範囲 として記録し、両端で希望と比べることにしました。両端とも近ければ「近い」、両端とも遠ければ「相違」、片方だけ近ければ「一部近い」です。あいだのどこかを推定することはしません。実際の求人 5 件で試すと、「不明」が 19 件から 9 件に減りました。残った 9 件のうち 7 件は、配属先で仕事が変わるオープンポジションで、書いていないこと自体が正しい結果でした。

企業名から求人を探す

URL を知らなくても、企業名から求人にたどり着けるようにしたいと考えました。最初は検索エンジンの結果を手がかりにしていましたが、何度か検索するとボットと判定され、ほとんど結果が返らなくなりました。有料の検索 API は使わずに進めたかった。

そこで、企業名から Wikipedia と Wikidata をたどって公式サイトを特定し、公式サイト自身が公開している採用ページやサイトマップから求人を集める方法に変えました。検索エンジンは、それで見つからないときの予備です。どの経路で見つけた候補も、ページを実際に取得して、求人であること、会社名が一致すること、募集が終わっていないことを確かめてから保存します。

よそのサイトを読むということ

他社のサイトを読みに行く道具なので、取得の仕方には気を使っています。robots.txt で禁止されているページは読みません。ログインが必要なページも読みません。読む大きさ・時間・リダイレクトの回数には上限を設け、社内ネットワークのような公開されていない宛先には接続しません。取得した本文は 30 日で消します。

個人の情報について

  • ログインは Google アカウントで行います。
  • 求人の解析結果は、利用者全員で共有します。そこに個人の希望は混ぜません。比較は、共有の解析結果と本人の希望を、本人に対してだけ行います。
  • 結果を人に見せるリンクも作れますが、見えるのは企業名・職種・軸ごとの判定だけです。希望の値や年収、勤務地は含みません。リンクはいつでも止められます。
  • 退会すると、個人のデータはまとめて削除されます。

これから

課題はまだあります。

  • 求人の一覧を JavaScript でしか描かず、サイトマップもない採用サイトは、企業名からは見つけられません。
  • Wikipedia に記事のない企業は、公式サイトを特定できず、検索エンジンの予備に頼ることになります。
  • 給与が月給や時給で書かれた求人は、年収の条件とは比べず「判定できず」と表示します。勝手に年収へ換算しないためです。
  • 入力した希望職種と、求人の職種を自動で突き合わせる仕組みはまだありません。

どれも「推測で埋めない」を守ったまま、読める範囲を少しずつ広げていくつもりです。使ってみて気になったことがあれば、ぜひ教えてください。


公式サイトの探索、安全な取得の境界、AI への質問の組み立て方、「不明」の型とデータベースの制約、範囲の比較、キャッシュと費用の抑え方まで、コードを引用して追った技術編は「job match の求人照合を全部書く」に書きました。