【業務効率化】ChatGPTを活用した就業規則の自動回答システムの開発

# はじめに
[Word Embeddings](https://colab.research.google.com/drive/1tttDqgnWL9yJtmlOFXJqA-BjQ1Pyfpax)のアレンジです。
就業規則を答えるBOTを作成します。
就業規則には練習として厚生労働省出版の[モデル就業規則](https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/roudoukijun/zigyonushi/model/index.html)を使用します。

Jupyter NotebookはGoogle Colab上で公開しております。
https://colab.research.google.com/drive/1TKAmnBVJVnNmZDYm6-fQOKFBWPtp0TN4?usp=sharing

# モジュールの準備


```python
!pip install tiktoken openai -q
```

    [2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m1.7/1.7 MB[0m [31m21.5 MB/s[0m eta [36m0:00:00[0m
    [2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m70.3/70.3 kB[0m [31m7.8 MB/s[0m eta [36m0:00:00[0m
    [2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m1.0/1.0 MB[0m [31m53.7 MB/s[0m eta [36m0:00:00[0m
    [2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m158.8/158.8 kB[0m [31m16.1 MB/s[0m eta [36m0:00:00[0m
    [2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m269.4/269.4 kB[0m [31m28.0 MB/s[0m eta [36m0:00:00[0m
    [2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m114.2/114.2 kB[0m [31m13.6 MB/s[0m eta [36m0:00:00[0m
    [?25h


```python
import openai
from openai.embeddings_utils import get_embedding, cosine_similarity
import tiktoken
import pandas as pd
import numpy as np
from getpass import getpass
```

OpenAI APIトークンの設定


```python
openai.api_key = getpass()
```

    ··········


# データの準備
下の方で学習済みのデータを公開していますので、データの準備手順に興味のない方は `データを永続化させるためにGoogleDriveへ接続`の項まで飛ばしてください。


```python
!apt update && apt install -y poppler-utils poppler-data
```

    Get:1 https://cloud.r-project.org/bin/linux/ubuntu focal-cran40/ InRelease [3,622 B]
    Get:2 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64  InRelease [1,581 B]
    Get:3 http://ppa.launchpad.net/c2d4u.team/c2d4u4.0+/ubuntu focal InRelease [18.1 kB]
    Hit:4 http://ppa.launchpad.net/cran/libgit2/ubuntu focal InRelease
    Get:5 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64  Packages [995 kB]
    Hit:6 http://ppa.launchpad.net/deadsnakes/ppa/ubuntu focal InRelease
    Hit:7 http://ppa.launchpad.net/graphics-drivers/ppa/ubuntu focal InRelease
    Hit:8 http://ppa.launchpad.net/ubuntugis/ppa/ubuntu focal InRelease
    Get:9 http://ppa.launchpad.net/c2d4u.team/c2d4u4.0+/ubuntu focal/main Sources [2,549 kB]
    Get:10 http://ppa.launchpad.net/c2d4u.team/c2d4u4.0+/ubuntu focal/main amd64 Packages [1,205 kB]
    Get:11 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB]
    Hit:12 http://archive.ubuntu.com/ubuntu focal InRelease
    Get:13 http://archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
    Get:14 http://archive.ubuntu.com/ubuntu focal-backports InRelease [108 kB]
    Get:15 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages [2,644 kB]
    Get:16 http://archive.ubuntu.com/ubuntu focal-updates/restricted amd64 Packages [2,308 kB]
    Get:17 http://archive.ubuntu.com/ubuntu focal-updates/universe amd64 Packages [1,331 kB]
    Get:18 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages [3,125 kB]
    Get:19 http://security.ubuntu.com/ubuntu focal-security/universe amd64 Packages [1,035 kB]
    Get:20 http://security.ubuntu.com/ubuntu focal-security/restricted amd64 Packages [2,170 kB]
    Fetched 17.7 MB in 19s (953 kB/s)
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    27 packages can be upgraded. Run 'apt list --upgradable' to see them.
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    Suggested packages:
      ghostscript fonts-japanese-mincho | fonts-ipafont-mincho
      fonts-japanese-gothic | fonts-ipafont-gothic fonts-arphic-ukai
      fonts-arphic-uming fonts-nanum
    The following NEW packages will be installed:
      poppler-data poppler-utils
    0 upgraded, 2 newly installed, 0 to remove and 27 not upgraded.
    Need to get 1,648 kB of archives.
    After this operation, 13.3 MB of additional disk space will be used.
    Get:1 http://archive.ubuntu.com/ubuntu focal/main amd64 poppler-data all 0.4.9-2 [1,475 kB]
    Get:2 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 poppler-utils amd64 0.86.1-0ubuntu1.1 [174 kB]
    Fetched 1,648 kB in 4s (391 kB/s)
    Selecting previously unselected package poppler-data.
    (Reading database ... 122400 files and directories currently installed.)
    Preparing to unpack .../poppler-data_0.4.9-2_all.deb ...
    Unpacking poppler-data (0.4.9-2) ...
    Selecting previously unselected package poppler-utils.
    Preparing to unpack .../poppler-utils_0.86.1-0ubuntu1.1_amd64.deb ...
    Unpacking poppler-utils (0.86.1-0ubuntu1.1) ...
    Setting up poppler-data (0.4.9-2) ...
    Setting up poppler-utils (0.86.1-0ubuntu1.1) ...
    Processing triggers for man-db (2.9.1-1) ...
    Processing triggers for fontconfig (2.13.1-2ubuntu3) ...


`curl -o temp.pdf ... pdftotext temp.pdf -` で標準出力にモデル就業規則を表示します。
練習なので、`head`でモデル就業規則の上から10行だけを表示しています。


```python
!curl -fsSLo temp.pdf https://www.mhlw.go.jp/content/001018385.pdf  && pdftotext -nopgbrk -raw temp.pdf - | head && rm temp.pdf
```

    １
    モデル就業規則
    令和４年 11 月版
    厚生労働省労働基準局監督課
    ２
    はじめに
    １ 就業規則の意義
    労働者が安心して働ける明るい職場を作ることは、事業規模や業種を問わず、すべての
    事業場にとって重要なことです。そのためには、あらかじめ就業規則で労働時間や賃金を
    はじめ、人事・服務規律など、労働者の労働条件や待遇の基準をはっきりと定め、労使間


PDFをcurlとpdftotextでテキストとして取得し、一行にまとめます。


```python
import re
# モデル就業規則.pdfを文字列として標準出力へ出力
shell_out = !curl -fsSLo temp.pdf https://www.mhlw.go.jp/content/001018385.pdf  && pdftotext -nopgbrk -raw temp.pdf - && rm temp.pdf
str_output = "".join(shell_out)  # 標準出力をstrとして追加
text = re.sub(r'\n|\r|\t|\s+', ' ', str_output).strip()  # 改行、スペース、タブ文字などを削除
text[:1000]  # 1000文字まで出力
```




    '１モデル就業規則令和４年 11 月版厚生労働省労働基準局監督課２はじめに１ 就業規則の意義労働者が安心して働ける明るい職場を作ることは、事業規模や業種を問わず、すべての事業場にとって重要なことです。そのためには、あらかじめ就業規則で労働時間や賃金をはじめ、人事・服務規律など、労働者の労働条件や待遇の基準をはっきりと定め、労使間でトラブルが生じないようにしておくことが大切です。２ 就業規則の内容就業規則に記載する事項には、必ず記載しなければならない事項（以下「絶対的必要記載事項」といいます。）と、各事業場内でルールを定める場合には記載しなければならない事項（以下「相対的必要記載事項」といいます。）があります（労働基準法（昭和２２年法律第４９号。以下「労基法」といいます。）第８９条）。このほか、使用者において任意に記載し得る事項もあります。絶対的必要記載事項は次のとおりです。（１） 労働時間関係始業及び終業の時刻、休憩時間、休日、休暇並びに労働者を２組以上に分けて交替に就業させる場合においては就業時転換に関する事項（２） 賃金関係賃金の決定、計算及び支払の方法、賃金の締切り及び支払の時期並びに昇給に関する事項（３） 退職関係退職に関する事項（解雇の事由を含みます。）相対的必要記載事項は次のとおりです。（１） 退職手当関係適用される労働者の範囲、退職手当の決定、計算及び支払の方法並びに退職手当の支払の時期に関する事項（２） 臨時の賃金・最低賃金額関係臨時の賃金等(退職手当を除きます。)及び最低賃金額に関する事項（３） 費用負担関係３労働者に食費、作業用品その他の負担をさせることに関する事項（４） 安全衛生関係安全及び衛生に関する事項（５） 職業訓練関係職業訓練に関する事項（６） 災害補償・業務外の傷病扶助関係災害補償及び業務外の傷病扶助に関する事項（７） 表彰・制裁関係表彰及び制裁の種類及び程度に関する事項（８） その他事業場の労働者すべてに適用されるルールに関する事項なお、就業規則の内容は、法令及び当該事業場において適用される労働協約に反してはなりません。法令又は労働協約に反する就業規則については、所轄労働基準監督署長はその変更を命ずることができます（労基法第９２条）。３ 就業規則の作成及び変更の手続労基法は、労働者を１人でも使用する事業場に適用されますが、就業規則につ'



500トークンごとに分割します。


```python
from more_itertools import chunked
enc = tiktoken.encoding_for_model("gpt-3.5-turbo")
# トークン化
tokens = enc.encode(text)
# 500トークンごとに分割
chunks = chunked(tokens, 500)
# トークンの一つをテキスト化、トークン長さを確認
encode_sample = list(chunks)[0]
split_text = enc.decode(encode_sample)
length = len(encode_sample)

print("splite_text:", split_text)
print(length, "tokens")
```

    splite_text: １モデル就業規則令和４年 11 月版厚生労働省労働基準局監督課２はじめに１ 就業規則の意義労働者が安心して働ける明るい職場を作ることは、事業規模や業種を問わず、すべての事業場にとって重要なことです。そのためには、あらかじめ就業規則で労働時間や賃金をはじめ、人事・服務規律など、労働者の労働条件や待遇の基準をはっきりと定め、労使間でトラブルが生じないようにしておくことが大切です。２ 就業規則の内容就業規則に記載する事項には、必ず記載しなければならない事項（以下「絶対的必要記載事項」といいます。）と、各事業場内でルールを定める場合には記載しなければならない事項（以下「相対的必要記載事項」といいます。）があります（労働基準法（昭和２２年法律第４９号。以下「労基法」といいます。）第８９条）。このほか、使用者において任意に記載し得る事項もあります。絶対的必要記載事項は次のとおりです。（１） 労働時間関係始業及び終業の時刻、休憩時間、休日、休暇並びに労働者を２�
    500 tokens



```python
model_code = [enc.decode(i) for i in chunked(tokens, 500)]  # 500トークンごとに規則を分割
model_code[:3]  # 3文節まで表示
```




    ['１モデル就業規則令和４年 11 月版厚生労働省労働基準局監督課２はじめに１ 就業規則の意義労働者が安心して働ける明るい職場を作ることは、事業規模や業種を問わず、すべての事業場にとって重要なことです。そのためには、あらかじめ就業規則で労働時間や賃金をはじめ、人事・服務規律など、労働者の労働条件や待遇の基準をはっきりと定め、労使間でトラブルが生じないようにしておくことが大切です。２ 就業規則の内容就業規則に記載する事項には、必ず記載しなければならない事項（以下「絶対的必要記載事項」といいます。）と、各事業場内でルールを定める場合には記載しなければならない事項（以下「相対的必要記載事項」といいます。）があります（労働基準法（昭和２２年法律第４９号。以下「労基法」といいます。）第８９条）。このほか、使用者において任意に記載し得る事項もあります。絶対的必要記載事項は次のとおりです。（１） 労働時間関係始業及び終業の時刻、休憩時間、休日、休暇並びに労働者を２�',
     '�以上に分けて交替に就業させる場合においては就業時転換に関する事項（２） 賃金関係賃金の決定、計算及び支払の方法、賃金の締切り及び支払の時期並びに昇給に関する事項（３） 退職関係退職に関する事項（解雇の事由を含みます。）相対的必要記載事項は次のとおりです。（１） 退職手当関係適用される労働者の範囲、退職手当の決定、計算及び支払の方法並びに退職手当の支払の時期に関する事項（２） 臨時の賃金・最低賃金額関係臨時の賃金等(退職手当を除きます。)及び最低賃金額に関する事項（３） 費用負担関係３労働者に食費、作業用品その他の負担をさせることに関する事項（４） 安全衛生関係安全及び衛生に関する事項（５） 職業訓練関係職業訓練に関する事項（６） 災害補償・業務外の傷病扶助関係災害補償及び業務外の傷病扶助に関する事項（７） 表彰・制裁関係表彰及び制裁の種類及び程度に関する事項（８） ',
     'その他事業場の労働者すべてに適用されるルールに関する事項なお、就業規則の内容は、法令及び当該事業場において適用される労働協約に反してはなりません。法令又は労働協約に反する就業規則については、所轄労働基準監督署長はその変更を命ずることができます（労基法第９２条）。３ 就業規則の作成及び変更の手続労基法は、労働者を１人でも使用する事業場に適用されますが、就業規則については、常時１０人以上の労働者を使用する事業場においては、これを作成しまたは変更する場合に、所轄労働基準監督署長に届け出なければならないとされています（労基法第８９条）。また、就業規則は、企業単位ではなく事業場単位で作成し、届け出なければなりません。例えば、１企業で２以上の営業所、店舗等を有している場合、企業全体の労働者の数を合計するのではなく、それぞれの営業所、店舗等を１つの事業場としてとらえ、常時使用する労働者が１０人以上の事業場について就業規則を作成する義務が生じます。なお、複数の営業所、店舗等の事業場を有']




```python
len(model_code)
```




    159



500トークンごとに159項目に分割できました。
500トークンの根拠はありませんので、100トークン分割や1000トークン分割など、数を変えるとBOTのパフォーマンスに変化があるかもしれません。

## データの準備(古い手法)
上の方法のほうが効率的なので、参考までに。

モデル就業規則のpdfをcurlで取得してpdftotextでテキスト化します。
https://www.mhlw.go.jp/content/001018385.pdf

```sh
$ curl -fsSLo temp.pdf https://www.mhlw.go.jp/content/001018385.pdf  && pdftotext -nopgbrk -raw temp.pdf
```

上記コマンドを実行するとカレントディレクトリ上に`temp.pdf`と`temp.txt`が作成されており、それぞれモデル就業規則のPDFとテキストデータが入っています。



```python
model_code = """
１ モデル就業規則
令和４年 11 月版
厚生労働省労働基準局監督課
２ はじめに
１ 就業規則の意義
労働者が安心して働ける明るい職場を作ることは、事業規模や業種を問わず、すべての事業場にとって重要なことです。そのためには、あらかじめ就業規則で労働時間や賃金をはじめ、人事・服務規律など、労働者の労働条件や待遇の基準をはっきりと定め、労使間でトラブルが生じないようにしておくことが大切です。
２ 就業規則の内容
就業規則に記載する事項には、必ず記載しなければならない事項（以下「絶対的必要記載事項」といいます。）と、各事業場内でルールを定める場合には記載しなければならない事項（以下「相対的必要記載事項」といいます。）があります（労働基準法（昭和２２年法律第４９号。以下「労基法」といいます。）第８９条）。このほか、使用者において任意に記載し得る事項もあります。
絶対的必要記載事項は次のとおりです。
（１） 労働時間関係 始業及び終業の時刻、休憩時間、休日、休暇並びに労働者を２組以上に分けて交替に就業させる場合においては就業時転換に関する事項
（２） 賃金関係 賃金の決定、計算及び支払の方法、賃金の締切り及び支払の時期並びに昇給に関する事項
（３） 退職関係 退職に関する事項（解雇の事由を含みます。）相対的必要記載事項は次のとおりです。
（１） 退職手当関係 適用される労働者の範囲、退職手当の決定、計算及び支払の方法並びに退職手当の支払の時期に関する事項
（２） 臨時の賃金・最低賃金額関係 臨時の賃金等(退職手当を除きます。)及び最低賃金額に関する事項
（３） 費用負担関係
３ 労働者に食費、作業用品その他の負担をさせることに関する事項
（４） 安全衛生関係 安全及び衛生に関する事項
（５） 職業訓練関係 職業訓練に関する事項
（６） 災害補償・業務外の傷病扶助関係 災害補償及び業務外の傷病扶助に関する事項
（７） 表彰・制裁関係 表彰及び制裁の種類及び程度に関する事項
（８） その他 事業場の労働者すべてに適用されるルールに関する事項なお、就業規則の内容は、法令及び当該事業場において適用される労働協約に反してはなりません。法令又は労働協約に反する就業規則については、所轄労働基準監督署長はそ
の変更を命ずることができます（労基法第９２条）。
３ 就業規則の作成及び変更の手続 労基法は、労働者を１人でも使用する事業場に適用されますが、就業規則については、常時１０人以上の労働者を使用する事業場においては、これを作成しまたは変更する場合に、所轄労働基準監督署長に届け出なければならないとされています（労基法第８９条）。
また、就業規則は、企業単位ではなく事業場単位で作成し、届け出なければなりません。例えば、１企業で２以上の営業所、店舗等を有している場合、企業全体の労働者の数を合計するのではなく、それぞれの営業所、店舗等を１つの事業場としてとらえ、常時使用する労働者が１０人以上の事業場について就業規則を作成する義務が生じます。なお、複数の営業所、店舗等の事業場を有する企業については、営業所、店舗等の就業規則が変更前、変更後ともに本社の就業規則と同一の内容のものである場合に限り、本社所在地を管轄する労働基準監督署長を経由して一括して届け出ることも可能です。
就業規則を作成し、又は変更する場合の所轄労働基準監督署長への届出については、労働者の過半数で組織する労働組合がある場合はその労働組合、過半数で組織する労働組合がない場合は労働者の過半数を代表する者の意見を記し、その者の署名又は記名押印のある書面（意見書）を添付しなければなりません（労基法第９０条）。
この場合の労働者の過半数を代表する者は、①労基法第４１条第２号に規定する監督又は管理の地位にある者でないこと、②就業規則の作成及び変更の際に、使用者から意見を聴取される者を選出することを明らかにして実施する投票、挙手等の方法によって選出された者であることのいずれにも該当する者でなければなりません（労働基準法施行規則（昭和２２年厚生省令第２３号。以下、「労基則」といいます。）第６条の２）。
４ 就業規則の作成又は変更に当たっては、その内容をよく吟味するとともに上記の手続等を遵守しなければなりません。特に、就業規則を労働者にとって不利益に変更する場合には、労働者の代表の意見を十分に聴くとともに、変更の理由及び内容が合理的なものとなるよう慎重に検討することが必要です。就 業 規 則 の 届 出 に つ い て は 電 子 申 請 で も 行 う こ と が 可 能 で す 。 詳 細 は こ ち ら（https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/0000184033.html）をご確認ください。
４ 就業規則の周知
作成した就業規則は、労働者の一人ひとりへの配付、労働者がいつでも見られるように職場の見やすい場所への掲示、備付け、あるいは電子媒体に記録し、それを常時モニター画面等で確認できるようにするといった方法により、労働者に周知しなければなりません（労基法第１０６条第１項）。
就業規則は、作成したり、労働者の代表者から意見を聴取しただけでは効力は発生しないと解されています。就業規則の効力発生時期は、就業規則が何らかの方法によって労働者に周知された時期以降で、就業規則に施行期日が定められているときはその日、就業規則に施行期日が定められていないときは、通常は労働者に周知された日と解されています。
５ モデル就業規則の活用に当たってこのモデル就業規則（以下「本規則」といいます。）は、表紙に記載の時点での関係法令等の規定を踏まえ就業規則の規程例を解説とともに示したものです。本規則はあくまでモデル例であり、就業規則の内容は事業場の実態に合ったものとしなければなりません。したがって、就業規則の作成に当たっては、各事業場で労働時間、賃金などの内容を十分検討するようにしてください。
本規則１０ページ以降にある下線部分（例えば、規程例第１条第１項及び第２条第１項中の「 株式会社」や、第５条第１項中の「 週間以内」などの下線部分）については、法令に従い、各事業場の実情に応じて具体的な名称や数字等を定めてください。
また、規程例の下線部の一部（例えば、１か月単位の変形労働時間制（隔週週休２日制を採用する場合）の規程例第１９条第２項中の「７ 時間１５分」などの部分や、第４３条第２項中の「無給／通常の賃金を支払うこと」の部分）には、あらかじめ数字や文言を記入しているものがありますが、これらは規程例の内容を分かりやすく解説するために便宜的に記入したものですので、これらについても、法令に従い各事業場の実情に応じて具体的な数字等を定めてください。
また、本規則は、主として通常の労働者への適用を想定して作成しています。したがって、パートタイム労働者や有期雇用労働者等を雇用している場合、就業規則の作成に当たっては、本規則の各条項についてパートタイム労働者や有期雇用労働者等への適用の可否について必ず検討し、必要に応じて別個の就業規則を作成してください。
なお、パートタイム労働者や有期雇用労働者に関する事項について就業規則を作成したり、変更する場合には、その事業場において雇用するパートタイム労働者や有期雇用労働者の過半数を代表すると認められる者の意見を聴くように努めなければなりません（短時間労働者及び有期雇用労働者の雇用管理の改善等に関する法律（平成５年法律第７６号。以下「パートタイム・有期雇用労働法」といいます。）第７条）。
６ 目 次
第１章 総則…………………………………………………………１０
第 １条（目的）
第 ２条（適用範囲）
第 ３条（規則の遵守）
第２章 採用、異動等………………………………………………１２
第 ４条（採用手続）
第 ５条（採用時の提出書類）
第 ６条（試用期間）
第 ７条（労働条件の明示）
第 ８条（人事異動）
第 ９条（休職）
第３章 服務規律……………………………………………………１６
第１０条（服務）
第１１条（遵守事項）
第１２条（職場のパワーハラスメントの禁止）
第１３条（セクシュアルハラスメントの禁止）
第１４条（妊娠・出産・育児休業・介護休業等に関するハラスメントの禁止）
第１５条（その他あらゆるハラスメントの禁止）
第１６条（個人情報保護）
第１７条（始業及び終業時刻の記録）
第１８条（遅刻、早退、欠勤等）
第４章 労働時間、休憩及び休日…………………………………２２
[例１] 完全週休２日制を採用する場合の規程例
第１９条（労働時間及び休憩時間）
第２０条（休日）
[例２] １か月単位の変形労働時間制（隔週週休２日制を採用する場合）の規程例
７
第１９条（労働時間及び休憩時間）
第２０条（休日）
[例３] １年単位の変形労働時間制の規程例
第１９条（労働時間及び休憩時間）
第２０条（休日）
第２１条（時間外及び休日労働）
第２２条（勤務間インターバル制度）
[例１] インターバル時間と翌日の所定労働時間が重複する部分を働いたものとみ
なす場合
[例２] インターバル時間と翌日の所定労働時間が重複した時、勤務開始時刻を繰り
下げる場合
第５章 休暇等………………………………………………………３８
第２３条（年次有給休暇）
第２４条（年次有給休暇の時間単位での付与）
第２５条（産前産後の休業）
第２６条（母性健康管理の措置）
第２７条（育児時間及び生理休暇）
第２８条（育児・介護休業、子の看護休暇等）
第２９条（不妊治療休暇）
第３０条（慶弔休暇）
第３１条（病気休暇）
第３２条（裁判員等のための休暇）
第６章 賃金…………………………………………………………４７
第３３条（賃金の構成）
第３４条（基本給）
第３５条（家族手当）
第３６条（通勤手当）
第３７条（役付手当）
第３８条（技能・資格手当）
第３９条（精勤手当）
第４０条（割増賃金）
第４１条（１年単位の変形労働時間制に関する賃金の精算）
８
第４２条（代替休暇）
第４３条（休暇等の賃金）
第４４条（臨時休業の賃金）
第４５条（欠勤等の扱い）
第４６条（賃金の計算期間及び支払日）
第４７条（賃金の支払と控除）
第４８条（賃金の非常時払い）
第４９条（昇給）
第５０条（賞与）
第７章 定年、退職及び解雇………………………………………６６
第５１条（定年等）
[例１] 定年を満６５歳とする例
[例２] 定年を満６０歳とし、その後希望者を再雇用する例
［例３］ 定年を満６０歳とし、その後希望者を継続雇用する例（満６５歳以降は対
象者基準あり）
［例４］ 定年を満６５歳とし、その後希望者の意向を踏まえて継続雇用または業務
委託契約を締結する例（ともに対象者基準あり）
第５２条（退職）
第５３条（解雇）
第８章 退職金………………………………………………………７４
第５４条（退職金の支給）
第５５条（退職金の額）
第５６条（退職金の支払方法及び支払時期）
第９章 無期労働契約への転換……………………………………７６
第５７条（無期労働契約への転換）
第１０章 安全衛生及び災害補償…………………………………７８
第５８条（遵守事項）
第５９条（健康診断）
９
第６０条（長時間労働者に対する面接指導）
第６１条（ストレスチェック）
第６２条（健康管理上の個人情報の取扱い）
第６３条（安全衛生教育）
第６４条（災害補償）
第１１章 職業訓練…………………………………………………８４
第６５条（教育訓練）
第１２章 表彰及び制裁……………………………………………８５
第６６条（表彰）
第６７条（懲戒の種類）
第６８条（懲戒の事由）
第１３章 公益通報者保護…………………………………………８９
第６９条（公益通報者の保護）
第１４章 副業・兼業………………………………………………９０
第７０条（副業・兼業）
- 10 -
第１章 総則
総則には、一般的に就業規則の作成の目的や適用範囲等を規定します。
（目的）
第１条 この就業規則（以下「規則」という。
）は、労働基準法（以下「労基法」とい
う。
）第８９条に基づき、 株式会社の労働者の就業に関する事項を定めるもの
である。
２ この規則に定めた事項のほか、就業に関する事項については、労基法その他の法令
の定めによる。
【第１条 目的】
１ この就業規則規程例（以下「本規程例」といいます。）では、労働者の就業に関する事項を定めていますが、その前提にある法令上の基準は、労基法等関係法令に定められています。
２ 本規程例に労働者の就業に関するすべての事項が定められているわけではありません。本規程例に定めがない事項については、労基法等関係法令の規定によることになります。
３ 就業規則で定める基準に達しない労働条件を定める労働契約は、その部分については無効となります。この場合において、無効となった部分は、就業規則で定める基準によることになります（労働契約法（平成１９年法律第１２８号。以下「契約法」といいま
す。）第１２条）。また、就業規則は法令又は事業場に適用される労働協約に反してはなりません（労基法第９２条）。
（適用範囲）第２条 この規則は、 株式会社の労働者に適用する。
２ パートタイム労働者の就業に関する事項については、別に定めるところによる。
３ 前項については、別に定める規則に定めのない事項は、この規則を適用する。
【第２条 適用範囲】
１ 就業規則は、すべての労働者について作成する必要があります。しかし、就業規則は、必ずしもすべての労働者について同一のものでなければならないわけではありません。同一の事業場であっても、通常の労働者と勤務態様の異なるパートタイム労働者等については、一定の事項について特別の規定を設けたり、別の就業規則を定めることができます。パートタイム労働者等について、規程の一部を適用除外とする場合や全面的に適用除外とする場合には、就業規則本体にその旨明記し、パートタイム労働者等に適用される規定を設けたり、別の就業規則を作成しなければなりません。本規程例では、パートタイム労働者の就業に関する事項について、就業規則本体とは別に定める形式をとっています。パートタイム・有期雇用労働者の就業規則の規程例等は、こちら（https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/0000046152.html）。
２ 働き方改革を推進するための関係法律の整備に関する法律（平成３０年法律第７１号）による改正により、２０２０年４月（中小企業におけるパートタイム労働者、有期雇用労働者については２０２１年４月）より、パートタイム労働者や有期雇用労働者、派遣労働者の待遇について、職務内容、職務内容・配置の変更範囲等を考慮して、通常の労働者との間で不合理な待遇差を設けることは禁止されます（パートタイム・有期雇用労働法第８条、第９条及び労働者派遣事業の適正な運営の確保及び派遣労働者の保護等に関する法律（昭和６０年法律第８８号）第３０条の３）。これらの法律では、賃金だけでなく、福利厚生、休暇などすべての待遇が対象とされています。パートタイム労働者・有期雇用労働者と通常の労働者との間で、賃金等について取扱いに違いがある場合、パートタイム・有期雇用労働者から求められたときは、相違の内容及び理由について説明する必要があります。（パートタイム・有期雇用労働法第１４条第２項）。
（規則の遵守） 第３条 会社は、この規則に定める労働条件により、労働者に就業させる義務を負う。また、労働者は、この規則を遵守しなければならない。
【第３条 規則の遵守】 労基法第２条において、労働者及び使用者は、就業規則等を遵守し、誠実に各々その義務を履行しなければならないと規定されています。
第２章 採用、異動等 採用、異動等については、一般的に採用に際しての手続に関する事項、試用期間、労働条件の明示、人事異動、休職に関すること等を定めます。
（採用手続） 第４条 会社は、入社を希望する者の中から選考試験を行い、これに合格した者を採用する。
【第４条 採用手続】
１ 会社は、労働者の採用に当たり、男女かかわりなく均等な機会を与えなければなりません（雇用の分野における男女の均等な機会及び待遇の確保等に関する法律（昭和４７年法律第１１３号。以下「均等法」といいます。）第５条）。
２ 合理的な理由がない場合に、労働者の採用において身長・体重・体力を要件とすること、転居を伴う転勤に応じることを要件とすること等は、間接差別として禁止されています（均等法第７条）。
（採用時の提出書類） 第５条 労働者として採用された者は、採用された日から 週間以内に次の書類を提出しなければならない。 ① 住民票記載事項証明書 ② 自動車運転免許証の写し（ただし、自動車運転免許証を有する場合に限る。 ） ③ 資格証明書の写し（ただし、何らかの資格証明書を有する場合に限る。 ） ④ その他会社が指定するもの
２ 前項の定めにより提出した書類の記載事項に変更を生じたときは、速やかに書面で会社に変更事項を届け出なければならない。
【第５条 採用時の提出書類】 会社は、労働者の年齢、現住所を確認するに当たり、労働者から戸籍謄本（抄本）や住民票の写しを提出させることは適切ではありません。住民票記載事項の証明書により処理することが適切です。また、提出させる書類については、その提出目的を労働者に説明し、明らかにしてください。
（試用期間） 第６条 労働者として新たに採用した者については、採用した日から か月間を試用期間とする。
２ 前項について、会社が特に認めたときは、試用期間を短縮し、又は設けないことがある。
３ 試用期間中に労働者として不適格と認めた者は、解雇することがある。ただし、入社後１４日を経過した者については、第５３条第２項に定める手続によって行う。
４ 試用期間は、勤続年数に通算する。
【第６条 試用期間】 １ 試用期間を設ける場合にその期間の長さに関する定めは労基法上ありませんが、労働者の地位を不安定にすることから、あまりに長い期間を試用期間とすることは好ましくありません。
２ 試用期間中の解雇については、最初の１４日間以内であれば即時に解雇することができますが、試用期間中の者も１４日を超えて雇用した後に解雇する場合には、原則として３０日以上前に予告をしなければなりません。予告をしない場合には、平均賃金の３０日分以上の解雇予告手当を支払うことが必要となります（労基法第２０条、第２１条）。
（労働条件の明示） 第７条 会社は、労働者を採用するとき、採用時の賃金、就業場所、従事する業務、労働時間、休日、その他の労働条件を記した労働条件通知書及びこの規則を交付して労働条件を明示するものとする。
【第７条 労働条件の明示】
１ 労働者を雇い入れるに際し、労働者に賃金、労働時間、その他の労働条件を明示することが必要です。特に、労働条件を明示するに当たり、次の（１）から（６）までの項目（昇給に関する事項を除く）については、原則書面の交付により明示する必要があります（労基法第１５条、労基則第５条）。 （１） 労働契約の期間に関する事項 （２） 期間の定めのある労働契約を更新する場合の基準に関する事項（期間の定めのある労働契約を更新する場合に限る） （３） 就業の場所及び従事すべき業務に関する事項 （４） 始業及び終業の時刻、所定労働時間を超える労働の有無、休憩時間、休日、休 暇並びに交替制により就業させる場合における就業時転換に関する事項 （５） 賃金（退職手当及び臨時に支払われる賃金等を除く。）の決定、計算及び支払の方法、賃金の締切り及び支払の時期並びに昇給に関する事項
労働者が以下のいずれかの方法を希望した場合には、当該方法により労働条件の明示を行うことができます。 ・ ファクシミリを利用して送信する方法 ・ 電子メールその他のその受信をする者を特定して情報を伝達するために用いられる電気通信（有線、無線その他の電磁的方法により、符号、音響、又は影像を送り、伝え、又は受けることをいう。以下「電子メール等」という。）の送信の方法（当該労働者が当該電子メール等の記録を出力することにより書面を作成することができるものに限る。）※「電子メール等」には以下が含まれます。 ① E メール、Yahoo!メールや Gmail 等のウェブメールサービス ② ＋メッセージ等の RCS（リッチ・コミュニケーション・サービス）や、SMS（ショ ート・メール・サービス） ③ LINE や Facebook 等の SNS メッセージ機能 ただし、ブログやホームページへの書き込みのように、特定の個人がその入力する情報を電気通信を利用して第三者に閲覧させることに付随して、当該第三者が当該個人に対し情報を伝達することができる機能が提供されるものについては、「その受信する者を特定して情報を伝達するために用いられる電気通信」には含まれないため、この方法により労働条件の明示を行うことはできません。さらに、パートタイム・有期雇用労働者については、雇入れに際して、昇給、退職手当、賞与の有無、相談窓口についても文書の交付等により明示しなければなりません（パートタイム・有期雇用労働法第６条第１項）。
２ また、採用内定により労働契約が成立していると解される場合がありますが、この場合には、採用内定に際して、内定者に労働条件を書面で明示する必要があります。（人事異動）第８条 会社は、業務上必要がある場合に、労働者に対して就業する場所及び従事する業務の変更を命ずることがある。
２ 会社は、業務上必要がある場合に、労働者を在籍のまま関係会社へ出向させることがある。
３ 前２項の場合、労働者は正当な理由なくこれを拒むことはできない。（６） 退職に関する事項（解雇の事由を含む。）
【第８条 人事異動】
１ 労働者を採用した後、会社が業務上の理由から就業場所や従事する業務を変更することは、変更がない旨の特別な合意等がない限り可能です。しかしながら、労働者の意に沿わない就業場所等の変更を命じた場合、トラブルが生じ得ますので、本規則のように就業規則に明記しておくことが望ましいと言えます。もちろん、労働者の同意を得るようにすることが大切であることは言うまでもありません。なお、労働者の就業場所を変更しようとする場合には、労働者の育児や介護の状況に配慮しなければなりません（育児休業、介護休業等育児又は家族介護を行う労働者の福祉に関する法律（平成３年法律第７６号。以下「育児・介護休業法」といいます。）第２６条）
２ また、他の会社へ出向させることが想定される場合、出向に関する規定を設けておく必要があります。
（休職） 第９条 労働者が、次のいずれかに該当するときは、所定の期間休職とする。① 業務外の傷病による欠勤が か月を超え、なお療養を継続する必要があるため勤務できないとき 年以内② 前号のほか、特別な事情があり休職させることが適当と認められるとき必要な期間
２ 休職期間中に休職事由が消滅したときは、原則として元の職務に復帰させる。ただし、元の職務に復帰させることが困難又は不適当な場合には、他の職務に就かせることがある。
３ 第１項第１号により休職し、休職期間が満了してもなお傷病が治癒せず就業が困難な場合は、休職期間の満了をもって退職とする。
【第９条 休職】
１ 休職とは、業務外での疾病等主に労働者側の個人的事情により相当長期間にわたり就労を期待し得ない場合に、労働者としての身分を保有したまま一定期間就労義務を免除する特別な扱いをいいます。なお、本条第１項第２号の「特別な事情」には、公職への就任や刑事事件で起訴された場合等が当たります。
２ 休職期間中に休職事由がなくなった場合は、当然に休職が解除され復職となります。
３ 休職の定義、休職期間の制限、復職等については、労基法に定めはありません。
第３章 服務規律 （服務） 第１０条 労働者は、職務上の責任を自覚し、誠実に職務を遂行するとともに、会社の指示命令に従い、職務能率の向上及び職場秩序の維持に努めなければならない。（遵守事項）
第１１条 労働者は、以下の事項を守らなければならない。 ① 許可なく職務以外の目的で会社の施設、物品等を使用しないこと。 ② 職務に関連して自己の利益を図り、又は他より不当に金品を借用し、若しくは贈 与を受ける等不正な行為を行わないこと。 ③ 勤務中は職務に専念し、正当な理由なく勤務場所を離れないこと。 ④ 会社の名誉や信用を損なう行為をしないこと。 ⑤ 在職中及び退職後においても、業務上知り得た会社、取引先等の機密を漏洩しな いこと。 ⑥ 酒気を帯びて就業しないこと。 ⑦ その他労働者としてふさわしくない行為をしないこと。
【第１０条 服務】
【第１１条 遵守事項】 服務規律及び遵守事項については、就業規則に必ず定めなければならない事項ではありませんが、職場の秩序維持に大きな役割を果たすことから、会社にとって労働者に遵守させたい事項を定めてください。
【第１２条 職場のパワーハラスメントの禁止】 職場におけるパワーハラスメントを防止するために、事業主は、雇用管理上必要な措
置を講じなければならないこととされています（労働施策の総合的な推進並びに労働者
の雇用の安定及び職業生活の充実等に関する法律（昭和４１年法律第１３２号。以下「労働施策総合推進法」といいます。）第３０条の２）。
（職場のパワーハラスメントの禁止） 第１２条 職務上の地位や人間関係などの職場内の優越的な関係を背景とした、業務上必要かつ相当な範囲を超えた言動により、他の労働者の就業環境を害するようなことをしてはならない。
（セクシュアルハラスメントの禁止） 第１３条 性的言動により、他の労働者に不利益や不快感を与えたり、就業環境を害するようなことをしてはならない。
【第１３条 セクシュアルハラスメントの禁止】 職場におけるセクシュアルハラスメントを防止するため、事業主は、雇用管理上必要な措置を講じなければならないこととされています（均等法第１１条）。（妊娠・出産・育児休業・介護休業等に関するハラスメントの禁止）
第１４条 妊娠・出産等に関する言動及び妊娠・出産・育児・介護等に関する制度又は措置の利用に関する言動により、他の労働者の就業環境を害するようなことをしてはならない。
【第１４条 妊娠・出産・育児休業・介護休業等に関するハラスメントの禁止】 職場における妊娠・出産・育児休業・介護休業等に関するハラスメントを防止するため、事業主は、雇用管理上必要な措置を講じなければならないこととされています（均等法第１１条の３、育児・介護休業法第２５条）。
（その他あらゆるハラスメントの禁止） 第１５条 第１２条から前条までに規定するもののほか、性的指向・性自認に関する言動によるものなど職場におけるあらゆるハラスメントにより、他の労働者の就業環境を害するようなことをしてはならない。
【第１５条 その他あらゆるハラスメントの禁止】 恋愛感情又は性的感情の対象となる性別についての指向のことを「性的指向」、自己の性別についての認識のことを「性自認」といいます。性的指向や性自認への理解を深め、差別的言動や嫌がらせ（ハラスメント）が起こらないようにすることが重要です。
（個人情報保護） 第１６条 労働者は、会社及び取引先等に関する情報の管理に十分注意を払うとともに、自らの業務に関係のない情報を不当に取得してはならない。
２ 労働者は、職場又は職種を異動あるいは退職するに際して、自らが管理していた会社及び取引先等に関するデータ・情報書類等を速やかに返却しなければならない。
【第１６条 個人情報保護】 個人情報の保護に関する法律（平成１５年法律第５７号）の全面施行により、使用者に個人情報の適正な管理に関する対策が義務付けられています。
（始業及び終業時刻の記録） 第１７条 労働者は、始業及び終業時にタイムカードを自ら打刻し、始業及び終業の時刻を記録しなければならない。
【第１７条 始業及び終業時刻の記録】 労働時間の管理については、「労働時間の適正な把握のために使用者が講ずべき措置に関するガイドライン」（平成２９年１月２０日策定）で、使用者が講ずべき措置が具体的に示されています。使用者は、このガイドラインを遵守し、労働時間を適正に把握する等適切な時間管理を行ってください。なお、後述するように平成３１年４月から労働安全衛生法（昭和４７年法律第５７号。以下「安衛法」といいます。）第６６条の８の３の規定に基づき事業者は、面接指導を実施するため、タイムカードによる記録、パーソナルコンピュータ等の電子計算機の使用時間（ログインからログアウトまでの時間）の記録等の客観的な方法その他の適切な方法により、労働者の労働時間の状況を把握しなければなりません（本規則第６０条参照）。
（参考） 「労働時間の適正な把握のために使用者が講ずべき措置に関するガイドライン（抜粋）」
１． 趣旨 労働基準法においては、労働時間、休日、深夜業等について規定を設けていることから、使用者は、労働時間を適正に把握するなど労働時間を適切に管理する責務を有している。
２． 労働時間の考え方 労働時間とは、使用者の指揮命令下に置かれている時間のことをいい、使用者の明示又は黙示の指示により労働者が業務に従事する時間は労働時間に当たる。そのため、次のアからウのような時間は、労働時間として扱わなければならないこと。
（ア） 使用者の指示により、就業を命じられた業務に必要な準備行為（着用を義務付けられた所定の服装への着替え等）や業務終了後の業務に関連した後始末（清掃等）を事業場内において行った時間
（イ） 使用者の指示があった場合には即時に業務に従事することを求められており、労働から離れることが保障されていない状態で待機等している時間（いわゆる「手待時間」）
（ウ） 参加することが業務上義務づけられている研修・教育訓練の受講や、使用者の指示により業務に必要な学習等を行っていた時間
３． 始業・終業時刻の確認及び記録 使用者は、労働時間を適正に管理するため、労働者の労働日ごとの始業・終業時刻を確認し、これを記録すること。
４． 始業・終業時刻の確認及び記録の原則的な方法 使用者が始業・終業時刻を確認し、記録する方法としては、原則として次のいずれかの方法によること。
（ア） 使用者が、自ら現認することによりこれを確認し、記録すること。
（イ） タイムカード、ＩＣカード、パソコンの使用時間の記録等の客観的な記録を基礎として確認し、記録すること。
５． 自己申告制により始業・終業時刻の確認及び記録を行う場合の措置 ３の方法によることなく、自己申告制により行わざるを得ない場合、使用者は次の措置を講ずること。
（ア） 自己申告制の対象となる労働者に対して、本ガイドラインを踏まえ、労働時間の実態を正しく記録し、適正に自己申告を行うことなどについて十分な説明を行うこと。
（イ） 実際に労働時間を管理する者に対して、自己申告制の適正な運用を含め、本ガイドラインに従い講ずべき措置について十分な説明を行うこと。
（ウ） 自己申告により把握した労働時間が実際の労働時間と合致しているか否かについて、必要に応じて実態調査を実施し、所要の労働時間の補正をすること。
特に、入退場記録やパソコンの使用時間の記録など、事業場内にいた時間の分かるデータを有している場合に、労働者からの自己申告により把握した労働時間と当該データで分かった事業場内にいた時間との間に著しい乖離が生じているときには、実態調査を実施し、所要の労働時間の補正をすること。
（エ） 自己申告した労働時間を超えて事業場内にいる時間について、その理由等を労働者に報告させる場合には、当該報告が適正に行われているかについて確認すること。その際、休憩や自主的な研修、教育訓練、学習等であるため労働時間ではないと報告されていても、実際には、使用者の指示により業務に従事しているなど使用者の指揮命令下に置かれていたと認められる時間については、労働時間として扱わなければならないこと。
（オ） 自己申告制は、労働者による適正な申告を前提として成り立つものである。このため、使用者は、労働者が自己申告できる時間外労働の時間数に上限を設け、上限を超える申告を認めない等、労働者による労働時間の適正な申告を阻害する措置を講じてはならないこと。また、時間外労働時間の削減のための社内通達や時間外労働手当の定額払等労働時間に係る事業場の措置が、労働者の労働時間の適正な申告を阻害する要因となっていないかについて確認するとともに、当該要因となっている場合においては、改善のための措置を講ずること。
さらに、労働基準法の定める法定労働時間や時間外労働に関する労使協定（いわゆる 36 協定）により延長することができる時間数を遵守することは当然であるが、実際には延長することができる時間数を超えて労働しているにもかかわらず、記録上これを守っているようにすることが、実際に労働時間を管理する者や労働者等において、慣習的に行われていないかについても確認すること
６．賃金台帳の適正な調製 使用者は、労働基準法第１０８条及び同法施行規則第５４条により、労働者ごとに、労働日数、労働時間数、休日労働時間数、時間外労働時間数、深夜労働時間数といった事項を適正に記入しなければならないこと。また、賃金台帳にこれらの事項を記入していない場合や、故意に賃金台帳に虚偽の労働時間数を記入した場合は、同法第１２０条に基づき、３０万円以下の罰金に処されること。
７．労働時間の記録に関する書類の保存 使用者は、労働者名簿、賃金台帳のみならず、出勤簿やタイムカード等の労働時間の記録に関する書類について、労働基準法第１０９条に基づき、３年間保存しなければならないこと。
（遅刻、早退、欠勤等） 第１８条 労働者は遅刻、早退若しくは欠勤をし、又は勤務時間中に私用で事業場から外出する際は、事前に に対し申し出るとともに、承認を受けなければならない。ただし、やむを得ない理由で事前に申し出ることができなかった場合は、事後に速やかに届出をし、承認を得なければならない。
２ 前項の場合は、第４５条に定めるところにより、原則として不就労分に対応する賃金は控除する。
３ 傷病のため継続して 日以上欠勤するときは、医師の診断書を提出しなければならない。
【第１８条 遅刻、早退、欠勤等】
１ 本規程例では労働者が遅刻、早退若しくは欠勤等をする場合、事前の申出と会社の承認を得ることとしていますが、どのような手続を規定するかは各事業場で決めることで
す。しかし、こうした手続を取ることは会社の秩序を維持する上でも重要なこととなりますので、明確に定めてください。
２ 欠勤何日以上で医師の診断書を提出させるかは、各事業場で決めることです。
第４章 労働時間、休憩及び休日 １ 労働時間、休憩及び休日に関することは、就業規則の絶対的必要記載事項に当たります。
２ 労基法第３２条第１項において、１週間の労働時間の上限は４０時間と定められています。ただし、特例措置として、商業（労基法別表第１第８号）、映画の製作の事業を除く映画・演劇業（同第１０号）、保健衛生業（同第１３号）、接客娯楽業（同第１４号）の事業であって、労働者数１０人未満の事業場（以下「特例措置対象事業場」といいます。）は、１週４４時間まで働かせることが認められています（労基法第４０条、労基則第２５条の２）。また、労基法第３２条第２項において、１日の労働時間の上限は８時間と定められています。
３ 休憩時間については、１日の労働時間が６時間を超える場合には少なくとも４５分、８時間を超える場合には少なくとも１時間の休憩時間を与えなければなりません（労基法第３４条）。
４ 休日については、毎週少なくとも１回又は４週間を通じ４日以上与えなければなりません（労基法第３５条）。
５ 上記２から４までの労基法の規定に適合する労働条件とするためには、①週休２日制とする、②週休１日制で１日の所定労働時間を短く設定する、③変形労働時間制（１か月単位、１年単位等）を導入する等の方法がありますので、それぞれの事業場の実情に応じて、下記の規程例を参考に就業規則を作成してください。［例１］ 完全週休２日制を採用する場合の規程例１日の労働時間を８時間とし、完全週休２日制を採用する場合の規程例です。
(労働時間及び休憩時間) 第１９条 労働時間は、１週間については４０時間、１日については８時間とする。
２ 始業・終業の時刻及び休憩時間は、次のとおりとする。ただし、業務の都合その他やむを得ない事情により、これらを繰り上げ、又は繰り下げることがある。この場合、前日までに労働者に通知する。
① 一般勤務始業・終業時刻 休憩時間始業 午前 時 分時 分から 時 分まで終業 午後 時 分
② 交替勤務（イ）１番（日勤）始業・終業時刻 休憩時間始業 午前 時 分時 分から 時 分まで終業 午後 時 分
（ロ）２番（準夜勤）始業・終業時刻 休憩時間始業 午前 時 分時 分から 時 分まで終業 午後 時 分
（ハ）３番（夜勤）始業・終業時刻 休憩時間始業 午前 時 分時 分から 時 分まで終業 午後 時 分
３ 交替勤務における各労働者の勤務は、別に定めるシフト表により、前月の 日までに各労働者に通知する。
４ 交替勤務における就業番は原則として 日ごとに 番を 番に、番を 番に、 番を 番に転換する。
５ 一般勤務から交替勤務へ、交替勤務から一般勤務への勤務形態の変更は、原則として休日又は非番明けに行うものとし、前月の 日前までに が労働者に通知する。
【第１９条 労働時間及び休憩時間】 １ 始業及び終業の時刻、休憩時間は、就業規則に必ず定めておかなければなりません。また、交替勤務をとる場合は、勤務形態ごとの始業・終業時刻及び休憩時間を規定するとともに、就業番の転換についても就業規則に規定してください。
２ 休憩は、原則として事業場すべての労働者に一斉に与えなければなりませんが、本規程例のように交替勤務を採用する等一斉に与えることが困難な場合には、労働者代表との書面による協定（以下「労使協定」といいます。）を結ぶことにより交替で与えることができます（労基法第３４条第２項）。この場合、一斉に休憩を与えない労働者の範囲及び当該労働者に対する休憩の与え方について、労使協定で定めなければなりません（労基則第１５条）。また、一斉休憩付与に対する例外として、労基法第４０条に基づき、労基則第３１条において、運輸交通業（労基法別表第１第４号）、商業（同第８号）、金融・広告業（同第９号）、映画・演劇業（同第１０号）、通信業（同第１１号）、保健衛生業（同第１３号）、接客娯楽業（同第１４号）及び官公署の事業について、一斉に休憩を与えなくてもよい旨が定められています。労使協定の労働者代表については、本規程例第２１条の解説を参照してください。
３ 休憩時間は、労働者に自由に利用させなければなりません。使用者の指示があった場合には即時に業務に従事することを求められており、労働から離れることが保障されていない状態で待機等している時間（いわゆる「手待ち時間」）については労働時間に当たり休憩時間ではありませんので注意してください。（休日）
第２０条 休日は、次のとおりとする。 ① 土曜日及び日曜日 ② 国民の祝日（日曜日と重なったときは翌日） ③ 年末年始（１２月 日～１月 日） ④ 夏季休日（ 月 日～ 月 日） ⑤ その他会社が指定する日
２ 業務の都合により会社が必要と認める場合は、あらかじめ前項の休日を他の日と振り替えることがある。
【第２０条 休日】 １ 労基法では何曜日を休日とするかあるいは国民の祝日を休日とするかについて規定していません。１週間の中で何曜日を休日としても、また、週によって異なる曜日を休日
としても差し支えありません。さらに、勤務の実態に合わせて、労働者ごとに異なる日に交替で休日を与えることもできます。
２ 休日は、原則として暦日（午前０時から午後１２時までの継続２４時間をいう。）で与えなければなりません。しかし、番方編成による交替制（８時間３交替勤務のような場合をいう。）を導入するような場合、以下の要件を満たせば休日は暦日ではなく、継続した２４時間を与えれば差し支えないとされています（昭和６３年３月１４日付け基発１５０号）。
（イ）番方編成による交替制によることが就業規則等により定められており、制度として運用されていること。
（ロ）各番方の交替が規則的に定められているものであって、勤務割表等によりその都度設定されるものではないこと。
３ 本条第２項において定めている、いわゆる「振替休日」とは、例えば業務の都合によって所定休日である日曜日に勤務させなければならない場合に、当該日曜日を勤務日に変更し、その代わり勤務日である例えば月曜日を休日とするように、所定の休日とあらかじめ他の勤務日と振り替えることをいいます。また、｢代休｣とは、休日に休日労働を行わせた場合に、その代わりに以後の特定の勤務日又は労働者の希望する任意の勤務日の労働義務を免除し、休みを与える制度のことをいいます。振替休日と代休の労基法上での取扱いの違いは次のとおりです。「労働基準法上の振替休日と代休の取扱いの違い」① 振替休日は、あらかじめ定められた法定休日を他の日に振り替えることですから、振替前の休日に勤務しても通常の勤務と同じです。したがって、休日労働に対する割増賃金の問題は発生しませんが、振り替えた休日が週をまたがった場合、振替勤務したことにより、当該週の実労働時間が週の法定労働時間を超える場合があります。その場合は時間外労働に対する割増賃金の支払が必要となります。
その一方で、代休は、定められた法定休日に休日労働を行わせた場合ですから、その後に代休を与えても休日労働をさせたことが帳消しにされるものではありませんので、休日労働に対する割増賃金を支払う必要があります。
② 休日は労働者の労働義務のない日ですから、これを振り替える場合は、以下に示す措置が必要となります。 ア 就業規則に振替休日の規程を置くこと。 イ 振替休日は特定すること。 ウ 振替休日は４週４日の休日が確保される範囲のできるだけ近接した日とすること。 エ 振替は前日までに通知すること。
〔例２〕１か月単位の変形労働時間制（隔週週休２日制を採用する場合）の規程例 〔例２〕は、１か月単位の変形労働時間制（変形期間は２週間）を活用しつつ、隔週での週休２日制で、毎日の所定労働時間を７時間１５分とすることにより、週４０時間労働制を実施する場合の規程例です。
（労働時間及び休憩時間） 第１９条 １週間の所定労働時間は、 年 月 日を起算日として、２週間ごとに平均して、１週間当たり４０時間とする。
２ １日の所定労働時間は、７ 時間１５分とする。
３ 始業・終業の時刻及び休憩時間は、次のとおりとする。ただし、業務の都合その他やむを得ない事情により、これらを繰り上げ、又は繰り下げることがある。この場合において業務の都合によるときは、 が前日までに通知する。 始業・終業時刻 休憩時間 始業 午前 時 分 時 分から 時 分まで 終業 午後 時 分
（休日） 第２０条 休日は、次のとおりとする。① 日曜日 ② 年 月 日を起算日とする２週間ごとの第２ 土曜日 ③ 国民の祝日（日曜日と重なったときは翌日） ④ 年末年始（１２月 日～１月 日） ⑤ 夏季休日（ 月 日～ 月 日） ⑥ その他会社が指定する日
２ 業務の都合により会社が必要と認める場合は、あらかじめ前項の休日を他の日と振り替えることがある。
【第１９条 労働時間及び休憩時間】
【第２０条 休日】 １ １か月単位の変形労働時間制とは、労使協定又は就業規則等により、１か月以内の一定期間を平均して１週間当たりの労働時間が４０時間を超えない定めをした場合においては、その定めにより、特定された日又は特定された週に１日８時間又は１週４０時間を超えて労働させることができるという制度です（労基法第３２条の２）。この場合の労使協定は、所轄の労働基準監督署長に届け出ることが必要です。労使協定の労働者代表の選出方法等ついては、本規程例第２１条の解説を参照してください。
２ 本規程例は、１日の所定労働時間を固定していますが、業務の都合等によって日々の所定労働時間を変えることもできます。この場合も、一定期間を平均して１週当たりの労働時間が４０時間を超えないようにしなければなりません。
３ １か月単位の変形労働時間制を採用する場合には、就業規則等において変形期間の起算日や各日の始業・終業の時刻及び変形期間内の各日・各週の労働時間を明確にしておくことが必要です。
４ 以下とおり、 〔例２〕の場合は、２週間の所定労働時間は合計７９時間４５分となるため、１週間当たりの平均所定労働時間は３９時間５３分となり、週４０時間以下を満たすこととなります。４３時間３０分 ３６時間１５分 ７ 時 間 15 分 〃 〃 〃 〃 〃 休 日 7 時 間 15 分 〃 〃 〃 〃 休 日 休 日 １ 日 目 月 ２ 日 目 火 ３ 日 目 水 ４ 日 目 木 ５ 日 目 金 ６ 日 目 土 ７ 日 目 日 ８ 日 目 月 ９ 日 目 火 10 日 目 水 11 日 目 木 12 日 目 金 13 日 目 土 14 日 目 日 なお、 〔例２〕 の規程例第１９条では、 ２週間ごとの第２土曜日を休日としていますが、 国民の祝日等を休日とする場合、国民の祝日等がある週の土曜日（又は日曜日）を出勤 日としても週休２日制となります。この場合、規程例第１９条に「ただし、第２号の期 間に第３号の休日が含まれる場合には、その期間の第２土曜日は出勤日とする。」といった文言を追記する必要があります。
【参考】 「１か月単位の変形労働時間制における所定労働時間の定め方」 １か月単位の変形労働時間制については、１か月以内の一定期間（変形期間）を平均して１週間当たりの労働時間が週の法定労働時間（４０時間）を超えない範囲で、就業規則等に各日、各週の所定労働時間を具体的に定めなければなりません。この場合、変形期間における所定労働時間の合計は次の式によって計算された時間の範囲内で設定します。１週間の法定労働時間(４０時間) ×７変形期間の暦日数この式によって変形期間が１か月の場合の所定労働時間の総枠を計算すると、次の表のとおりとなります。
項目 １か月の暦日数 各変形期間に対応する所定労働時間の総枠 法定労働時間が４０時間の場合 法定労働時間が４４時間の場合３１日の場合 ３０日の場合 ２９日の場合 ２８日の場合 １７７．１時間 １７１．４時間 １６５．７時間 １６０．０時間 １９４．８時間 １８８．５時間 １８２．２時間 １７６．０時間 （注）小数点第２位以下を省略。
また、 １か月単位の変形労働時間制における週休２日制の形態別の週所定労働時間は、 次の表のとおりとなります。 週休２日制の 形態 １日の 所定労働時間等 日曜日及び 月２日土曜休日 日曜日及び 月３日土曜休日 日曜日及び 月４日土曜休日 １ 月 の 日 数 28 日 30 日 31 日 28 日 30 日 31 日 28 日 30 日 31 日 １月の休日数 6 日 6 日 6 日 7 日 7 日 7 日 8 日 8 日 8 日 勤 務 日 数 22 日 24 日 25 日 21 日 23 日 24 日 20 日 22 日 23 日 １日８：００ 44:00 44:48 45:10 42:00 42:56 43:22 40:00 41:04 41:33 １日７：５０ 43:05 43:52 44:13 41:07 42:03 42:27 39:10 40:13 40:41 １日７：４５ 42:38 43:24 43:45 40:41 41:36 42:00 38:45 39:47 40:15 １日７：４０ 42:10 42:56 43:17 40:15 41:09 41:33 38:20 39:22 39:49 １日７：３０ 41:15 42:00 42:21 39:23 40:15 40:39 37:30 38:30 38:57 １日７：２０ 40:20 41:04 41:24 38:30 39:22 39:45 36:40 37:39 38:05 １日７：１５ 39:53 40:36 40:56 38:04 38:55 39:18 36:15 37:13 37:39 １日７：１０ 39:25 40:08 40:28 37:37 38:28 38:50 35:50 36:47 37:13 １日７：００ 38:30 39:12 39:31 36:45 37:34 37:56 35:00 35:56 36:22 （注） の場合は１か月を平均し１週間の労働時間が４０時間を超えるため、４０
時間以下となるよう特定の日の労働時間を少なくする等の調整をする必要があります。
〔例３〕１年単位の変形労働時間制の規程例 （労働時間及び休憩時間） 第１９条 労働者代表と１年単位の変形労働時間制に関する労使協定を締結した場合、 当該協定の適用を受ける労働者について、１週間の所定労働時間は、対象期間を平均 して１週間当たり４０時間とする。 ２ １年単位の変形労働時間制を適用しない労働者について、１週間の所定労働時間は ４０時間、１日の所定労働時間は８時間とする。 ３ １日の始業・終業の時刻、休憩時間は次のとおりとする。 ① 通常期間 始業・終業時刻 休憩時間 始業 午前 時 分 時 分から 時 分まで 終業 午後 時 分 ② 特定期間（１年単位の変形労働時間制に関する労使協定で定める特定の期間を いう。 ） 始業・終業時刻 休憩時間 始業 午前 時 分 時 分から 時 分まで 終業 午後 時 分 ③ １年単位の変形労働時間制を適用しない労働者の始業・終業の時刻、休憩時間 は次のとおりとする。 始業・終業時刻 休憩時間 始業 午前 時 分 時 分から 時 分まで 終業 午後 時 分
（休日） 第２０条 １年単位の変形労働時間制の適用を受ける労働者の休日については、１年単位の変形労働時間制に関する労使協定の定めるところにより、対象期間の初日を起算日とする１週間ごとに１日以上、１年間に 日以上となるように指定する。その場合、年間休日カレンダーに定め、対象期間の初日の３０日前までに各労働者に通知する。
２ １年単位の変形労働時間制を適用しない労働者の休日については、以下のとおり指定し、月間休日カレンダーに定め、対象期間の初日の３０日前までに各労働者に通知する。 ① 日曜日（前条第３号の特定期間を除く。） ② 国民の祝日（日曜日と重なったときは翌日） ③ 年末年始（１２月 日～１月 日） ④ 夏季休日（ 月 日～ 月 日） ⑤ その他会社が指定する日
"""
```

ダウンロードしたテキストファイルはページ幅で折り返されているので、機械学習には適さない状態です。

ここでは45分かけてちまちま手動で1分節1行になるように行を結合して、286行まで編集しました。45分かかって編集しても、まだ全体の12%...

上で紹介した`curl...pdftotext...`とトークン分割を使えば
> 45分かけて12%...

の手間なくデータを準備できます。

テキストをデータフレーム化します。


```python
# コメント内は古い手法で取り込んだデータの扱い
# from io import StringIO
# model_df = pd.read_csv(StringIO(model_code))
model_df = pd.DataFrame(model_code, columns=["text"])
model_df
```





  <div id="df-010a31d5-e541-4a83-a50c-1559077a8223">
    <div class="colab-df-container">
      <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>text</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>１モデル就業規則令和４年 11 月版厚生労働省労働基準局監督課２はじめに１ 就業規則の意義労...</td>
    </tr>
    <tr>
      <th>1</th>
      <td>�以上に分けて交替に就業させる場合においては就業時転換に関する事項（２） 賃金関係賃金の決定...</td>
    </tr>
    <tr>
      <th>2</th>
      <td>その他事業場の労働者すべてに適用されるルールに関する事項なお、就業規則の内容は、法令及び当該...</td>
    </tr>
    <tr>
      <th>3</th>
      <td>する企業については、営業所、店舗等の就業規則が変更前、変更後ともに本社の就業規則と同一の内容...</td>
    </tr>
    <tr>
      <th>4</th>
      <td>労基則」といいます。）第６条の２）。就業規則の作成又は変更に当たっては、その内容をよく吟味す...</td>
    </tr>
    <tr>
      <th>...</th>
      <td>...</td>
    </tr>
    <tr>
      <th>154</th>
      <td>�時間の通算や簡便な労働時間管理の方法について考え方を示していますので、その考え方に基づき通...</td>
    </tr>
    <tr>
      <th>155</th>
      <td>日労働の合計の時間数について、１か月１００時間未満及び２～６か月平均８０時間以内とすること）...</td>
    </tr>
    <tr>
      <th>156</th>
      <td>ような場合に該当しないかの確認や、該当しない場合であって労働時間の通算の対象となるときにおい...</td>
    </tr>
    <tr>
      <th>157</th>
      <td>。・十和田運輸事件（東京地判平成１３年６月５日）運送会社の運転手が年に１、２回の貨物運送のア...</td>
    </tr>
    <tr>
      <th>158</th>
      <td>�則により使用者の業務上の秘密を守る義務を負うとしたうえで、会社が機密漏洩防止に特段の配慮を...</td>
    </tr>
  </tbody>
</table>
<p>159 rows × 1 columns</p>
</div>
     


## データを永続化させるためにGoogleDriveへ接続
データはノートブックのインスタンスが消えるとなくなってしまうので、学習コストがかかるベクターに変換したデータはドライブへ保存する。


```python
from google.colab import drive
drive.mount("/content/drive")
```

    Mounted at /content/drive


ここでGoogleDriveへのアクセスを許可してください。


```python
with open("/content/drive/MyDrive/Colab Notebooks/data.txt", "w") as f:
  f.write("Hello drive")
```

MyDrive/Colab Notebooksフォルダにdata.txtが作成されていることを確認してください。

# 関連規約の抽出

## 就業規則のベクトル化
文字列をベクトル化するOpenAIのget_embedding()関数を使います。これはトークンを消費するので、料金がかかります。


```python
# このコマンドはTOKENSを消費するので、繰り返し実行しないほうが良い。
# 使用するときはcsvに吐き出したので、pd.read_csv("model-emeddings.csv")を使う
model_df["embedding"] = model_df.text.apply(lambda x: get_embedding(x, engine="text-embedding-ada-002"))
# model_df.to_csv("/content/drive/MyDrive/Colab Notebooks/model-embeddings.csv")  # csvはarrayを保存するのに適さないのでボツ

# 日本語をエスケープ文字にしないようにforce_ascii=Falseとする
# orient="record"で
# []
#  |- text <string>
#  |- length <int>
#  |- embedding []float
#  の形で保存します。
model_df.to_json("/content/drive/MyDrive/Colab Notebooks/model-embeddings.json",
    force_ascii=False,
    orient="record") 
```

~~5分~~1分くらいで完了しました。
古い手法で一行ずつ取り込んでいた方法では行数が増えるばかりで時間もかかりましたが、500トークンごとに区切るとベクトル化にかかる時間は減りました。


```python
ls -lh "/content/drive/MyDrive/Colab Notebooks"
```

    total 14M
    -rw------- 1 root root  14K Mar  9 09:58 'chatgpt-api.ipynb のコピー'
    -rw------- 1 root root   11 Apr 25 22:20  data.txt
    -rw------- 1 root root 9.5M Apr 22 22:04  model-embeddings.csv
    -rw------- 1 root root 3.4M Apr 26 15:21  model-embeddings.json
    -rw------- 1 root root 201K Apr 20 22:32  model_employee_code_edit.txt
    -rw------- 1 root root 201K Apr 20 22:13  model_employee_code.txt
    -rw------- 1 root root 268K Apr 26 15:23  就業規則BOT.ipynb


古い手法では全体の12%くらいしか読み込んでいないのに比べて、500トークンごとに区切る手法ではモデル就業規則全行を読み込んでいるのに容量が1/3になりました。行数が少ないからベクトル化したembeddingの項目が少ないのでしょうか。

続きから始めるときは model-embeddings.csvを読み込むと、早くて料金もかかりません。

学習済みのデータを共有しておきます。

~~[model-embedding.csv](https://drive.google.com/file/d/1-6U_drUGK7AJ4CHn4Nck5BAb7dQ-yLeL/view?usp=sharing)~~

[model-embedding.json](https://drive.google.com/file/d/1DUvsg1K3x9OuIdFCU9UfKtxrq7lH52mA/view?usp=share_link)

## ベクトル化された就業規則データの読み込み


```python
# model_df = pd.read_csv("/content/drive/MyDrive/Colab Notebooks/model-embeddings.csv").rename({"１ モデル就業規則":"text"}, axis=1)
model_df = pd.read_json("/content/drive/MyDrive/Colab Notebooks/model-embeddings.json")
model_df
```





  <div id="df-cc945500-66ef-44b8-b1b2-eac91a3e5c9c">
    <div class="colab-df-container">
      <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>text</th>
      <th>embedding</th>
      <th>similarities</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>１モデル就業規則令和４年 11 月版厚生労働省労働基準局監督課２はじめに１ 就業規則の意義労...</td>
      <td>[-0.0031310103, -0.0081168134, 0.0068422724, -...</td>
      <td>0.816564</td>
    </tr>
    <tr>
      <th>1</th>
      <td>�以上に分けて交替に就業させる場合においては就業時転換に関する事項（２） 賃金関係賃金の決定...</td>
      <td>[-0.011883983400000001, -0.017528709, 0.027896...</td>
      <td>0.830113</td>
    </tr>
    <tr>
      <th>2</th>
      <td>その他事業場の労働者すべてに適用されるルールに関する事項なお、就業規則の内容は、法令及び当該...</td>
      <td>[-0.0067576934000000005, -0.0051615201, 0.0119...</td>
      <td>0.796507</td>
    </tr>
    <tr>
      <th>3</th>
      <td>する企業については、営業所、店舗等の就業規則が変更前、変更後ともに本社の就業規則と同一の内容...</td>
      <td>[-0.004123474, -0.0041268268, 0.00174996220000...</td>
      <td>0.796155</td>
    </tr>
    <tr>
      <th>4</th>
      <td>労基則」といいます。）第６条の２）。就業規則の作成又は変更に当たっては、その内容をよく吟味す...</td>
      <td>[-0.0106588136, -0.00044822950000000003, 0.011...</td>
      <td>0.795384</td>
    </tr>
    <tr>
      <th>...</th>
      <td>...</td>
      <td>...</td>
      <td>...</td>
    </tr>
    <tr>
      <th>154</th>
      <td>�時間の通算や簡便な労働時間管理の方法について考え方を示していますので、その考え方に基づき通...</td>
      <td>[-0.0014959859000000001, -0.007987556, 0.01083...</td>
      <td>0.818497</td>
    </tr>
    <tr>
      <th>155</th>
      <td>日労働の合計の時間数について、１か月１００時間未満及び２～６か月平均８０時間以内とすること）...</td>
      <td>[0.0004004154, -0.0113613438, 0.0087518478, -0...</td>
      <td>0.830232</td>
    </tr>
    <tr>
      <th>156</th>
      <td>ような場合に該当しないかの確認や、該当しない場合であって労働時間の通算の対象となるときにおい...</td>
      <td>[0.0033579303, -0.0182754919, 0.01175449600000...</td>
      <td>0.816336</td>
    </tr>
    <tr>
      <th>157</th>
      <td>。・十和田運輸事件（東京地判平成１３年６月５日）運送会社の運転手が年に１、２回の貨物運送のア...</td>
      <td>[-0.0177730452, -0.0215087812, 0.0167825092, -...</td>
      <td>0.788776</td>
    </tr>
    <tr>
      <th>158</th>
      <td>�則により使用者の業務上の秘密を守る義務を負うとしたうえで、会社が機密漏洩防止に特段の配慮を...</td>
      <td>[-0.0214479137, -0.0269076359, -0.0009704622, ...</td>
      <td>0.795512</td>
    </tr>
  </tbody>
</table>
<p>159 rows × 3 columns</p>
</div>
     


なーんか`<?>則`とか`<?>時間`とかようわからん化け方しているけどなんでだろう。`to_json`で`force_ascii`したのに。

質問「休暇について」をベクトル化する。次元は1536次元。


```python
query = "休暇について"
query_vector = get_embedding(query, engine="text-embedding-ada-002")
query_vector[:20]
```




    [0.0040262965485453606,
     -0.0011756594758480787,
     0.0027069540228694677,
     -0.02624078281223774,
     -0.008992484770715237,
     0.03391233831644058,
     -0.0218842551112175,
     -0.007779515814036131,
     0.011888369917869568,
     -0.0023433805909007788,
     0.008547941222786903,
     0.00517258420586586,
     0.0012026496697217226,
     -0.022722536697983742,
     -0.001107390271499753,
     -0.02545330487191677,
     0.02464042603969574,
     -0.02626618556678295,
     0.02984793856739998,
     -0.03271842002868652]




```python
len(query_vector)
```




    1536




```python
# csvをロードしたときはエラーが発生しましたが、
# jsonをロードしたときはエラーが発生しません。
model_df["similarities"] = model_df["embedding"].apply(lambda x: cosine_similarity(x, query_vector))
model_df
```





  <div id="df-058432b1-4cad-4b49-a43f-29faf13251ec">
    <div class="colab-df-container">
      <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>text</th>
      <th>embedding</th>
      <th>similarities</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>１モデル就業規則令和４年 11 月版厚生労働省労働基準局監督課２はじめに１ 就業規則の意義労...</td>
      <td>[-0.0031310103, -0.0081168134, 0.0068422724, -...</td>
      <td>0.816564</td>
    </tr>
    <tr>
      <th>1</th>
      <td>�以上に分けて交替に就業させる場合においては就業時転換に関する事項（２） 賃金関係賃金の決定...</td>
      <td>[-0.011883983400000001, -0.017528709, 0.027896...</td>
      <td>0.830113</td>
    </tr>
    <tr>
      <th>2</th>
      <td>その他事業場の労働者すべてに適用されるルールに関する事項なお、就業規則の内容は、法令及び当該...</td>
      <td>[-0.0067576934000000005, -0.0051615201, 0.0119...</td>
      <td>0.796507</td>
    </tr>
    <tr>
      <th>3</th>
      <td>する企業については、営業所、店舗等の就業規則が変更前、変更後ともに本社の就業規則と同一の内容...</td>
      <td>[-0.004123474, -0.0041268268, 0.00174996220000...</td>
      <td>0.796155</td>
    </tr>
    <tr>
      <th>4</th>
      <td>労基則」といいます。）第６条の２）。就業規則の作成又は変更に当たっては、その内容をよく吟味す...</td>
      <td>[-0.0106588136, -0.00044822950000000003, 0.011...</td>
      <td>0.795384</td>
    </tr>
    <tr>
      <th>...</th>
      <td>...</td>
      <td>...</td>
      <td>...</td>
    </tr>
    <tr>
      <th>154</th>
      <td>�時間の通算や簡便な労働時間管理の方法について考え方を示していますので、その考え方に基づき通...</td>
      <td>[-0.0014959859000000001, -0.007987556, 0.01083...</td>
      <td>0.818497</td>
    </tr>
    <tr>
      <th>155</th>
      <td>日労働の合計の時間数について、１か月１００時間未満及び２～６か月平均８０時間以内とすること）...</td>
      <td>[0.0004004154, -0.0113613438, 0.0087518478, -0...</td>
      <td>0.830232</td>
    </tr>
    <tr>
      <th>156</th>
      <td>ような場合に該当しないかの確認や、該当しない場合であって労働時間の通算の対象となるときにおい...</td>
      <td>[0.0033579303, -0.0182754919, 0.01175449600000...</td>
      <td>0.816336</td>
    </tr>
    <tr>
      <th>157</th>
      <td>。・十和田運輸事件（東京地判平成１３年６月５日）運送会社の運転手が年に１、２回の貨物運送のア...</td>
      <td>[-0.0177730452, -0.0215087812, 0.0167825092, -...</td>
      <td>0.788776</td>
    </tr>
    <tr>
      <th>158</th>
      <td>�則により使用者の業務上の秘密を守る義務を負うとしたうえで、会社が機密漏洩防止に特段の配慮を...</td>
      <td>[-0.0214479137, -0.0269076359, -0.0009704622, ...</td>
      <td>0.795512</td>
    </tr>
  </tbody>
</table>
<p>159 rows × 3 columns</p>
</div>
     



csvとして保存したときにはエラーが発生する

/usr/local/lib/python3.9/dist-packages/numpy/core/overrides.py in dot(*args, **kwargs)

UFuncTypeError: ufunc 'multiply' did not contain a loop with signature matching types (dtype('<U34412'), dtype('<U23')) -> None

エラーが発生しなくなるおまじない。
embedding列をnp.arrayとして読み込みます。

```python
model_df['embedding'] = model_df['embedding'].apply(eval).apply(np.array)
```

queryとの類似性をベクトルの内積を摂ることにより算出します。


```python
model_df["similarities"] = model_df["embedding"].apply(lambda x: cosine_similarity(x, query_vector))
model_df.head()
```





  <div id="df-5c3824f9-fbdd-411f-af2d-0c4bf8452a7d">
    <div class="colab-df-container">
      <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>text</th>
      <th>embedding</th>
      <th>similarities</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>１モデル就業規則令和４年 11 月版厚生労働省労働基準局監督課２はじめに１ 就業規則の意義労...</td>
      <td>[-0.0031310103, -0.0081168134, 0.0068422724, -...</td>
      <td>0.816564</td>
    </tr>
    <tr>
      <th>1</th>
      <td>�以上に分けて交替に就業させる場合においては就業時転換に関する事項（２） 賃金関係賃金の決定...</td>
      <td>[-0.011883983400000001, -0.017528709, 0.027896...</td>
      <td>0.830113</td>
    </tr>
    <tr>
      <th>2</th>
      <td>その他事業場の労働者すべてに適用されるルールに関する事項なお、就業規則の内容は、法令及び当該...</td>
      <td>[-0.0067576934000000005, -0.0051615201, 0.0119...</td>
      <td>0.796507</td>
    </tr>
    <tr>
      <th>3</th>
      <td>する企業については、営業所、店舗等の就業規則が変更前、変更後ともに本社の就業規則と同一の内容...</td>
      <td>[-0.004123474, -0.0041268268, 0.00174996220000...</td>
      <td>0.796155</td>
    </tr>
    <tr>
      <th>4</th>
      <td>労基則」といいます。）第６条の２）。就業規則の作成又は変更に当たっては、その内容をよく吟味す...</td>
      <td>[-0.0106588136, -0.00044822950000000003, 0.011...</td>
      <td>0.795384</td>
    </tr>
  </tbody>
</table>
</div>
     


関連性順にソートします。


```python
model_df.sort_values("similarities", ascending=False)
```





  <div id="df-47acc9fc-cb1a-4a00-ab99-818b598d7672">
    <div class="colab-df-container">
      <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>text</th>
      <th>embedding</th>
      <th>similarities</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>61</th>
      <td>�日数のうち５日について、会社が労働者の意見を聴取し、その意見を尊重した上で、あらかじめ時季...</td>
      <td>[-0.0107386103, 0.00037948750000000003, 0.0178...</td>
      <td>0.857421</td>
    </tr>
    <tr>
      <th>101</th>
      <td>�休暇期間、慶弔休暇、病気休暇、裁判員等のための休暇の期間、休職の期間を無給とするか有給とす...</td>
      <td>[0.0008162073, 0.0029163177, 0.0276967976, -0....</td>
      <td>0.856833</td>
    </tr>
    <tr>
      <th>62</th>
      <td>各労働者に通知する。【第２３条 年次有給休暇】１ 雇入れの日から６か月間継続勤務し、全労働日...</td>
      <td>[-0.015559835400000001, -0.0023178766, 0.01893...</td>
      <td>0.853474</td>
    </tr>
    <tr>
      <th>68</th>
      <td>就業規則等に定めることが必要です（労基法第３９条第７項）。３ 労使協定に規定しなければならな...</td>
      <td>[0.0013176750000000001, -0.0047479584, 0.01522...</td>
      <td>0.853114</td>
    </tr>
    <tr>
      <th>59</th>
      <td>保する方法も考えられます。- 38 -第５章 休暇等年次有給休暇等法定の休暇のみならず、会社...</td>
      <td>[-0.0112524731, -0.0029541843, 0.0288955644, -...</td>
      <td>0.852023</td>
    </tr>
    <tr>
      <th>...</th>
      <td>...</td>
      <td>...</td>
      <td>...</td>
    </tr>
    <tr>
      <th>130</th>
      <td>�煙可能な場所に連れて行かないこと。⑥ 立入禁止又は通行禁止区域には立ち入らないこと。⑦ 常...</td>
      <td>[0.0020896925, -0.0092624212, -0.0031884497, -...</td>
      <td>0.782915</td>
    </tr>
    <tr>
      <th>149</th>
      <td>るところにより処理を行う。【第６９条 公益通報者の保護】国民生活の安全・安心を損なうような事...</td>
      <td>[-0.0215397254, -0.031455710500000005, -0.0019...</td>
      <td>0.781792</td>
    </tr>
    <tr>
      <th>148</th>
      <td>�き、社会通念上相当であると認められない場合は、その権利を濫用したものとして、当該懲戒は、無...</td>
      <td>[-0.0106403027, 0.0005167176, 0.01472645070000...</td>
      <td>0.778499</td>
    </tr>
    <tr>
      <th>146</th>
      <td>を受けても改めなかったとき。④ 正当な理由なく、しばしば業務上の指示・命令に従わなかったとき...</td>
      <td>[-0.0152044091, -0.0185694322, 0.0066339020000...</td>
      <td>0.778367</td>
    </tr>
    <tr>
      <th>50</th>
      <td>14 15 14 15 16 17 18 19 20 11 12 13 14 15 16 1...</td>
      <td>[-0.0165984426, -0.0127634481, 0.0043714973, -...</td>
      <td>0.752657</td>
    </tr>
  </tbody>
</table>
<p>159 rows × 3 columns</p>
</div>
     


関連順にソートできました。この中の条項の部分だけを抜き出すと、就業規則~~チャットボット~~分類器？検索器？になります。 関連順トップ3をつなげて表示します。


```python
top3 = model_df.sort_values("similarities", ascending=False).text[:3].values; top3
```




    array(['�日数のうち５日について、会社が労働者の意見を聴取し、その意見を尊重した上で、あらかじめ時季を指定して取得させる。ただし、労働者が第３項又は第４項の規定による年次有給休暇を取得した場合においては、当該取得した日数分を５日から控除するものとする。６ 第１項及び第２項の出勤率の算定に当たっては、下記の期間については出勤したものとして取り扱う。① 年次有給休暇を取得した期間② 産前産後の休業期間③ 育児・介護休業法に基づく育児休業及び介護休業した期間④ 業務上の負傷又は疾病により療養のために休業した期間７ 付与日から１年以内に取得しなかった年次有給休暇は、付与日から２年以内に限り繰り越して取得することができる。８ 前項について、繰り越された年次有給休暇とその後付与された年次有給休暇のいずれも取得できる場合には、繰り越された年次有給休暇から取得させる。９ 会社は、毎月の賃金計算締切日における年次有給休暇の残日数を、当該賃金の支払明細書に記載して',
           '�休暇期間、慶弔休暇、病気休暇、裁判員等のための休暇の期間、休職の期間を無給とするか有給とするかについては、各事業場において決め、就業規則に定めてください。また、有給とする場合は、例えば「通常の賃金を支払う」、「基本給の○○％を支払う」とするなど、できるだけ具体的に定めてください。（臨時休業の賃金）第４４条 会社側の都合により、所定労働日に労働者を休業させた場合は、休業１日につき労基法第１２条に規定する平均賃金の６割を支給する。この場合において、１日のうちの一部を休業させた場合にあっては、その日の賃金については労基法第２６条に定めるところにより、平均賃金の６割に相当する賃金を保障する。- 62 -【第４４条 臨時休業の賃金】会社側の都合(使用者の責に帰すべき事由)により、所定労働日に労働者を休業させる場合には、平均賃金の６０％以上の休業手当を支払わなければなりません(労基法第２６条)。また、１日の所定労働時間の一部のみ使用者の責めに帰すべき事由により休業させた場合に',
           '各労働者に通知する。【第２３条 年次有給休暇】１ 雇入れの日から６か月間継続勤務し、全労働日の８割以上出勤した労働者に対しては最低１０日の年次有給休暇を与えなければなりません（労基法第３９条第１項）。また、週の所定労働時間が３０時間未満であって、週の所定労働日数が４日以下あるいは年間の所定労働日数が２１６日以下の労働者（以下「所定労働日数が少ない者」といいます。）に対しては、通常の労働者の所定労働日数との比率を考慮して、労基則第２４条の３で定める日数以上の年次有給休暇を与えなければなりません（同条第３項）。２ 所定労働時間や所定労働日数が変動する労働者の場合、本条第１項又は第２項のいずれに該当するかに関しては、年次有給休暇の「基準日」において定められている週所定労働時間及び週所定労働日数又は年間所定労働日数によって判断することとなります。ここでいう「基準日」とは、年次有給休暇の権利が発生した日のことであり、雇入れ後６か月経過した日、その後は１年ごとの日のことをいいます。３ 年次有給休'],
          dtype=object)




```python
" ".join(top3)
```




    '�日数のうち５日について、会社が労働者の意見を聴取し、その意見を尊重した上で、あらかじめ時季を指定して取得させる。ただし、労働者が第３項又は第４項の規定による年次有給休暇を取得した場合においては、当該取得した日数分を５日から控除するものとする。６ 第１項及び第２項の出勤率の算定に当たっては、下記の期間については出勤したものとして取り扱う。① 年次有給休暇を取得した期間② 産前産後の休業期間③ 育児・介護休業法に基づく育児休業及び介護休業した期間④ 業務上の負傷又は疾病により療養のために休業した期間７ 付与日から１年以内に取得しなかった年次有給休暇は、付与日から２年以内に限り繰り越して取得することができる。８ 前項について、繰り越された年次有給休暇とその後付与された年次有給休暇のいずれも取得できる場合には、繰り越された年次有給休暇から取得させる。９ 会社は、毎月の賃金計算締切日における年次有給休暇の残日数を、当該賃金の支払明細書に記載して �休暇期間、慶弔休暇、病気休暇、裁判員等のための休暇の期間、休職の期間を無給とするか有給とするかについては、各事業場において決め、就業規則に定めてください。また、有給とする場合は、例えば「通常の賃金を支払う」、「基本給の○○％を支払う」とするなど、できるだけ具体的に定めてください。（臨時休業の賃金）第４４条 会社側の都合により、所定労働日に労働者を休業させた場合は、休業１日につき労基法第１２条に規定する平均賃金の６割を支給する。この場合において、１日のうちの一部を休業させた場合にあっては、その日の賃金については労基法第２６条に定めるところにより、平均賃金の６割に相当する賃金を保障する。- 62 -【第４４条 臨時休業の賃金】会社側の都合(使用者の責に帰すべき事由)により、所定労働日に労働者を休業させる場合には、平均賃金の６０％以上の休業手当を支払わなければなりません(労基法第２６条)。また、１日の所定労働時間の一部のみ使用者の責めに帰すべき事由により休業させた場合に 各労働者に通知する。【第２３条 年次有給休暇】１ 雇入れの日から６か月間継続勤務し、全労働日の８割以上出勤した労働者に対しては最低１０日の年次有給休暇を与えなければなりません（労基法第３９条第１項）。また、週の所定労働時間が３０時間未満であって、週の所定労働日数が４日以下あるいは年間の所定労働日数が２１６日以下の労働者（以下「所定労働日数が少ない者」といいます。）に対しては、通常の労働者の所定労働日数との比率を考慮して、労基則第２４条の３で定める日数以上の年次有給休暇を与えなければなりません（同条第３項）。２ 所定労働時間や所定労働日数が変動する労働者の場合、本条第１項又は第２項のいずれに該当するかに関しては、年次有給休暇の「基準日」において定められている週所定労働時間及び週所定労働日数又は年間所定労働日数によって判断することとなります。ここでいう「基準日」とは、年次有給休暇の権利が発生した日のことであり、雇入れ後６か月経過した日、その後は１年ごとの日のことをいいます。３ 年次有給休'



トップ３と言わず、similarities0.8以上などのしきい値を設けて、
トークン数が許す限りの情報を列挙してChatGPTに渡して、日本語として整形してもらうと完成度の高いChatBOTになりそうな気がします。

## 関連性順の上位で規約を絞り込む
就業規則に関する質問を受け付けて関連する回答トップ３の文字列を結合して返す関数を示します。


```python
def regulation_search(vector_df, query:str):
  """就業規則に関する質問を与えると、関連性の高い条項を検索して返す"""
  query_vector = get_embedding(query, engine="text-embedding-ada-002")
  vector_df["similarities"] = vector_df["embedding"].apply(lambda x: cosine_similarity(x, query_vector))
  top3 = vector_df.sort_values("similarities", ascending=False).text[:3].values
  return " ".join(top3)

```


```python
regulation_search(model_df, "休日は何曜日ですか")
```




    '�を参照してください。３ 休憩時間は、労働者に自由に利用させなければなりません。使用者の指示があった場合には即時に業務に従事することを求められており、労働から離れることが保障されていない状態で待機等している時間（いわゆる「手待ち時間」）については労働時間に当たり休憩時間ではありませんので注意してください。（休日）第２０条 休日は、次のとおりとする。① 土曜日及び日曜日② 国民の祝日（日曜日と重なったときは翌日）③ 年末年始（１２月 日～１月 日）④ 夏季休日（ 月 日～ 月 日）⑤ その他会社が指定する日２ 業務の都合により会社が必要と認める場合は、あらかじめ前項の休日を他の日と振り替えることがある。【第２０条 休日】１ 労基法では何曜日を休日とするかあるいは国民の祝日を休日とするかについて規定していません。１週間の中で何曜日を休日としても、また、週によって異なる曜日を休日としても差し支えありません。さらに、勤務の実態に合わせて、労働者ごとに異なる日に交替で休日を与えることもできます。２ 休日は、原則として暦日（午前０時 日は、次のとおりとする。① 日曜日② 年 月 日を起算日とする２週間ごとの第２ 土曜日③ 国民の祝日（日曜日と重なったときは翌日）④ 年末年始（１２月 日～１月 日）⑤ 夏季休日（ 月 日～ 月 日）⑥ その他会社が指定する日２ 業務の都合により会社が必要と認める場合は、あらかじめ前項の休日を他の日と振り替えることがある。【第１９条 労働時間及び休憩時間】【第２０条 休日】１ １か月単位の変形労働時間制とは、労使協定又は就業規則等により、１か月以内の一定期間を平均して１週間当たりの労働時間が４０時間を超えない定めをした場合においては、その定めにより、特定された日又は特定された週に１日８時間又は１週４０時間を超えて労働させることができるという制度です（労基法第３２条の２）。この場合の労使協定は、所轄の労働基準監督署長に届け出ることが必要です。労使協定の労働者代表の選出方法等ついては、本規程例第２１条の解説を参照してください。２ 本規程例は、１日の所定労働時間を固定していますが、業務の都合等によって日々の- 27 -所定 から午後１２時までの継続２４時間をいう。）で与えなければなりません。しかし、番方編成による交替制（８時間３交替勤務のような場合をいう。）を導入するような場合、以下の要件を満たせば休日は暦日ではなく、継続した２４時間を与えれば差し支えないとされています（昭和６３年３月１４日付け基発１５０号）。- 25 -（イ）番方編成による交替制によることが就業規則等により定められており、制度として運用されていること。（ロ）各番方の交替が規則的に定められているものであって、勤務割表等によりその都度設定されるものではないこと。３ 本条第２項において定めている、いわゆる「振替休日」とは、例えば業務の都合によって所定休日である日曜日に勤務させなければならない場合に、当該日曜日を勤務日に変更し、その代わり勤務日である例えば月曜日を休日とするように、所定の休日とあらかじめ他の勤務日と振り替えることをいいます。また、｢代休｣とは、休日に休日労働を行わせた場合に、その代わりに以後の特定の勤務日又は労働者の希望する任意の勤務日の労働義�'




```python
regulation_search(model_df, "昇給はありますか")
```




    'は解雇により離職した場合- 64 -【第４８条 賃金の非常時払い】本条は、労働者又はその収入によって生計を維持する者に出産、疾病、災害等の臨時の出費を必要とする事情が生じた場合に、当該労働者は賃金支払日前であっても既往の労働に対する賃金の払いを請求できることとしたものです（労基法第２５条）。（昇給）第４９条 昇給は、勤務成績その他が良好な労働者について、毎年 月 日をもって行うものとする。ただし、会社の業績の著しい低下その他やむを得ない事由がある場合は、行わないことがある。２ 顕著な業績が認められた労働者については、前項の規定にかかわらず昇給を行うことがある。３ 昇給額は、労働者の勤務成績等を考慮して各人ごとに決定する。【第４９条 昇給】昇給に関する事項は、就業規則の絶対的必要記載事項に当たりますので、昇給期間等昇給の条件を定める必要があります。（賞与）第５０条 賞与は、原則として、下記の算定対象期間に在籍した労働者に対し、会社の業� の取得の意向がない場合や労働者の意向が確認できない場合には、法定割増賃金率の引上げ分も含めた割増賃金（労基法第３７条により５割以上の率で計算した割増賃金）について、その割増賃金が発生した賃金計算期間の賃金支払日に支払うことが必要です。なお、法定割増賃金率の引上げ分も含めた割増賃金が支払われた後に、労働者から代替休暇の取得の意向があった場合には、代替休暇を与えることができる期間として労使協定で定めた期間内であっても、労働者は代替休暇を取得できないこととする旨労使協定で定めても差し支えありません。このような、法定割増賃金率の引上げ分も含めた割増賃金が支払われた後に労働者から代替休暇取得の意向があった場合について、・代替休暇を与えることができる期間として労使協定で定めた期間内であれば労働者は代替休暇を取得できることとし、・労働者が実際に代替休暇を取得したときは既に支払われた法定割増賃金率の引上げ分の割増賃金について精算することとすることを労使 .jp/stf/seisakunitsuite/bunya/haigusha.html（通勤手当）第３６条 通勤手当は、月額 円までの範囲内において、通勤に要する実費に相当する額を支給する。（役付手当）第３７条 役付手当は、以下の職位にある者に対し支給する。部長 月額 円課長 月額 円係長 月額 円２ 昇格によるときは、発令日の属する賃金月から支給する。この場合、当該賃金月においてそれまで属していた役付手当は支給しない。３ 降格によるときは、発令日の属する賃金月の次の賃金月から支給する。（技能・資格手当）第３８条 技能・資格手当は、次の資格を持ち、その職務に就く者に対し支給する。安全・衛生管理者（安全衛生推進者を含む。） 月額 円食品衛生責任者 月額 円調理師 月額 円栄養士 月額 円- 50 -（精勤手当）第３９条 精勤手当は、当該賃金計算期間における出勤成績により、次のとおり支給する。① 無欠勤の場合 月額 円② 欠勤１日以内の場合 月額 円２ 前項の精勤手当の計算においては、次のいずれかに該当するときは出'




```python
regulation_search(model_df, "一日何時間労働ですか")
```




    '日は特定すること。ウ 振替休日は４週４日の休日が確保される範囲のできるだけ近接した日とすること。エ 振替は前日までに通知すること。〔例２〕１か月単位の変形労働時間制（隔週週休２日制を採用する場合）の規程例〔例２〕は、１か月単位の変形労働時間制（変形期間は２週間）を活用しつつ、隔週での週休２日制で、毎日の所定労働時間を７時間１５分とすることにより、週４０時間労働制を実施する場合の規程例です。- 26 -（労働時間及び休憩時間）第１９条 １週間の所定労働時間は、 年 月 日を起算日として、２週間ごとに平均して、１週間当たり４０時間とする。２ １日の所定労働時間は、７ 時間１５分とする。３ 始業・終業の時刻及び休憩時間は、次のとおりとする。ただし、業務の都合その他やむを得ない事情により、これらを繰り上げ、又は繰り下げることがある。この場合において業務の都合によるときは、 が前日までに通知する。始業・終業時刻 休憩時間始業 午前 時 分時 分から 時 分まで終業 午後 時 分（休日）第２０条 休 週間を通じ４日以上与えなければなりません（労基法第３５条）。５ 上記２から４までの労基法の規定に適合する労働条件とするためには、①週休２日制とする、②週休１日制で１日の所定労働時間を短く設定する、③変形労働時間制（１か月単位、１年単位等）を導入する等の方法がありますので、それぞれの事業場の実情に応じて、下記の規程例を参考に就業規則を作成してください。［例１］ 完全週休２日制を採用する場合の規程例１日の労働時間を８時間とし、完全週休２日制を採用する場合の規程例です。(労働時間及び休憩時間)第１９条 労働時間は、１週間については４０時間、１日については８時間とする。２ 始業・終業の時刻及び休憩時間は、次のとおりとする。ただし、業務の都合その他やむを得ない事情により、これらを繰り上げ、又は繰り下げることがある。この場合、前日までに労働者に通知する。- 23 -① 一般勤務始業・終業時刻 休憩時間始業 午前 時 分時 分から 時 分まで終業 午後 時 分② 交替勤務（イ）１番（日勤）始業・終業時� 間に第３号の休日が含まれる場合には、その期間の第２土曜日は出勤日とする。」といった文言を追記する必要があります。- 28 -【参考】「１か月単位の変形労働時間制における所定労働時間の定め方」１か月単位の変形労働時間制については、１か月以内の一定期間（変形期間）を平均して１週間当たりの労働時間が週の法定労働時間（４０時間）を超えない範囲で、就業規則等に各日、各週の所定労働時間を具体的に定めなければなりません。この場合、変形期間における所定労働時間の合計は次の式によって計算された時間の範囲内で設定します。１週間の法定労働時間(４０時間) ×７変形期間の暦日数この式によって変形期間が１か月の場合の所定労働時間の総枠を計算すると、次の表のとおりとなります。項目１か月の暦日数各変形期間に対応する所定労働時間の総枠法定労働時間が４０時間の場合法定労働時間が４４時間の場合３１日の場合３０日の場合２９日の場合２８日の場合１７７．１時間１７１．４時間１６５．７時間１６０．０時間１９４．８時間１８８．５時間１８２．２時間１７６．０時間（注）小数点第２位以下を省略。-'



回答はmilisecオーダーで返ってきて軽快です。関連条項を抽出する前は文字列のベクトル化の比較を行っているだけなので、OpenAI APIを使っていません。つまり、一度お金をかけてモデルを作ってしまえば、回答の抽出は無料です。


```python
regulation_search(model_df, "退職金の計算方法")
```




    '計算及び支払の方法、支払の時期などを就業規則に記載しなければなりません。（退職金の額）第５５条 退職金の額は、退職又は解雇の時の基本給の額に、勤続年数に応じて定めた下表の支給率を乗じた金額とする。勤続年数 支給率5 年未満 1.05 年～10 年 3.011 年～15 年 5.016 年～20 年 7.021 年～25 年 10.026 年～30 年 15.031 年～35 年 17.036 年～40 年 20.041 年～ 25.0２ 第９条により休職する期間については、会社の都合による場合を除き、前項の勤続年数に算入しない。- 75 -【第５５条 退職金の額】本規程例では、退職金の額の算定は、退職又は解雇の時の基本給と勤続年数に応じて算出する例を示していますが、会社に対する功績の度合い等も考慮して決定する方法も考えられることから、各企業の実情に応じて決めてください。（退職金の支払方法及び支払時期）第５６条 退職金は、支給事由の生じた日から か月以内に、退職した労働者（死亡による退職の場合はその遺族）に対して支払う。【第５６条 退職金の支払方法及� は退職した労働者については、月額の賃金は当該計算期間の所定労働日数を基準に日割計算して支払う。【第４６条 賃金の計算期間及び支払日】賃金は、毎月１回以上、一定の支払日を定めて支払うことが必要です（労基法第２４- 63 -条第２項）。（賃金の支払と控除）第４７条 賃金は、労働者に対し、通貨で直接その全額を支払う。２ 前項について、労働者が同意した場合は、労働者本人の指定する金融機関の預貯金口座又は証券総合口座へ振込により賃金を支払う。３ 次に掲げるものは、賃金から控除する。① 源泉所得税② 住民税③ 健康保険、厚生年金保険及び雇用保険の保険料の被保険者負担分④ 労働者代表との書面による協定により賃金から控除することとした社宅入居料、財形貯蓄の積立金及び組合費【第４７条 賃金の支払と控除】１ 賃金は、通貨で、直接労働者にその全額を支払わなければなりません（労基法第２４条第１項）。ただし､所得税や住民税等法令に基� （家族手当）第３６条（通勤手当）第３７条（役付手当）第３８条（技能・資格手当）第３９条（精勤手当）第４０条（割増賃金）第４１条（１年単位の変形労働時間制に関する賃金の精算）８第４２条（代替休暇）第４３条（休暇等の賃金）第４４条（臨時休業の賃金）第４５条（欠勤等の扱い）第４６条（賃金の計算期間及び支払日）第４７条（賃金の支払と控除）第４８条（賃金の非常時払い）第４９条（昇給）第５０条（賞与）第７章 定年、退職及び解雇………………………………………６６第５１条（定年等）[例１] 定年を満６５歳とする例[例２] 定年を満６０歳とし、その後希望者を再雇用する例［例３］ 定年を満６０歳とし、その後希望者を継続雇用する例（満６５歳以降は対象者基準あり）［例４］ 定年を満６５歳とし、その後希望者の意向を踏まえて継続雇用または業務委託契約を締結する例（ともに対象者基準あり）第５２条（退職）第５３条（解雇）第８章 退職金………………………………………………………７４第５４条（退職金の支給）第５５条（退職金の額'



## 関連性で規約を絞りこむ
一定数以上の関連性がある規約のみを抜き出します。`threshold`の数値はデフォルト値を設定することなく、データに対してケース・バイ・ケースで定めていったほうが良いと思います。


```python
def regulation_search(vector_df, query:str, threshold:int , verbose=False) -> list[str]:
  """就業規則に関する質問を与えると、関連性の高い条項を検索して返す
  verbose=Trueでテキストと類似度を表示する。
  """
  query_vector = get_embedding(query, engine="text-embedding-ada-002")
  vector_df["similarities"] = vector_df["embedding"].apply(lambda x: cosine_similarity(x, query_vector))
  df = vector_df.sort_values("similarities", ascending=False)  # 関連性順にソート
  df = df[df.similarities >= threshold]  # 関連性の高いものだけ抽出
  if verbose:
    print(df.loc[:,["text", "similarities"]])
  return df.text.values

# regulation_search()をDataFrameのメソッドとして扱う
setattr(pd.DataFrame, "regulation_search", regulation_search)
```


```python
model_df.regulation_search("休暇は何曜日？", 0.83, verbose=True)
```

                                                     text  similarities
    36  �を参照してください。３ 休憩時間は、労働者に自由に利用させなければなりません。使用者の指示...      0.855339
    40  日は、次のとおりとする。① 日曜日② 年 月 日を起算日とする２週間ごとの第２ 土曜日③ 国...      0.849223
    37  から午後１２時までの継続２４時間をいう。）で与えなければなりません。しかし、番方編成による交...      0.837221
    39  日は特定すること。ウ 振替休日は４週４日の休日が確保される範囲のできるだけ近接した日とするこ...      0.830503
    42  間に第３号の休日が含まれる場合には、その期間の第２土曜日は出勤日とする。」といった文言を追記...      0.830246





    array(['�を参照してください。３ 休憩時間は、労働者に自由に利用させなければなりません。使用者の指示があった場合には即時に業務に従事することを求められており、労働から離れることが保障されていない状態で待機等している時間（いわゆる「手待ち時間」）については労働時間に当たり休憩時間ではありませんので注意してください。（休日）第２０条 休日は、次のとおりとする。① 土曜日及び日曜日② 国民の祝日（日曜日と重なったときは翌日）③ 年末年始（１２月 日～１月 日）④ 夏季休日（ 月 日～ 月 日）⑤ その他会社が指定する日２ 業務の都合により会社が必要と認める場合は、あらかじめ前項の休日を他の日と振り替えることがある。【第２０条 休日】１ 労基法では何曜日を休日とするかあるいは国民の祝日を休日とするかについて規定していません。１週間の中で何曜日を休日としても、また、週によって異なる曜日を休日としても差し支えありません。さらに、勤務の実態に合わせて、労働者ごとに異なる日に交替で休日を与えることもできます。２ 休日は、原則として暦日（午前０時',
           '日は、次のとおりとする。① 日曜日② 年 月 日を起算日とする２週間ごとの第２ 土曜日③ 国民の祝日（日曜日と重なったときは翌日）④ 年末年始（１２月 日～１月 日）⑤ 夏季休日（ 月 日～ 月 日）⑥ その他会社が指定する日２ 業務の都合により会社が必要と認める場合は、あらかじめ前項の休日を他の日と振り替えることがある。【第１９条 労働時間及び休憩時間】【第２０条 休日】１ １か月単位の変形労働時間制とは、労使協定又は就業規則等により、１か月以内の一定期間を平均して１週間当たりの労働時間が４０時間を超えない定めをした場合においては、その定めにより、特定された日又は特定された週に１日８時間又は１週４０時間を超えて労働させることができるという制度です（労基法第３２条の２）。この場合の労使協定は、所轄の労働基準監督署長に届け出ることが必要です。労使協定の労働者代表の選出方法等ついては、本規程例第２１条の解説を参照してください。２ 本規程例は、１日の所定労働時間を固定していますが、業務の都合等によって日々の- 27 -所定',
           'から午後１２時までの継続２４時間をいう。）で与えなければなりません。しかし、番方編成による交替制（８時間３交替勤務のような場合をいう。）を導入するような場合、以下の要件を満たせば休日は暦日ではなく、継続した２４時間を与えれば差し支えないとされています（昭和６３年３月１４日付け基発１５０号）。- 25 -（イ）番方編成による交替制によることが就業規則等により定められており、制度として運用されていること。（ロ）各番方の交替が規則的に定められているものであって、勤務割表等によりその都度設定されるものではないこと。３ 本条第２項において定めている、いわゆる「振替休日」とは、例えば業務の都合によって所定休日である日曜日に勤務させなければならない場合に、当該日曜日を勤務日に変更し、その代わり勤務日である例えば月曜日を休日とするように、所定の休日とあらかじめ他の勤務日と振り替えることをいいます。また、｢代休｣とは、休日に休日労働を行わせた場合に、その代わりに以後の特定の勤務日又は労働者の希望する任意の勤務日の労働義�',
           '日は特定すること。ウ 振替休日は４週４日の休日が確保される範囲のできるだけ近接した日とすること。エ 振替は前日までに通知すること。〔例２〕１か月単位の変形労働時間制（隔週週休２日制を採用する場合）の規程例〔例２〕は、１か月単位の変形労働時間制（変形期間は２週間）を活用しつつ、隔週での週休２日制で、毎日の所定労働時間を７時間１５分とすることにより、週４０時間労働制を実施する場合の規程例です。- 26 -（労働時間及び休憩時間）第１９条 １週間の所定労働時間は、 年 月 日を起算日として、２週間ごとに平均して、１週間当たり４０時間とする。２ １日の所定労働時間は、７ 時間１５分とする。３ 始業・終業の時刻及び休憩時間は、次のとおりとする。ただし、業務の都合その他やむを得ない事情により、これらを繰り上げ、又は繰り下げることがある。この場合において業務の都合によるときは、 が前日までに通知する。始業・終業時刻 休憩時間始業 午前 時 分時 分から 時 分まで終業 午後 時 分（休日）第２０条 休',
           '間に第３号の休日が含まれる場合には、その期間の第２土曜日は出勤日とする。」といった文言を追記する必要があります。- 28 -【参考】「１か月単位の変形労働時間制における所定労働時間の定め方」１か月単位の変形労働時間制については、１か月以内の一定期間（変形期間）を平均して１週間当たりの労働時間が週の法定労働時間（４０時間）を超えない範囲で、就業規則等に各日、各週の所定労働時間を具体的に定めなければなりません。この場合、変形期間における所定労働時間の合計は次の式によって計算された時間の範囲内で設定します。１週間の法定労働時間(４０時間) ×７変形期間の暦日数この式によって変形期間が１か月の場合の所定労働時間の総枠を計算すると、次の表のとおりとなります。項目１か月の暦日数各変形期間に対応する所定労働時間の総枠法定労働時間が４０時間の場合法定労働時間が４４時間の場合３１日の場合３０日の場合２９日の場合２８日の場合１７７．１時間１７１．４時間１６５．７時間１６０．０時間１９４．８時間１８８．５時間１８２．２時間１７６．０時間（注）小数点第２位以下を省略。-'],
          dtype=object)




```python
model_df.regulation_search("昇給について", 0.83, True)
```

                                                      text  similarities
    105  は解雇により離職した場合- 64 -【第４８条 賃金の非常時払い】本条は、労働者又はその収入...      0.858673
    97   の取得の意向がない場合や労働者の意向が確認できない場合には、法定割増賃金率の引上げ分も含めた...      0.845327
    77   �督署長への届出が必要となります。（賃金の構成）第３３条 賃金の構成は、次のとおりとする。基...      0.842956
    99   ったときには、取得しなかった代替休暇に対応する時間の労働については、法定割増賃金率の引上げ分...      0.838204
    98   協定で定めることも可能です。- 60 -（図２）・賃金締切日が月末 ・代替休暇を取得しなかっ...      0.837501
    1    �以上に分けて交替に就業させる場合においては就業時転換に関する事項（２） 賃金関係賃金の決定...      0.835884
    80   .jp/stf/seisakunitsuite/bunya/haigusha.html（通勤...      0.835811
    9    （家族手当）第３６条（通勤手当）第３７条（役付手当）第３８条（技能・資格手当）第３９条（精勤...      0.835159
    123  本契約を更新しないことが合意されていたため・ 契約締結当初から、更新回数の上限を設けており、...      0.834659
    86   超えて労働させた場合には２割５分以上、法定休日（週１回又は４週４日）に労働させた場合には３割...      0.833788





    array(['は解雇により離職した場合- 64 -【第４８条 賃金の非常時払い】本条は、労働者又はその収入によって生計を維持する者に出産、疾病、災害等の臨時の出費を必要とする事情が生じた場合に、当該労働者は賃金支払日前であっても既往の労働に対する賃金の払いを請求できることとしたものです（労基法第２５条）。（昇給）第４９条 昇給は、勤務成績その他が良好な労働者について、毎年 月 日をもって行うものとする。ただし、会社の業績の著しい低下その他やむを得ない事由がある場合は、行わないことがある。２ 顕著な業績が認められた労働者については、前項の規定にかかわらず昇給を行うことがある。３ 昇給額は、労働者の勤務成績等を考慮して各人ごとに決定する。【第４９条 昇給】昇給に関する事項は、就業規則の絶対的必要記載事項に当たりますので、昇給期間等昇給の条件を定める必要があります。（賞与）第５０条 賞与は、原則として、下記の算定対象期間に在籍した労働者に対し、会社の業�',
           'の取得の意向がない場合や労働者の意向が確認できない場合には、法定割増賃金率の引上げ分も含めた割増賃金（労基法第３７条により５割以上の率で計算した割増賃金）について、その割増賃金が発生した賃金計算期間の賃金支払日に支払うことが必要です。なお、法定割増賃金率の引上げ分も含めた割増賃金が支払われた後に、労働者から代替休暇の取得の意向があった場合には、代替休暇を与えることができる期間として労使協定で定めた期間内であっても、労働者は代替休暇を取得できないこととする旨労使協定で定めても差し支えありません。このような、法定割増賃金率の引上げ分も含めた割増賃金が支払われた後に労働者から代替休暇取得の意向があった場合について、・代替休暇を与えることができる期間として労使協定で定めた期間内であれば労働者は代替休暇を取得できることとし、・労働者が実際に代替休暇を取得したときは既に支払われた法定割増賃金率の引上げ分の割増賃金について精算することとすることを労使',
           '�督署長への届出が必要となります。（賃金の構成）第３３条 賃金の構成は、次のとおりとする。基本給家族手当通勤手当賃金 手 当 役付手当技能・資格手当精勤手当時間外労働割増賃金割増賃金 休日労働割増賃金深夜労働割増賃金【第３３条 賃金の構成】賃金の決定、計算及び支払の方法、賃金の締切及び支払の時期並びに昇給に関する事項は、就業規則の絶対的記載事項に当たります。（労基法第８９条）。（基本給）第３４条 基本給は、本人の職務内容、技能、勤務成績、年齢等を考慮して各人別に決定する。【第３４条 基本給】１ 基本給は、職務内容や職務遂行能力等の職務に関する要素や勤続年数、年齢、資格、学歴等の属人的な要素等を考慮して、各事業場において公正に決めることが大切です。２ 基本給には、月給（１か月の所定労働時間に対して賃金額が決められているもの）、日- 48 -給月給（定額賃金制の一形態で、月給を定め、欠勤した場',
           'ったときには、取得しなかった代替休暇に対応する時間の労働については、法定割増賃金率の引上げ分の割増賃金の支払が必要となります。賃金支払日５０％の割増賃金の支払４月 ５月 ６月 ７月１５日月６０時間を超える時間外労働意向確認取得の意向なし賃金支払日２５％の割増賃金の支払４月 ５月 ６月 ７月１５日代替休暇の取得月６０時間を超える時間外労働意向確認取得の意向あり- 61 -５ 代替休暇と年次有給休暇との関係代替休暇は、年次有給休暇とは異なるものです。また、労働者が代替休暇を取得して終日出勤しなかった日については、正当な手続により労働者が労働義務を免除された日であることから、年次有給休暇の算定の基礎となる全労働日に含まれません。（休暇等の賃金）第４３条 年次有給休暇の期間は、所定労働時間労働したときに支払われる通常の賃金を支払う。２ 産前産後の休業期間、育児時間、生理休暇、母性健康管理のための休暇、育児・介護休業法に基づ',
           '協定で定めることも可能です。- 60 -（図２）・賃金締切日が月末 ・代替休暇を取得しなかった場合の割増賃金率５０％・賃金支払日が翌月１５日 ・代替休暇を取得した場合の割増賃金率２５％・代替休暇は２か月以内に取得 とされている事業場の場合の例（ａ）労働者に代替休暇取得の意向がある場合（ｂ）（ａ）以外の場合（労働者に代替休暇取得の意向がない場合や労働者の意向が確認できない場合等）４ 法定割増賃金率の引上げ分の割増賃金の支払が不要となる時間代替休暇は、法定割増賃金率の引上げ分の割増賃金の支払に代えて与えられるものであることから、法定割増賃金率の引上げ分の割増賃金の支払が不要となる時間は、１か月に６０時間を超える時間外労働のうち労働者が取得した代替休暇に対応する時間の労働となります。具体的には、労働者が取得した代替休暇の時間数を換算率で除して得た時間数のことを指します。したがって、代替休暇の取得の意向があった労働者が実際には代替休暇を取得しなか',
           '�以上に分けて交替に就業させる場合においては就業時転換に関する事項（２） 賃金関係賃金の決定、計算及び支払の方法、賃金の締切り及び支払の時期並びに昇給に関する事項（３） 退職関係退職に関する事項（解雇の事由を含みます。）相対的必要記載事項は次のとおりです。（１） 退職手当関係適用される労働者の範囲、退職手当の決定、計算及び支払の方法並びに退職手当の支払の時期に関する事項（２） 臨時の賃金・最低賃金額関係臨時の賃金等(退職手当を除きます。)及び最低賃金額に関する事項（３） 費用負担関係３労働者に食費、作業用品その他の負担をさせることに関する事項（４） 安全衛生関係安全及び衛生に関する事項（５） 職業訓練関係職業訓練に関する事項（６） 災害補償・業務外の傷病扶助関係災害補償及び業務外の傷病扶助に関する事項（７） 表彰・制裁関係表彰及び制裁の種類及び程度に関する事項（８） ',
           '.jp/stf/seisakunitsuite/bunya/haigusha.html（通勤手当）第３６条 通勤手当は、月額 円までの範囲内において、通勤に要する実費に相当する額を支給する。（役付手当）第３７条 役付手当は、以下の職位にある者に対し支給する。部長 月額 円課長 月額 円係長 月額 円２ 昇格によるときは、発令日の属する賃金月から支給する。この場合、当該賃金月においてそれまで属していた役付手当は支給しない。３ 降格によるときは、発令日の属する賃金月の次の賃金月から支給する。（技能・資格手当）第３８条 技能・資格手当は、次の資格を持ち、その職務に就く者に対し支給する。安全・衛生管理者（安全衛生推進者を含む。） 月額 円食品衛生責任者 月額 円調理師 月額 円栄養士 月額 円- 50 -（精勤手当）第３９条 精勤手当は、当該賃金計算期間における出勤成績により、次のとおり支給する。① 無欠勤の場合 月額 円② 欠勤１日以内の場合 月額 円２ 前項の精勤手当の計算においては、次のいずれかに該当するときは出',
           '（家族手当）第３６条（通勤手当）第３７条（役付手当）第３８条（技能・資格手当）第３９条（精勤手当）第４０条（割増賃金）第４１条（１年単位の変形労働時間制に関する賃金の精算）８第４２条（代替休暇）第４３条（休暇等の賃金）第４４条（臨時休業の賃金）第４５条（欠勤等の扱い）第４６条（賃金の計算期間及び支払日）第４７条（賃金の支払と控除）第４８条（賃金の非常時払い）第４９条（昇給）第５０条（賞与）第７章 定年、退職及び解雇………………………………………６６第５１条（定年等）[例１] 定年を満６５歳とする例[例２] 定年を満６０歳とし、その後希望者を再雇用する例［例３］ 定年を満６０歳とし、その後希望者を継続雇用する例（満６５歳以降は対象者基準あり）［例４］ 定年を満６５歳とし、その後希望者の意向を踏まえて継続雇用または業務委託契約を締結する例（ともに対象者基準あり）第５２条（退職）第５３条（解雇）第８章 退職金………………………………………………………７４第５４条（退職金の支給）第５５条（退職金の額',
           '本契約を更新しないことが合意されていたため・ 契約締結当初から、更新回数の上限を設けており、本契約はその上限に係るものであるため・ 担当していた業務が終了・中止したため・ 事業縮小のため・ 業務を遂行する能力が十分ではないと認められるため・ 職務命令に対する違反行為を行ったこと、無断欠勤をしたことなど勤務不良のため- 74 -第８章 退職金（退職金の支給）第５４条 勤続 年以上の労働者が退職し又は解雇されたときは、この章に定めるところにより退職金を支給する。ただし、自己都合による退職者で、勤続 年未満の者には退職金を支給しない。また、第６７条第２項により懲戒解雇された者には、退職金の全部又は一部を支給しないことがある。２ 継続雇用制度の対象者については、定年時に退職金を支給することとし、その後の再雇用については退職金を支給しない。【第５４条 退職金の支給】退職金制度は必ず設けなければならないものではありませんが、設けたときは、適用される労働者の範囲、退職金の支給要件、額の',
           '超えて労働させた場合には２割５分以上、法定休日（週１回又は４週４日）に労働させた場合には３割５分以上、深夜（午後１０時から午前５時までの間）に労働させた場合には２割５分以上の割増率で計算した割増賃金をそれぞれ支払わなければなりません（労基法第３７条第１項・第４項）。なお、時間外労働が深夜に及んだ場合には５割以上、休日労働が深夜に及んだ場合には６割以上の割増率で計算した割増賃金をそれぞれ支払わなければなりません。２ 会社の定める所定労働時間が法定労働時間よりも短い場合、所定労働時間を超えて法定労働時間に達するまでの時間分については、労基法を上回る措置として割増賃金を支払う契約となっていない限り、通常の労働時間の賃金を支払えばよいこととなります。３ 月給制の場合の割増賃金の計算の基礎となる１時間当たりの賃金は、基本給と手当（本規程例の場合、役付手当、技能・資格手当及び精勤手当が該当します。家族手当や通勤手当等割増賃金の算定基礎から除外することができる手当は除きます。）の合計を、１'],
          dtype=object)




```python
model_df.regulation_search("有給休暇は何日ですか", 0.85, True)
```

                                                      text  similarities
    62   各労働者に通知する。【第２３条 年次有給休暇】１ 雇入れの日から６か月間継続勤務し、全労働日...      0.867449
    61   �日数のうち５日について、会社が労働者の意見を聴取し、その意見を尊重した上で、あらかじめ時季...      0.867236
    59   保する方法も考えられます。- 38 -第５章 休暇等年次有給休暇等法定の休暇のみならず、会社...      0.864343
    66   できます（労基法第３９条第５項）。- 41 -１１ 本条第４項に定める年次有給休暇の計画的付...      0.861871
    101  �休暇期間、慶弔休暇、病気休暇、裁判員等のための休暇の期間、休職の期間を無給とするか有給とす...      0.860870
    37   から午後１２時までの継続２４時間をいう。）で与えなければなりません。しかし、番方編成による交...      0.860521
    60   働日数1 年間の所定労働日数勤 続 期 間6か月1 年6か月2 年6か月3 年6か月4 年6...      0.860146
    36   �を参照してください。３ 休憩時間は、労働者に自由に利用させなければなりません。使用者の指示...      0.858366
    91   い端数がある場合には、その満たない部分についても有給の休暇とし、半日又は１日の休暇として与え...      0.857291
    40   日は、次のとおりとする。① 日曜日② 年 月 日を起算日とする２週間ごとの第２ 土曜日③ 国...      0.856661
    95   �暇を与えることができる期間については、時間外労働が１か月に６０時間を超えたその月の末日の翌...      0.856618
    65   次有給休暇の出勤率の算定に当たって出勤したものとみなすことも、もちろん差し支えありません。８...      0.855643
    94   がって具体的に定める必要があります。また、上記（ア）労働者が代替休暇を取得しなかった場合に支...      0.853070
    63   暇の基準日を個々の労働者の採用日に関係なく統一的に定めることもできます。この場合、勤務期間の...      0.852955
    39   日は特定すること。ウ 振替休日は４週４日の休日が確保される範囲のできるだけ近接した日とするこ...      0.852094
    96   、労働者の意思に委ねられていますので、代替休暇の取得日は、労働者の意向を踏まえたものとしなけ...      0.851352
    68   就業規則等に定めることが必要です（労基法第３９条第７項）。３ 労使協定に規定しなければならな...      0.850659





    array(['各労働者に通知する。【第２３条 年次有給休暇】１ 雇入れの日から６か月間継続勤務し、全労働日の８割以上出勤した労働者に対しては最低１０日の年次有給休暇を与えなければなりません（労基法第３９条第１項）。また、週の所定労働時間が３０時間未満であって、週の所定労働日数が４日以下あるいは年間の所定労働日数が２１６日以下の労働者（以下「所定労働日数が少ない者」といいます。）に対しては、通常の労働者の所定労働日数との比率を考慮して、労基則第２４条の３で定める日数以上の年次有給休暇を与えなければなりません（同条第３項）。２ 所定労働時間や所定労働日数が変動する労働者の場合、本条第１項又は第２項のいずれに該当するかに関しては、年次有給休暇の「基準日」において定められている週所定労働時間及び週所定労働日数又は年間所定労働日数によって判断することとなります。ここでいう「基準日」とは、年次有給休暇の権利が発生した日のことであり、雇入れ後６か月経過した日、その後は１年ごとの日のことをいいます。３ 年次有給休',
           '�日数のうち５日について、会社が労働者の意見を聴取し、その意見を尊重した上で、あらかじめ時季を指定して取得させる。ただし、労働者が第３項又は第４項の規定による年次有給休暇を取得した場合においては、当該取得した日数分を５日から控除するものとする。６ 第１項及び第２項の出勤率の算定に当たっては、下記の期間については出勤したものとして取り扱う。① 年次有給休暇を取得した期間② 産前産後の休業期間③ 育児・介護休業法に基づく育児休業及び介護休業した期間④ 業務上の負傷又は疾病により療養のために休業した期間７ 付与日から１年以内に取得しなかった年次有給休暇は、付与日から２年以内に限り繰り越して取得することができる。８ 前項について、繰り越された年次有給休暇とその後付与された年次有給休暇のいずれも取得できる場合には、繰り越された年次有給休暇から取得させる。９ 会社は、毎月の賃金計算締切日における年次有給休暇の残日数を、当該賃金の支払明細書に記載して',
           '保する方法も考えられます。- 38 -第５章 休暇等年次有給休暇等法定の休暇のみならず、会社で設けている休暇については就業規則に必ず定めることが必要です。（年次有給休暇）第２３条 採用日から６か月間継続勤務し、所定労働日の８割以上出勤した労働者に対しては、１０日の年次有給休暇を与える。その後１年間継続勤務するごとに、当該１年間において所定労働日の８割以上出勤した労働者に対しては、下の表のとおり勤続期間に応じた日数の年次有給休暇を与える。勤続期間 6 か月１年6 か月2 年6 か月3 年6 か月4 年6 か月5 年6 か月6 年6 か月以上付与日数 10 日 11 日 12 日 14 日 16 日 18 日 20 日２ 前項の規定にかかわらず、週所定労働時間３０時間未満であり、かつ、週所定労働日数が４日以下（週以外の期間によって所定労働日数を定める労働者については年間所定労働日数が２１６日以下）の労働者に対しては、下の表のとおり所定労働日数及び勤続期間に応じた日数の年次有給休暇を与える。週所定労',
           'できます（労基法第３９条第５項）。- 41 -１１ 本条第４項に定める年次有給休暇の計画的付与制度とは、労働者代表との間で労使協定を結んだ場合、最低５日間は労働者が自由に取得できる日数として残し、５日を超える部分について、協定で年次有給休暇を与える時季を定めて労働者に計画的に取得させるものです（労基法第３９条第６項）。１２ 年次有給休暇を取得した労働者に対して、賃金の減額や精皆勤手当、賞与の額の算定に際しての年次有給休暇取得日を欠勤として取扱う等の不利益な取扱いをしてはいけません（労基法附則第１３６条）。（年次有給休暇の時間単位での付与 ）第２４条 労働者代表との書面による協定に基づき、前条の年次有給休暇の日数のうち、１年について５日の範囲で次により時間単位の年次有給休暇（以下「時間単位年休」という。）を付与する。（１）時間単位年休付与の対象者は、すべての労働者とする。（２）時間単位年休を取得する場合の、１日の年次有給休暇に相当する時間数は、以下のとおりとする。① 所定労働時間が５ �',
           '�休暇期間、慶弔休暇、病気休暇、裁判員等のための休暇の期間、休職の期間を無給とするか有給とするかについては、各事業場において決め、就業規則に定めてください。また、有給とする場合は、例えば「通常の賃金を支払う」、「基本給の○○％を支払う」とするなど、できるだけ具体的に定めてください。（臨時休業の賃金）第４４条 会社側の都合により、所定労働日に労働者を休業させた場合は、休業１日につき労基法第１２条に規定する平均賃金の６割を支給する。この場合において、１日のうちの一部を休業させた場合にあっては、その日の賃金については労基法第２６条に定めるところにより、平均賃金の６割に相当する賃金を保障する。- 62 -【第４４条 臨時休業の賃金】会社側の都合(使用者の責に帰すべき事由)により、所定労働日に労働者を休業させる場合には、平均賃金の６０％以上の休業手当を支払わなければなりません(労基法第２６条)。また、１日の所定労働時間の一部のみ使用者の責めに帰すべき事由により休業させた場合に',
           'から午後１２時までの継続２４時間をいう。）で与えなければなりません。しかし、番方編成による交替制（８時間３交替勤務のような場合をいう。）を導入するような場合、以下の要件を満たせば休日は暦日ではなく、継続した２４時間を与えれば差し支えないとされています（昭和６３年３月１４日付け基発１５０号）。- 25 -（イ）番方編成による交替制によることが就業規則等により定められており、制度として運用されていること。（ロ）各番方の交替が規則的に定められているものであって、勤務割表等によりその都度設定されるものではないこと。３ 本条第２項において定めている、いわゆる「振替休日」とは、例えば業務の都合によって所定休日である日曜日に勤務させなければならない場合に、当該日曜日を勤務日に変更し、その代わり勤務日である例えば月曜日を休日とするように、所定の休日とあらかじめ他の勤務日と振り替えることをいいます。また、｢代休｣とは、休日に休日労働を行わせた場合に、その代わりに以後の特定の勤務日又は労働者の希望する任意の勤務日の労働義�',
           '働日数1 年間の所定労働日数勤 続 期 間6か月1 年6か月2 年6か月3 年6か月4 年6か月5 年6か月6 年6 か月以上4 日 169 日～216 日 7 日 8 日 9 日 10 日 12 日 13 日 15 日3 日 121 日～168 日 5 日 6 日 6 日 8 日 9 日 10 日 11 日2 日 73 日～120 日 3 日 4 日 4 日 5 日 6 日 6 日 7 日1 日 48 日～72 日 1 日 2 日 2 日 2 日 3 日 3 日 3 日３ 第１項又は第２項の年次有給休暇は、労働者があらかじめ請求する時季に取得させる。ただし、労働者が請求した時季に年次有給休暇を取得させることが事業の正常な運営を妨げる場合は、他の時季に取得させることがある。４ 前項の規定にかかわらず、労働者代表との書面による協定により、各労働者の有する年次有給休暇日数のうち５日を超える部分について、あらかじめ時季を指定して取得させることがある。- 39 -５ 第１項又は第２項の年次有給休暇が 10 日以上与えられた労働者に対しては、第３項の規定にかかわらず、付与日から１年以内に、当該労働者の有する年次有給休�',
           '�を参照してください。３ 休憩時間は、労働者に自由に利用させなければなりません。使用者の指示があった場合には即時に業務に従事することを求められており、労働から離れることが保障されていない状態で待機等している時間（いわゆる「手待ち時間」）については労働時間に当たり休憩時間ではありませんので注意してください。（休日）第２０条 休日は、次のとおりとする。① 土曜日及び日曜日② 国民の祝日（日曜日と重なったときは翌日）③ 年末年始（１２月 日～１月 日）④ 夏季休日（ 月 日～ 月 日）⑤ その他会社が指定する日２ 業務の都合により会社が必要と認める場合は、あらかじめ前項の休日を他の日と振り替えることがある。【第２０条 休日】１ 労基法では何曜日を休日とするかあるいは国民の祝日を休日とするかについて規定していません。１週間の中で何曜日を休日としても、また、週によって異なる曜日を休日としても差し支えありません。さらに、勤務の実態に合わせて、労働者ごとに異なる日に交替で休日を与えることもできます。２ 休日は、原則として暦日（午前０時',
           'い端数がある場合には、その満たない部分についても有給の休暇とし、半日又は１日の休暇として与えることができる。ただし、前項の割増賃金の支払を要しないこととなる時間の計算においては、代替休暇の時間数を上回って休暇とした部分は算定せず、代替休暇の時間数のみで計算することとする。- 57 -６ 代替休暇を取得しようとする者は、１か月に６０時間を超える時間外労働を行った月の賃金締切日の翌日から５ 日以内に、会社に申し出ることとする。代替休暇取得日は、労働者の意向を踏まえ決定することとする。７ 会社は、前項の申出があった場合には、支払うべき割増賃金額のうち代替休暇に代替される割増賃金額を除いた部分を通常の賃金支払日に支払うこととする。ただし、当該月の末日の翌日から２ か月以内に取得がなされなかった場合には、取得がなされないことが確定した月に係る賃金支払日に残りの１５％の割増賃金を支払うこととする。８ 会社は、第６項に定める期間内に申出がなかった場合は、当該月に行われた時間外労働に係る割増賃',
           '日は、次のとおりとする。① 日曜日② 年 月 日を起算日とする２週間ごとの第２ 土曜日③ 国民の祝日（日曜日と重なったときは翌日）④ 年末年始（１２月 日～１月 日）⑤ 夏季休日（ 月 日～ 月 日）⑥ その他会社が指定する日２ 業務の都合により会社が必要と認める場合は、あらかじめ前項の休日を他の日と振り替えることがある。【第１９条 労働時間及び休憩時間】【第２０条 休日】１ １か月単位の変形労働時間制とは、労使協定又は就業規則等により、１か月以内の一定期間を平均して１週間当たりの労働時間が４０時間を超えない定めをした場合においては、その定めにより、特定された日又は特定された週に１日８時間又は１週４０時間を超えて労働させることができるという制度です（労基法第３２条の２）。この場合の労使協定は、所轄の労働基準監督署長に届け出ることが必要です。労使協定の労働者代表の選出方法等ついては、本規程例第２１条の解説を参照してください。２ 本規程例は、１日の所定労働時間を固定していますが、業務の都合等によって日々の- 27 -所定',
           '�暇を与えることができる期間については、時間外労働が１か月に６０時間を超えたその月の末日の翌日から２か月以内とされており、労使協定では、この範囲内で期間を定める必要があります。（４）代替休暇の取得日及び割増賃金の支払日代替休暇の労使協定については、上記（１）から（３）までの事項を必ず定める必代替休暇として与えることができる時間数１か月の時間外労働時間数 ①換算率 ②換算率 ②労働者が代替休暇を取得しなかった場合に支払う割増賃金率（５割以上） （ア）労働者が代替休暇を取得した場合に支払う割増賃金率（２割５分以上） （イ）- 59 -要があります（労基則第１９条の２）が、このほか労使協定で定めるべきものとしては、次のものが考えられます。① 労働者の意向を踏まえた代替休暇の取得日の決定方法例えば、月末から５日以内に使用者が労働者に代替休暇を取得するか否かを確認し、取得の意向がある場合には取得日を決定するというように、取得日の決定の方法について協定しておきましょう。ただし、代替休暇を取得するかどうかは',
           '次有給休暇の出勤率の算定に当たって出勤したものとみなすことも、もちろん差し支えありません。８ 出勤率が８割に達しなかったときの翌年度は、年次有給休暇を与えなくても差し支えありません。この場合、年次有給休暇を与えなかった年度の出勤率が８割以上となったときは、次の年度には本条に定める継続勤務期間に応じた日数の年次有給休暇を与えなければなりません。９ 年次有給休暇は日単位で取得することが原則ですが、労働者が希望し、使用者が同意した場合であれば半日単位で与えることが可能です。また、事前に年次有給休暇を買い上げて労働者に休暇を与えないことは法違反となります。なお、年次有給休暇の請求権は、消滅時効が２年間であるため、前年度分について繰り越す必要があります。１０ 年次有給休暇は、計画的付与の場合を除き、労働者の請求する時季に与えなければなりません。ただし、労働者が請求した時季に年次有給休暇を与えることが事業の正常な運営を妨げる場合においては、使用者は他の時季に変更することが',
           'がって具体的に定める必要があります。また、上記（ア）労働者が代替休暇を取得しなかった場合に支払う割増賃金率は５割以上の率とする必要があり、上記（イ）労働者が代替休暇を取得した場合に支払う割増賃金率は２割５分以上の率とする必要があります。これらは、いずれも就業規則の絶対的必要記載事項である「賃金の決定、計算及び支払の方法」に当たることから、就業規則に記載しなければなりません。（２）代替休暇の単位代替休暇の単位は、代替休暇はまとまった単位で与えることによって労働者の休息の機会とする観点から、１日又は半日とされており、労使協定には、その一方又は両方を代替休暇の単位として定める必要があります。ここでいう「１日」とは、労働者の１日の所定労働時間をいい、「半日」とはその二分の一をいいますが、「半日」については、必ずしも厳密に１日の所定労働時間の二分の一とする必要はありません。しかし、その場合には、労使協定で当該事業場における「半日」の定義を定めておくことが必要です。（３）代替休暇を与えることができる期間代替�',
           '暇の基準日を個々の労働者の採用日に関係なく統一的に定めることもできます。この場合、勤務期間の切捨ては認められず、常に切り上げなければなりません。例えば、基準日を４月１日に統一した場合には、その年の１月１日に採用した労働者についても３か月間継続勤務した後の４月１日の時点、すなわち法定の場合よりも３か月間前倒しで初年度の年次有給休暇を付与しなければなりません。- 40 -４ 使用者は、年１０日以上の年次有給休暇が付与される労働者に対して、そのうち５日については、基準日（継続勤務した期間を６か月経過日から１年ごとに区分した期間の初日）から１年以内の期間に、労働者ごとにその時季を定めることにより与えなければならなりません（労基法第３９条第７項。ただし、労働者自らの請求又は労使協定による計画的付与により年次有給休暇を取得した日数分については、使用者が時季を定めることにより与えることを要しません（労基法第３９条第８項）。）。なお、使用者が時季を定めるに当たっては、労働者の意見を聴取することを要し、当該労働者の意見を',
           '日は特定すること。ウ 振替休日は４週４日の休日が確保される範囲のできるだけ近接した日とすること。エ 振替は前日までに通知すること。〔例２〕１か月単位の変形労働時間制（隔週週休２日制を採用する場合）の規程例〔例２〕は、１か月単位の変形労働時間制（変形期間は２週間）を活用しつつ、隔週での週休２日制で、毎日の所定労働時間を７時間１５分とすることにより、週４０時間労働制を実施する場合の規程例です。- 26 -（労働時間及び休憩時間）第１９条 １週間の所定労働時間は、 年 月 日を起算日として、２週間ごとに平均して、１週間当たり４０時間とする。２ １日の所定労働時間は、７ 時間１５分とする。３ 始業・終業の時刻及び休憩時間は、次のとおりとする。ただし、業務の都合その他やむを得ない事情により、これらを繰り上げ、又は繰り下げることがある。この場合において業務の都合によるときは、 が前日までに通知する。始業・終業時刻 休憩時間始業 午前 時 分時 分から 時 分まで終業 午後 時 分（休日）第２０条 休',
           '、労働者の意思に委ねられていますので、代替休暇の取得日は、労働者の意向を踏まえたものとしなければなりません。② １か月について６０時間を超える時間外労働の割増賃金の支払日１か月に６０時間を超える時間外労働の割増賃金の支払日については、労働者の代替休暇の取得の意向に応じて、次のようになります。（図２参照）（ａ）労働者に代替休暇の取得の意向がある場合は、支払義務がある割増賃金（労基法第３７条により２割５分以上の率で計算した割増賃金）について、その割増賃金が発生した賃金計算期間の賃金支払日に支払うことが必要です。なお、代替休暇の取得の意向があった労働者が、実際には代替休暇を取得しなかったときには、労基法第３７条による１か月の時間外労働時間数が６０時間を超えたときから追加的に支払われる割増賃金について、労働者が代替休暇を取得しないことが確定した賃金計算期間の賃金支払日に支払う必要があります。（下記４参照）（ｂ）（ａ）以外の場合、すなわち労働者に代替休暇',
           '就業規則等に定めることが必要です（労基法第３９条第７項）。３ 労使協定に規定しなければならない内容は次のとおりです。① 時間単位年休の対象労働者の範囲（対象となる労働者の範囲を定めます。）② 時間単位年休の日数（５日以内の範囲で定めます。前年度からの繰越しがある場合- 42 -であっても、当該繰越し分を含めて５日以内となります。）③ 年次有給休暇１日分に相当する時間単位年休の時間数（１日分の年次有給休暇に対応する所定労働時間数を基に定めます。１日の所定労働時間に１時間に満たない端数がある場合は時間単位に切り上げて計算します。）④ １時間以外の時間を単位とする場合はその時間数（ただし、１日の所定労働時間を上回ることはできません。）４ 時間単位年休も年次有給休暇ですので、事業の正常な運営を妨げる場合は使用者による時季変更権が認められます。ただし、日単位での請求を時間単位に変えることや、時間単位での請求を日単位に変えることはできません。（産前産後の休業）第２５条 ６週間（多胎妊娠の場'],
          dtype=object)



## トークンサイズで規約を絞りこむ
関連性が高いだけのものだけに絞っても、ChatGPTへ渡すにはデータサイズが大きすぎる場合があります。ChatGPTモデル`gpt-3.5-turbo`と会話するためには、回答のトークン(`max_tokens`)と質問のトークン数の合計が4096に収まるようにしなければHTTP400エラーとなります。

[OpenAI Community Forum - Error retrieving ‘completions’: 400 Bad Request](https://community.openai.com/t/error-retrieving-completions-400-bad-request/34004)

> A common reason of the error 400 is that the prompt exceed the limit of character allowed by the API.
>
> I recommend you check the API documentation to see if there are any limits on the size of the prompt or the number of items in the question.

これ以降では特に断りがない限りモデルを`gpt-3.5-turbo`とします。

各textのトークンサイズを取得するには、`tiktoken`モジュールの`encode`メソッドを各行に`apply`します。


```python
enc = tiktoken.encoding_for_model("gpt-3.5-turbo")
model_df["token_length"] = model_df.text.apply(lambda x: len(enc.encode(x)))
model_df
```





  <div id="df-e5e63a48-a951-4c31-804c-e76e524f3f9f">
    <div class="colab-df-container">
      <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>text</th>
      <th>embedding</th>
      <th>similarities</th>
      <th>token_length</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>１モデル就業規則令和４年 11 月版厚生労働省労働基準局監督課２はじめに１ 就業規則の意義労...</td>
      <td>[-0.0031310103, -0.0081168134, 0.0068422724, -...</td>
      <td>0.790221</td>
      <td>500</td>
    </tr>
    <tr>
      <th>1</th>
      <td>�以上に分けて交替に就業させる場合においては就業時転換に関する事項（２） 賃金関係賃金の決定...</td>
      <td>[-0.011883983400000001, -0.017528709, 0.027896...</td>
      <td>0.796432</td>
      <td>500</td>
    </tr>
    <tr>
      <th>2</th>
      <td>その他事業場の労働者すべてに適用されるルールに関する事項なお、就業規則の内容は、法令及び当該...</td>
      <td>[-0.0067576934000000005, -0.0051615201, 0.0119...</td>
      <td>0.762211</td>
      <td>500</td>
    </tr>
    <tr>
      <th>3</th>
      <td>する企業については、営業所、店舗等の就業規則が変更前、変更後ともに本社の就業規則と同一の内容...</td>
      <td>[-0.004123474, -0.0041268268, 0.00174996220000...</td>
      <td>0.760169</td>
      <td>500</td>
    </tr>
    <tr>
      <th>4</th>
      <td>労基則」といいます。）第６条の２）。就業規則の作成又は変更に当たっては、その内容をよく吟味す...</td>
      <td>[-0.0106588136, -0.00044822950000000003, 0.011...</td>
      <td>0.761138</td>
      <td>500</td>
    </tr>
    <tr>
      <th>...</th>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
    </tr>
    <tr>
      <th>154</th>
      <td>�時間の通算や簡便な労働時間管理の方法について考え方を示していますので、その考え方に基づき通...</td>
      <td>[-0.0014959859000000001, -0.007987556, 0.01083...</td>
      <td>0.800947</td>
      <td>500</td>
    </tr>
    <tr>
      <th>155</th>
      <td>日労働の合計の時間数について、１か月１００時間未満及び２～６か月平均８０時間以内とすること）...</td>
      <td>[0.0004004154, -0.0113613438, 0.0087518478, -0...</td>
      <td>0.821725</td>
      <td>500</td>
    </tr>
    <tr>
      <th>156</th>
      <td>ような場合に該当しないかの確認や、該当しない場合であって労働時間の通算の対象となるときにおい...</td>
      <td>[0.0033579303, -0.0182754919, 0.01175449600000...</td>
      <td>0.790952</td>
      <td>500</td>
    </tr>
    <tr>
      <th>157</th>
      <td>。・十和田運輸事件（東京地判平成１３年６月５日）運送会社の運転手が年に１、２回の貨物運送のア...</td>
      <td>[-0.0177730452, -0.0215087812, 0.0167825092, -...</td>
      <td>0.784176</td>
      <td>500</td>
    </tr>
    <tr>
      <th>158</th>
      <td>�則により使用者の業務上の秘密を守る義務を負うとしたうえで、会社が機密漏洩防止に特段の配慮を...</td>
      <td>[-0.0214479137, -0.0269076359, -0.0009704622, ...</td>
      <td>0.779046</td>
      <td>434</td>
    </tr>
  </tbody>
</table>
<p>159 rows × 4 columns</p>
</div>
     




```python
def regulation_search(vector_df, query:str, threshold=0.85, model="gpt-3.5-turbo", verbose=False) -> list[str]:
  """就業規則に関する質問を与えると、関連性の高い条項を検索して返す
  verbose=Trueでテキストと類似度を表示する。
  """
  # 質問のベクトル化
  query_vector = get_embedding(query, engine="text-embedding-ada-002")
  # 各テキストのトークンの長さを取得
  enc = tiktoken.encoding_for_model(model)
  vector_df["token_length"] = vector_df.text.apply(lambda x: len(enc.encode(x)))
  # 関連性を算出
  vector_df["similarities"] = vector_df["embedding"].apply(lambda x: cosine_similarity(x, query_vector))
  df = vector_df.sort_values("similarities", ascending=False)  # 関連性順にソート
  return df[df.similarities >= threshold]  # 関連性の高いものだけ抽出

# regulation_search()をDataFrameのメソッドとして扱う
setattr(pd.DataFrame, "regulation_search", regulation_search)
```


```python
model_df.regulation_search("年間休日は何日ですか？")
```





  <div id="df-4348d93f-c138-488e-9e0a-52653d3ee801">
    <div class="colab-df-container">
      <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>text</th>
      <th>embedding</th>
      <th>similarities</th>
      <th>token_length</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>61</th>
      <td>�日数のうち５日について、会社が労働者の意見を聴取し、その意見を尊重した上で、あらかじめ時季...</td>
      <td>[-0.0107386103, 0.00037948750000000003, 0.0178...</td>
      <td>0.862008</td>
      <td>500</td>
    </tr>
    <tr>
      <th>60</th>
      <td>働日数1 年間の所定労働日数勤 続 期 間6か月1 年6か月2 年6か月3 年6か月4 年6...</td>
      <td>[-0.007909352, -0.0088897413, 0.0299416017, -0...</td>
      <td>0.861555</td>
      <td>500</td>
    </tr>
    <tr>
      <th>62</th>
      <td>各労働者に通知する。【第２３条 年次有給休暇】１ 雇入れの日から６か月間継続勤務し、全労働日...</td>
      <td>[-0.015559835400000001, -0.0023178766, 0.01893...</td>
      <td>0.857825</td>
      <td>500</td>
    </tr>
    <tr>
      <th>40</th>
      <td>日は、次のとおりとする。① 日曜日② 年 月 日を起算日とする２週間ごとの第２ 土曜日③ 国...</td>
      <td>[0.0013980714, -0.0033311150000000004, 0.00444...</td>
      <td>0.857657</td>
      <td>500</td>
    </tr>
    <tr>
      <th>59</th>
      <td>保する方法も考えられます。- 38 -第５章 休暇等年次有給休暇等法定の休暇のみならず、会社...</td>
      <td>[-0.0112524731, -0.0029541843, 0.0288955644, -...</td>
      <td>0.854854</td>
      <td>500</td>
    </tr>
    <tr>
      <th>48</th>
      <td>制に適合するためには、１日- 32 -の所定労働時間に応じて下表の年間休日を確保することが必...</td>
      <td>[0.005558776200000001, -0.001542353, 0.0245050...</td>
      <td>0.852460</td>
      <td>500</td>
    </tr>
    <tr>
      <th>49</th>
      <td>時間及び休日労働はないことを前提とした制度です。したがって、突発的に時間外労働等がある場合、...</td>
      <td>[0.0035114437, -0.0044909166, 0.008315525, -0....</td>
      <td>0.850809</td>
      <td>500</td>
    </tr>
    <tr>
      <th>66</th>
      <td>できます（労基法第３９条第５項）。- 41 -１１ 本条第４項に定める年次有給休暇の計画的付...</td>
      <td>[-0.012126931, -0.002640812, 0.0247504804, -0....</td>
      <td>0.850473</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
     


`regulation_search`関数を改造して、textに対して関連性とトークン数を表示したデータフレームを得られました。

# ChatGPT連携
先の項目で類似度(similarities)0.85以上の項目だけ抽出し、さらにトークン数を算出しました。
これを制限トークン内に収めるようにテキストを結合したものをChatGPTに投げ、ChatGPTにいい感じの日本語に直してもらえばチャットボットです。

## トークン数の制限 

システムロール(role:systemのcontent)、質問、回答(max_token)の合計トークン数が4096以内に収まっていなければなりません。

次のようなsystem_roleを与えるとします。トークンサイズは94です。


```python
system_role = f"""あなたは就業規則に関するエキスパートです。
以下に与える`関連規約`を参照し、質問に対して平易な日本語で答えてください。
就業規則以外のことには答えられません。

# 関連規約
"""
len(enc.encode(system_role))
```




    94




```python
query = "年間休日は何日ですか？"
related_rules = model_df.regulation_search(query)
related_rules[related_rules.token_length.cumsum() <= 1000]

```





  <div id="df-c5c1272f-b442-4b59-b811-e3682e46afb5">
    <div class="colab-df-container">
      <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>text</th>
      <th>embedding</th>
      <th>similarities</th>
      <th>token_length</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>61</th>
      <td>�日数のうち５日について、会社が労働者の意見を聴取し、その意見を尊重した上で、あらかじめ時季...</td>
      <td>[-0.0107386103, 0.00037948750000000003, 0.0178...</td>
      <td>0.862008</td>
      <td>500</td>
    </tr>
    <tr>
      <th>60</th>
      <td>働日数1 年間の所定労働日数勤 続 期 間6か月1 年6か月2 年6か月3 年6か月4 年6...</td>
      <td>[-0.007909352, -0.0088897413, 0.0299416017, -0...</td>
      <td>0.861555</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
     


```python
sum(_.token_length)
```




    1000



仮に合計トークン数が1000以内になるように出力させました。


```python
query = "年間休日は何日？"
system_role = f"""あなたは就業規則に関するエキスパートです。
以下に与える`関連規約`を参照し、質問に対して平易な日本語で答えてください。
就業規則以外のことには答えられません。

# 関連規約
"""

# 質問とシステムロールのトークン長さ
query_length = len(enc.encode(query))
system_length = len(enc.encode(system_role))
print("query_length, system_length: ", query_length, system_length)  # 9, 94

# 関連性の高い規約のみ抽出
related_rules = model_df.regulation_search(query)
print("cumsum rules tokens:",related_rules.token_length.sum())  # 2076

# ChatGPT 3.5 turboに送るトークン数が制限内に収まるように調整
max_tokens = 1000
token_limit = 4096 - max_tokens - query_length - system_length
print("token_limit:",token_limit)  # 2993
related_rules[related_rules.token_length.cumsum() <= token_limit]

```

    query_length, system_length:  9 94
    cumsum rules tokens: 8500
    token_limit: 2993






  <div id="df-751e0bec-e378-46e2-8420-860d471592a3">
    <div class="colab-df-container">
      <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>text</th>
      <th>embedding</th>
      <th>similarities</th>
      <th>token_length</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>60</th>
      <td>働日数1 年間の所定労働日数勤 続 期 間6か月1 年6か月2 年6か月3 年6か月4 年6...</td>
      <td>[-0.007909352, -0.0088897413, 0.0299416017, -0...</td>
      <td>0.873832</td>
      <td>500</td>
    </tr>
    <tr>
      <th>61</th>
      <td>�日数のうち５日について、会社が労働者の意見を聴取し、その意見を尊重した上で、あらかじめ時季...</td>
      <td>[-0.0107386103, 0.00037948750000000003, 0.0178...</td>
      <td>0.872704</td>
      <td>500</td>
    </tr>
    <tr>
      <th>62</th>
      <td>各労働者に通知する。【第２３条 年次有給休暇】１ 雇入れの日から６か月間継続勤務し、全労働日...</td>
      <td>[-0.015559835400000001, -0.0023178766, 0.01893...</td>
      <td>0.872019</td>
      <td>500</td>
    </tr>
    <tr>
      <th>40</th>
      <td>日は、次のとおりとする。① 日曜日② 年 月 日を起算日とする２週間ごとの第２ 土曜日③ 国...</td>
      <td>[0.0013980714, -0.0033311150000000004, 0.00444...</td>
      <td>0.868733</td>
      <td>500</td>
    </tr>
    <tr>
      <th>59</th>
      <td>保する方法も考えられます。- 38 -第５章 休暇等年次有給休暇等法定の休暇のみならず、会社...</td>
      <td>[-0.0112524731, -0.0029541843, 0.0288955644, -...</td>
      <td>0.868274</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
     
トークン制限が2993に対して、しきい値以上の関連規約をすべて合計しても2076しかないようなので、この質問では`cumsum()`によるフィルターが機能してません。
これを関数化して、いくつか質問をぶつけてみましょう。


```python
def filter_by_token_length(vector_df:pd.DataFrame,
                           query:str,
                           system_role:str,
                           max_tokens=1000,
                           model="gpt-3.5-turbo", 
                           model_token_limit=4096,
                           verbose=False,
                           *args, **kwargs):
  """質問とシステムロールプロンプトを加味して、トークン数を制限して規約の入ったデータフレームを返す"""
  # 質問とシステムロールのトークン長さ
  enc = tiktoken.encoding_for_model(model)
  query_length = len(enc.encode(query))
  system_length = len(enc.encode(system_role))
  
  # 関連性の高い規約のみ抽出
  related_rules = model_df.regulation_search(query, *args, **kwargs)
  
  # ChatGPT 3.5 turboに送るトークン数が制限内に収まるように調整
  token_limit = model_token_limit - max_tokens - query_length - system_length
  if verbose:
    print("query_length, system_length: ", query_length, system_length)
    print("cumsum rules tokens:",related_rules.token_length.sum())
    print("token_limit:", token_limit)
  return related_rules[related_rules.token_length.cumsum() <= token_limit]
  
# DataFrameのメソッドとして扱う
setattr(pd.DataFrame, "filter_by_token_length", filter_by_token_length)
```


```python
system_role = f"""あなたは就業規則に関するエキスパートです。
以下に与える`関連規約`を参照し、質問に対して平易な日本語で答えてください。
就業規則以外のことには答えられません。
最後に必ず関連する規約の番号を案内してください。

# 関連規約
"""

model_df.filter_by_token_length("産休制度はありますか", system_role, verbose=True)
```

    query_length, system_length:  10 116
    cumsum rules tokens: 2500
    token_limit: 2970






  <div id="df-c2e36b2c-32e2-44c0-8f0e-efe918a01304">
    <div class="colab-df-container">
      <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>text</th>
      <th>embedding</th>
      <th>similarities</th>
      <th>token_length</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>68</th>
      <td>就業規則等に定めることが必要です（労基法第３９条第７項）。３ 労使協定に規定しなければならな...</td>
      <td>[0.0013176750000000001, -0.0047479584, 0.01522...</td>
      <td>0.859248</td>
      <td>500</td>
    </tr>
    <tr>
      <th>61</th>
      <td>�日数のうち５日について、会社が労働者の意見を聴取し、その意見を尊重した上で、あらかじめ時季...</td>
      <td>[-0.0107386103, 0.00037948750000000003, 0.0178...</td>
      <td>0.854470</td>
      <td>500</td>
    </tr>
    <tr>
      <th>66</th>
      <td>できます（労基法第３９条第５項）。- 41 -１１ 本条第４項に定める年次有給休暇の計画的付...</td>
      <td>[-0.012126931, -0.002640812, 0.0247504804, -0....</td>
      <td>0.850861</td>
      <td>500</td>
    </tr>
    <tr>
      <th>59</th>
      <td>保する方法も考えられます。- 38 -第５章 休暇等年次有給休暇等法定の休暇のみならず、会社...</td>
      <td>[-0.0112524731, -0.0029541843, 0.0288955644, -...</td>
      <td>0.850632</td>
      <td>500</td>
    </tr>
    <tr>
      <th>64</th>
      <td>尊重するよう努めなければなりません。５ 通常の労働者の年次有給休暇の日数は、その後、勤続年数...</td>
      <td>[-0.005904482700000001, -0.007952704100000001,...</td>
      <td>0.850267</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
     


```python
model_df.filter_by_token_length("定年は何歳？", system_role,  verbose=True)
```

    query_length, system_length:  6 116
    cumsum rules tokens: 0
    token_limit: 2974






  <div id="df-1482a74c-5a6e-4e05-adab-8f986877cd23">
    <div class="colab-df-container">
      <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>text</th>
      <th>embedding</th>
      <th>similarities</th>
      <th>token_length</th>
    </tr>
  </thead>
  <tbody>
  </tbody>
</table>
</div>
     

関連規約を多く出力するためにしきい値を0.6まで下げます。


```python
model_df.filter_by_token_length("定年は何歳？", system_role, verbose=True, threshold=0.6)

```

    query_length, system_length:  6 116
    cumsum rules tokens: 79429
    token_limit: 2974






  <div id="df-1e422cab-b386-4dbc-a645-fbec24aac707">
    <div class="colab-df-container">
      <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>text</th>
      <th>embedding</th>
      <th>similarities</th>
      <th>token_length</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>111</th>
      <td>年齢の者について継続雇用制度の対象者を限定する基準を定めることが認められています。表：老齢厚...</td>
      <td>[0.001852836, -0.0260720495, 0.0177475214, -0....</td>
      <td>0.849797</td>
      <td>500</td>
    </tr>
    <tr>
      <th>110</th>
      <td>業務を遂行する能力があるとして以下に該当する者① ○○○○② △△△△【第５１条 定年等】１...</td>
      <td>[-0.0023326587000000003, -0.0288862567, 0.0199...</td>
      <td>0.848030</td>
      <td>500</td>
    </tr>
    <tr>
      <th>107</th>
      <td>職、解雇、契約期間の満了による退職等労働者がその身分を失うすべての場合に関する事項をいうと解...</td>
      <td>[0.0021746515000000003, -0.0171829257, 0.01907...</td>
      <td>0.841361</td>
      <td>500</td>
    </tr>
    <tr>
      <th>108</th>
      <td>雇用する。３ 前項の規定に基づく継続雇用の満了後に、引き続き雇用されることを希望し、解雇事由...</td>
      <td>[-0.0105812484, -0.013224883000000002, 0.00711...</td>
      <td>0.827636</td>
      <td>500</td>
    </tr>
    <tr>
      <th>112</th>
      <td>０歳までの継続雇用制度（再雇用制度・勤務延長制度）の導入（特殊関係事業主に加えて、他の事業主...</td>
      <td>[-0.0168619789, -0.037723273, 0.0067218225, -0...</td>
      <td>0.826399</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
     

```python
_.token_length.sum()
```




    2500



フィルター前のtoken_lengthが7万超え、limitが2974に対して、出てきたデータフレームのtoken_lengthの合計は2500なので、フィルターが効いていますね。

## 関連規則をChatGPTに参照させる
質問に関連する規約だけをトークン制限の許す限り抽出し、ChatGPTに渡してわかりやすく答えてもらいます。


```python
system_role = f"""あなたは就業規則に関するエキスパートです。
以下に与える`関連規約`を参照し、質問に対して平易な日本語で答えてください。
就業規則以外のことには答えられません。
最後に必ず関連する規約の番号を案内してください。

# 関連規約
"""
query = "産休制度はありますか"

# 関連規約の抽出
filtered_content = "\n".join(model_df.filter_by_token_length(query, system_role).text)

# ChatGPTに規約を渡していい感じに日本語に直してもらう
messages = [
    {
        "role": "system",
        "content": system_role + filtered_content  # システムプロンプトに関連規約を追加
    },
    {
        "role": "user",
        "content": query
    }
]
completion = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    max_tokens=1000,
    temperature=0.2,
    messages=messages,
)
content = completion.choices[0].message.content
content
```




    '就業規則によっては、産休制度が定められている場合があります。ただし、具体的な内容は就業規則によって異なるため、詳細については就業規則を確認する必要があります。また、労働基準法によっても産前産後休業制度が定められています。詳細については労働基準法第６５条を参照してください。関連規約：労働基準法第６５条'




```python
def ask_regulation(vector_df:pd.DataFrame, query:str):
  """usage:
    model_df.ask_regulation("質問")
  """
  system_role = f"""あなたは就業規則に関するエキスパートです。
  以下に与える`関連規約`を参照し、質問に対して平易な日本語で答えてください。
  就業規則以外のことには答えられません。
  最後に必ず関連する規約の番号を案内してください。
  
  # 関連規約
  """
  # 関連規約の抽出
  regulations = vector_df.filter_by_token_length(query, system_role).text
  filtered_content = "\n".join(regulations)
  
  # ChatGPTに規約を渡していい感じに日本語に直してもらう
  messages = [
      {
          "role": "system",
          "content": system_role + filtered_content  # システムプロンプトに関連規約を追加
      },
      {
          "role": "user",
          "content": query
      }
  ]
  completion = openai.ChatCompletion.create(
      model="gpt-3.5-turbo",
      max_tokens=1000,
      temperature=0.2,
      messages=messages,
  )
  content = completion.choices[0].message.content
  print(len(enc.encode(content)), "tokens")
  return content

# DataFrameのメソッドとして扱う
setattr(pd.DataFrame, "ask_regulation", ask_regulation)
```


```python
model_df.ask_regulation("何時間働けば良い？")
```

    143 tokens





    '質問があいまいなため、具体的な回答ができません。就業規則には、労働時間の上限や週あたりの労働時間の平均などが定められています。そのため、具体的な労働時間については、就業規則を確認してください。関連規約番号は不明ですが、労働時間に関する規定は労働基準法にもあります。'




```python
model_df.ask_regulation("産休制度はある？")
```

    184 tokens





    '関連規約には産休制度に関する明確な規定はありません。ただし、産前産後の休業期間は出勤率の算定に当たって出勤したものとして取り扱われることが明記されています（労使協定に関する規定第6項②）。産前産後の休業期間については、育児・介護休業法に基づく育児休業及び介護休業と同様に、個別に労使間で協議する必要があります。'




```python
model_df.ask_regulation("振替休日とはどのような場合に発生しますか")
```

    225 tokens





    '振替休日は、あらかじめ定められた法定休日（例えば日曜日）を他の日に振り替えることです。例えば、業務の都合によって所定休日である日曜日に勤務させなければならない場合に、当該日曜日を勤務日に変更し、その代わり勤務日である例えば月曜日を休日とするように、所定の休日とあらかじめ他の勤務日と振り替えることが振替休日になります。関連規約は「労働基準法上の振替休日と代休の取扱いの違い」です。'




```python
model_df.ask_regulation("始業、終業の時刻は誰がどのように管理しますか")
```

    309 tokens





    '使用者は、労働時間を適正に管理するため、労働者の労働日ごとの始業・終業時刻を確認し、これを記録することが求められています。始業・終業時刻を確認し、記録する方法としては、原則として次のいずれかの方法によることが求められています。\n\n1. 使用者が、自ら現認することによりこれを確認し、記録すること。\n2. タイムカード、ICカード、パソコンの使用時間の記録等の時間の通算や簡便な労働時間管理の方法について考え方を示していますので、その考え方に基づき通算を行うことになります。\n\n（参考）就業規則関連規約：４．始業・終業時刻の確認及び記録、４．始業・終業時刻の確認及び記録の原則的な方法'




```python
model_df.ask_regulation("明日の天気はなんですか")
```

    95 tokens





    '申し訳ありませんが、私は就業規則に関するエキスパートであり、天気に関する情報を提供することはできません。何か就業規則に関する質問があれば、お答えいたします。関連規約の番号をお知らせください。'



## 関連規約をChatGPTに参照させて答えさせる流れをクラス化
ここまでの流れを一旦整理します。
- 就業規則データを読み込んで、ベクトル化する。
- ベクトル化には時間とお金がかかるので、完了したらストレージに保存しておく。
- 再開するときはデータを読み込むところから。
- 質問の内容から、関連度合いを調べてある程度関連しそうな規約だけを抽出する。
- システムプロンプトに関連規約を埋め込む。
- システムプロンプトと質問と回答の合計トークン数が4096以下になるように調整してChatGPTへ渡す。

合計トークンの内訳は以下のようになります。
- 回答の最大トークンは`max_tokens`というプロパティで決められている。どういうアシスタントを想定しているかにもよるが、300-1000トークンくらいが妥当か。
- システムプロンプトの規約以外の部分は予め決まっている。約100トークン。`あなたは就業規則のエキスパートです。...`
- 関連規約のトークン数はアシスタントに知識をどれだけ与えたいかによるが、1500-2500トークン程度が妥当か。
- これまでのトークン数を4096から引いたトークン数がユーザーに与えられる質問および前のやり取りに使えるトークン数となる。400-2200トークン程度。

以上から、トークン数の内訳を次のように設計し直します。
* アシスタントの回答`max_tokens=500`
* システムプロンプトの規約以外に116トークン
* システムプロンプトの規約部分に2000トークン
* 残りの1480トークンをユーザーの質問および以前のやり取りに使用。
    * やりとりが1480トークンを超えたら過去の会話から削除
    * ユーザーの質問だけで1480トークンを超えたら`質問が長すぎます`というエラーを発生させる。

### 便利な実装
実装の前に、実装が便利になるクラスを実装していきます。

#### Roleクラスの実装


```python
from enum import Enum
class Role(str,Enum):
    System = "system"
    Assistant = "assistant"
    User = "user"

    def __str__(self):
        return self.name.lower()
```


```python
Role.System == "system"
```




    True




```python
Role.System
```




    <Role.System: 'system'>




```python
# 使い方
str(Role.System)
```




    'system'



`namedtuple`で実装する場合、strを入れないと小文字のstrにならない

```python
from collections import namedtuple
Message = namedtuple("Message", ["role", "content"])
# strを入れないと小文字のstrにならない
assert Message(str(Role.System), "あなたは就業規則に関する") == ('system','あなたは就業規則に関する')
```

#### Messageクラスの実装


```python
from dataclasses import dataclass
@dataclass
class Message:
    role:Role
    content:str

    def _asdict(self):
        return {"role":str(self.role), "content": self.content}

```


```python
# 使い方
messages = [
    Message(Role.System, "あなたは就業規則に関する"),
    Message(Role.User, "質問")
]
[i._asdict() for i in messages]
```




    [{'role': 'system', 'content': 'あなたは就業規則に関する'},
     {'role': 'user', 'content': '質問'}]



## 関連規約の参照メソッド、規約に基づいた回答の考案メソッドを持ったクラス
`pd.DataFrame`を継承した`VectorFrame`クラスを実装しました。ChatGPTのモデル、APIのプロパティ、各トークン数のプロパティを追加しました。


```python
class VectorFrame(pd.DataFrame):
    system_prompt = """あなたは就業規則に関するエキスパートです。
    以下に与える`関連規約`を参照し、質問に対して平易な日本語で答えてください。
    就業規則以外のことには答えられません。
    最後に必ず関連する規約の番号を案内してください。

    # 関連規約
    """  # 123 tokens

    def __init__(
            self,
            *args,
            model="gpt-3.5-turbo",
            model_token_limit=4096,
            max_tokens=500,
            temperature=0.2,
            system_max_tokens=2000,  # system promptは合計で2123
            user_max_tokens=1471,  # = 4096 - 2123 - 500 - 2(改行の2？)
            **kwargs):
        super().__init__(*args, **kwargs)
        self.model = model
        self.model_token_limit = model_token_limit
        self.max_tokens = max_tokens
        self.temperature = temperature
        self.system_max_tokens = system_max_tokens
        self.user_max_tokens = user_max_tokens
        # 各テキストのトークンの長さを取得
        self.enc = tiktoken.encoding_for_model(self.model)
        self["token_length"] = self.text.apply(
            lambda x: len(self.enc.encode(x)))

    def get_token_length(self, *args: str):
        s = '\n'.join(args)
        return len(self.enc.encode(s))

    def search_regulation(self, query: str, threshold=0.85, verbose=False):
        """就業規則に関する質問を与えると、関連性の高い規約を検索して返す
        トークン数がデフォルトで2000未満になるようにして返す。
        verbose=Trueでテキストと類似度を表示する。
        """
        # 質問のベクトル化
        query_vector = get_embedding(query, engine="text-embedding-ada-002")
        # 関連性を算出
        self["similarities"] = self["embedding"].apply(
            lambda x: cosine_similarity(x, query_vector))
        # 関連性順にソート
        self.sort_values("similarities", ascending=False, inplace=True)
        # 関連性の高いものだけ抽出 かつ 2000トークン以内に収まるようにフィルター
        filtered = self[(self.similarities >= threshold) &
                        (self.token_length.cumsum() <= self.system_max_tokens)]
        if verbose:
            print("related rules:", filtered)
            print("cumsum rules tokens:", filtered.token_length.sum())
        return VectorFrame(filtered)

    def ask_regulation(self, query: str, messages:list[Message]=[],
                       *args, **kwargs) -> str:
        """usage:
          model_df.ask_regulation("質問")
        """
        user_prompt_length = self.get_token_length(query)
        assert user_prompt_length <= self.user_max_tokens,\
            f"システムプロンプトは1473トークン以下にしてください。 {user_prompt_length}"
        # システムプロンプトに関連規約を追加
        # list()をつけないと各行にsystem_promptが追加されてしまう
        system_prompt = "\n".join([VectorFrame.system_prompt] +
                                  list(self.text))
        system_prompt_length = self.get_token_length(system_prompt)
        limit_token = self.system_max_tokens+self.get_token_length(VectorFrame.system_prompt) + 2  # 謎の2 改行？
        assert system_prompt_length <= limit_token,\
            f"システムプロンプトは{limit_token}トークン以下にしてください。\
            {system_prompt_length} >= limit_token:{limit_token}"

        # システムプロンプトと質問をプロンプトに追加
        messages.insert(0, Message(Role.System, system_prompt))
        messages.append(Message(Role.User, query))
        # プロンプトのトークン数が制限に収まるように調整
        while True:
            all_prompt_length = self.get_token_length(*(i.content for i in messages))
            if all_prompt_length <= self.model_token_limit:
                break
            messages.pop(1)  # System promptを除いて上から順に会話履歴を削除
        assert all_prompt_length <= self.model_token_limit,\
            f"全プロンプトの合計は4096トークン以下 {all_prompt_length}"

        # ChatGPTに規約を渡していい感じに日本語に直してもらう
        completion = openai.ChatCompletion.create(
            model=self.model,
            max_tokens=self.max_tokens,
            temperature=self.temperature,
            messages=[i._asdict() for i in messages],
        )
        content = completion.choices[0].message.content
        return content
```

質問に対して類似度の高い規約をVectorFrameから抽出します。


```python
# データの読み込み
model_df = pd.read_json("/content/drive/MyDrive/Colab Notebooks/model-embeddings.json")
model_df = VectorFrame(model_df)
```


```python
query = "有給休暇は年に何日ですか"
# 関連規約の抽出
regulation = model_df.search_regulation(query)
regulation
```





  <div id="df-b1d2db43-a638-4892-b068-e1612c8db173">
    <div class="colab-df-container">
      <div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>text</th>
      <th>embedding</th>
      <th>similarities</th>
      <th>token_length</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>62</th>
      <td>各労働者に通知する。【第２３条 年次有給休暇】１ 雇入れの日から６か月間継続勤務し、全労働日...</td>
      <td>[-0.015559835400000001, -0.0023178766, 0.01893...</td>
      <td>0.882871</td>
      <td>500</td>
    </tr>
    <tr>
      <th>59</th>
      <td>保する方法も考えられます。- 38 -第５章 休暇等年次有給休暇等法定の休暇のみならず、会社...</td>
      <td>[-0.0112524731, -0.0029541843, 0.0288955644, -...</td>
      <td>0.881656</td>
      <td>500</td>
    </tr>
    <tr>
      <th>61</th>
      <td>�日数のうち５日について、会社が労働者の意見を聴取し、その意見を尊重した上で、あらかじめ時季...</td>
      <td>[-0.0107386103, 0.00037948750000000003, 0.0178...</td>
      <td>0.880622</td>
      <td>500</td>
    </tr>
    <tr>
      <th>60</th>
      <td>働日数1 年間の所定労働日数勤 続 期 間6か月1 年6か月2 年6か月3 年6か月4 年6...</td>
      <td>[-0.007909352, -0.0088897413, 0.0299416017, -0...</td>
      <td>0.880144</td>
      <td>500</td>
    </tr>
  </tbody>
</table>
</div>
     


関連規約に基づいて、質問に対する回答をChatGPTが考える。


```python
response = regulation.ask_regulation(query)
response
```




> 労働者が雇用されてから6か月以上勤務し、全労働日の8割以上出勤した場合、最低10日の有給休暇が与えられます。その後、1年間勤務するごとに、勤務期間に応じた日数の有給休暇が与えられます。具体的には、勤続期間が6か月以上1年未満の場合は11日、1年以上6か月未満の場合は12日、2年以上6か月未満の場合は14日、3年以上6か月未満の場合は16日、4年以上6か月未満の場合は18日、5年以上6か月未満の場合は20日、6年以上6か月以上勤務した場合は、20日以上の有給休暇が与えられます。ただし、週の所定労働時間が30時間未満である場合や、週の所定労働日数が4日以下あるいは年間の所定労働日数が216日以下の場合は、労働者の所定労働日数との比率を考慮して、労働基準法及び労働基準関係法令に基づく日数以上の有給休暇が与えられます。関連規約は「労働基準法第39条第1項」「労働基準関係法令第24条の3」、「就業規則第23条」です。



## 対話形式でさらに質問に答えてもらう
前の質問と回答を与えて、"年間休日は何日ですか"に関連した規約についてさらに質問します。


```python
messages = [
    Message(Role.User, query),
    Message(Role.Assistant, response)
]
next_query = "23条には何が規定されていますか"
next_response = regulation.ask_regulation(next_query, messages=messages)
next_response

```




> 就業規則の第23条は、「年次有給休暇」に関する規定です。具体的には、労働者が雇用されてから6か月以上勤務し、全労働日の8割以上出勤した場合、最低10日の有給休暇が与えられます。その後、1年間勤務するごとに、勤務期間に応じた日数の有給休暇が与えられます。また、週の所定労働時間が30時間未満である場合や、週の所定労働日数が4日以下あるいは年間の所定労働日数が216日以下の場合は、労働者の所定労働日数との比率を考慮して、労働基準法及び労働基準関係法令に基づく日数以上の有給休暇が与えられます。さらに、年次有給休暇の取得時期や繰り越しに関する規定も含まれています。関連規約は「労働基準法第39条第1項」「労働基準関係法令第24条の3」、「就業規則第23条」です。




```python
messages = [
    Message(Role.User, query),
    Message(Role.Assistant, response),
    Message(Role.User, next_query),
    Message(Role.Assistant, next_response),
]
more_query = "3年8ヶ月勤めている私の有給は何日ですか"
more_response = regulation.ask_regulation(more_query, messages=messages)
more_response
```




> 労働者が雇用されてから6か月以上勤務し、全労働日の8割以上出勤した場合、最低10日の有給休暇が与えられます。その後、1年間勤務するごとに、勤務期間に応じた日数の有給休暇が与えられます。勤続期間が3年8か月の場合、6か月以上1年未満の期間が1回、1年以上6か月未満の期間が2回、2年以上6か月未満の期間が1回、計4回の勤続期間があります。したがって、最低10日の有給休暇に加え、11日（1回目の1年間勤務による）、12日（2回目の1年間勤務による）、14日（2年以上6か月未満の期間による）の有給休暇が与えられます。合計で47日の有給休暇が与えられることになります。ただし、具体的な計算には就業規則や労働基準法に基づく規定に従って行う必要があります。



合計で47日の有給休暇が与えられます！？ヤッター(...んなわけないやろ)


```python
messages = [
    Message(Role.User, query),
    Message(Role.Assistant, response),
    Message(Role.User, next_query),
    Message(Role.Assistant, next_response),
    Message(Role.User, more_query),
    Message(Role.Assistant, more_response),
]
another_query = "その与え方は日本の法律とどのような関連がありますか"
another_response = regulation.ask_regulation(another_query, messages=messages)
another_response

```




> 有給休暇の与え方は、日本の労働基準法や労働基準関係法令に基づいて定められています。具体的には、労働基準法第39条第1項により、労働者が雇用されてから6か月以上勤務し、全労働日の8割以上出勤した場合、最低10日の有給休暇を与えなければならないと規定されています。また、労働基準関係法令第24条の3により、週の所定労働時間が30時間未満である場合や、週の所定労働日数が4日以下あるいは年間の所定労働日数が216日以下の場合は、労働者の所定労働日数との比率を考慮して、労働基準法及び労働基準関係法令に基づく日数以上の有給休暇を与えなければなりません。したがって、労働者に与えられる有給休暇の日数は、法律に基づいて定められています。



いかがでしたでしょうか。本記事のまとめは以下です。

1. 就業規則のテキストデータを与えてベクトル化
2. 質問と各規約をベクトルとして内積を取り、類似順に抽出
3. ChatGPTのシステムプロンプトに質問に類似した規約を与えて、規約のエキスパートになってもらう。
4. 質問の回答を得る。
5. 質問と回答を次の質問に活かして更に回答を得る。

このようにしてChatGPTに就業規則の内容をわかりやすく答えてもらう事ができました。