1.はじめに
勉強を兼ねてpythonでRAGを構築してみた際の備忘録的なものです。
試みとして、ベクトルデータベースには普段使いしているTeradataを使用してみました。
また、LLMはOllamaを用いてローカル環境で動かしました。
実行環境
windows11 (+GPU)
python: 3.12.5
ollama: 0.11.6
pythonパッケージ
ollama 0.5.3
pandas 2.3.1
teradataml 20.0.0.6 (Teradataに接続して操作を行うpythonパッケージ)
LLM
kun432/cl-nagoya-ruri-base(embeddingモデル)
gemma3(会話モデル)
データベース
Teradata
今回はTeradataのお試し環境、ClearScape Analytics Experience WEBを使用しました。
2.処理の流れ
RAGの処理は以下の流れで行われます。
- あらかじめ、データベースに登録するデータをローカルでベクトル埋め込みし、生成されたベクトルをTeradataのテーブルにロードします。
- ユーザーから質問が入力されたら、質問文も同様にベクトル埋め込みを行いTeradataにロードします。
- TeradataのVectorDistance関数を使用して、質問文のベクトルと登録済みのデータベクトル間の類似度(距離)を計算し、類似度の高いデータ上位2件を抽出します。
- 抽出した類似データと質問文をセットでLLMに渡し、回答生成の元となるコンテクストとして活用します。
3.RAGを使わずに質問
今回は架空の企業のマニュアルを登録して、その情報について質問を行います。
まずはRAGの効果を確かめるため、何も使わずにLLMへ直接質問してみました。
質問①
output = ollama.generate(
model="gemma3:latest",
prompt="新入社員の初期研修は何日間行いますか?"
)
print(output['response'])
回答①
新入社員の初期研修期間は、企業によって大きく異なります。
**一般的な期間**
* **1週間~2週間:** 最も一般的な期間で、基本的なビジョンの共有、企業理念、社内ルール、ビジネスマナー、仕事内容の基礎など、会社としての全体像を理解するための研修が中心となります。
* **2週間~1ヶ月:** より専門的な知識やスキル、チームワーク、顧客対応など、実際の業務に活かせることを学ぶための研修が充実している企業もあります。
* **1ヶ月以上:** 業界や職種によっては、資格取得のための研修やOJT(On-the-Job Training)を組み合わせて、よりじっくりと育成を行う企業もあります。
……………
質問②
output = ollama.generate(
model="gemma3:latest",
prompt="経費精算手続きはどうすればよいのでしょうか?"
)
print(output['response'])
回答②
経費精算手続きは、会社や組織によって異なるため、具体的な手順は確認が必要です。しかし、一般的な流れと注意点を以下にまとめます。
**1. 経費の発生と記録**
* **経費の定義:** 業務に関わる支出(交通費、宿泊費、通信費、会議費、書籍代、消耗品費など)を指します。
……………
データ登録前なので一般的な情報が返ってきました。
4.RAGの構築
ここから先はpythonを使用してRAGを構築します。
登録データとして、架空の企業マニュアルを用意しました。
#パッケージのインポート
import sys
import os
import requests
import pandas as pd
import warnings
import ollama
warnings.filterwarnings("ignore")
data = [
"新入社員の初期研修について:新入社員は入社後、三週間の初期研修を受講し、企業理念や情報セキュリティ、基礎知識を習得します。研修期間中は教育担当が指導を行い、最終日に理解度テストを実施します。合格者は配属先にて業務開始、不合格者は補講後に再試験を受けます。出席率が80%未満の場合も補講対象となるため、遅刻や欠席には十分注意してください。",
"勤怠管理システムの利用方法:勤怠管理はクラウドシステム「NeoTime」で行います。勤務開始・終了時はパソコンまたはスマートフォンから打刻し、外出や在宅勤務時も同様です。有給休暇や遅刻・早退は三日前までに申請し、上長承認後に確定します。虚偽申告は給与計算に直結する重大な違反であり、懲戒の対象となります。",
"社内セキュリティポリシー:顧客情報や業務データの保護を最優先とし、パソコンは常にロックし退席時にはICカードを携行してください。USBメモリなど外部媒体の利用は禁止で、使用には申請が必要です。社外アクセスはVPNと二要素認証を必須とし、パスワードは90日ごとに変更します。違反行為は厳正に処分されます。",
"電子メール利用規程:業務メールは会社付与のアドレスのみ使用し、個人アドレスの利用は禁止です。機密情報は本文に直接記載せず暗号化ファイルを添付し、パスワードは別経路で伝えます。宛先確認を徹底し、CCとBCCを誤用しないでください。私的利用やチェーンメール送信は懲戒対象です。",
"顧客対応マニュアル:顧客第一主義を徹底し、電話は三コール以内に応答、挨拶と名乗りを明確にします。問い合わせ内容は必ず「NeoCRM」に記録し、処理状況を追跡可能にしてください。クレームは冷静に対応し、解決不能な場合は上長へ速やかに報告します。謝罪と再発防止策の提示を基本とします。",
"在宅勤務ルール:在宅勤務は週二回まで認められ、希望者は予定表に入力し前日までに上長承認を得てください。在宅中もオンライン会議への参加と業務報告は必須です。就業時間はオフィスと同一で、私的行為は禁止されます。公共Wi-Fiは使用できず、自宅回線または会社支給ルータを利用してください。",
"経費精算手続き:経費は立替精算方式で、領収書を受領し「NeoExpense」に登録します。交通費は合理的な経路を選び、特急や航空機利用は事前承認が必要です。接待交際費は上長承認と顧客名の記録が必須で、過剰提供は禁止です。精算は月末締め翌月10日提出とし、遅延は翌月処理になります。不正は厳罰対象です。",
"情報システム部への問い合わせ方法:不具合発生時はまずFAQを確認し、解決しない場合は専用チケットシステムに登録してください。発生日時・端末・症状を詳細に記入し、緊急時は電話も可能ですが記録は必須です。自己解決や非公式ツール導入は禁止され、違反と見なされます。",
"出張時の行動規範:出張には上長承認が必要で、宿泊は指定ホテルを利用します。勤務時間外でも公私をわきまえ、信用を損なう行為は禁じられます。会食時の過剰飲酒やSNSでの不用意な投稿は違反行為です。顧客先では名刺交換を丁寧に行い、服装はビジネスフォーマルを維持してください。帰社後三日以内に報告書提出が必要です。",
"退職・異動手続き:退職希望者は一か月前までに上長へ申し出る必要があります。退職時は引き継ぎ計画を策定し、資料を共有ドライブに保管してください。貸与品(パソコン、携帯、社員証など)は最終勤務日までに返却しなければなりません。守秘義務は退職後も継続され、違反は法的措置の対象となります。"
]
次に、テキストをベクトルに埋め込みし、各次元の数値を持つpandas DataFrameを作成します。
data_emb = pd.DataFrame()
for i,d in enumerate(data):
data_embedding = ollama.embeddings(model="kun432/cl-nagoya-ruri-base:111m", prompt=d)["embedding"]
data_list = []
data_list.append({"id":i, "text": d, "embedding": data_embedding})
data_emb_tmp = pd.DataFrame(data_list)
data_emb = pd.concat([data_emb,data_emb_tmp],axis=0,ignore_index=True)
for i in range(768):
data_emb["embeddings_{}".format(i)] = data_emb["embedding"].apply(lambda x: x[i])
data_emb.drop("embedding", axis=1, inplace=True)
以下のようなDataFrameが作成されます。
id | text | embeddings_0 | embeddings_1 | embeddings_2 | …… | embeddings_767 |
---|---|---|---|---|---|---|
1 | 新入社員の初期研修について:新入社員は入社後、三週間の初期研修を受講し、企業理念や情報セキュ... | 0.046410 | 0.273556 | 0.750367 | 0.812398 | |
2 | 勤怠管理システムの利用方法:勤怠管理はクラウドシステム「NeoTime」で行います。勤務開始... | 0.210224 | 0.269949 | -0.177837 | 0.391590 | |
… | … | … | … | … | … |
マニュアルデータのpandas DataFrameをTeradataにテーブルとしてロードします。
#Teradataへの接続情報
from getpass import getpass
host = "HOSTNAME" #Teradataのホストを指定
user = "demo_user" #使用ユーザを指定
database = "demo_user" #テーブルを作成するデータベースを指定
password = getpass("Password > ")
dbs_port = 1025
encryptdata = "true"
#Teradataへ接続
from sqlalchemy import create_engine
from teradataml import create_context
from urllib.parse import quote_plus
connstr = (
f"teradatasql://{user}:{quote_plus(password)}@{host}/?"
f"&database={database}"
f"&dbs_port={dbs_port}"
f"&encryptdata={encryptdata}"
)
engine = create_engine(connstr)
context = create_context(tdsqlengine=engine, temp_database_name=user)
#マニュアルのpandas DataframeをTeradataへロード
from teradataml import copy_to_sql
from teradataml.dataframe.dataframe import *
copy_to_sql(df = data_emb,
schema_name=user,
table_name='DATA_TBL', #demo_user.DATA_TBLとしてロード
primary_index = 'id',
if_exists='replace' #テーブルがすでに存在している場合には再作成する
)
マニュアルデータがTeradataに格納されました。
次に質問文をベクトル化して、それに近いマニュアルをベクトル検索で求めます。
質問はinput()で与えます。
#質問をベクトル埋め込みしてpandas DataFrameを作成する
query = input()
query_embedding = ollama.embeddings(model="kun432/cl-nagoya-ruri-base:111m", prompt=query)["embedding"]
query_list = []
query_list.append({"id":1, "text": query, "embedding": query_embedding})
query_emb = pd.DataFrame(query_list)
for i in range(768):
query_emb["embeddings_{}".format(i)] = query_emb["embedding"].apply(lambda x: x[i])
query_emb.drop("embedding", axis=1, inplace=True)
#質問のpandas DataframeをTeradataへロード
copy_to_sql(df = query_emb,
schema_name=user,
table_name='QUERY_TBL_TMP', #demo_user.QUERY_TBL_TMPとしてロード
primary_index = 'id',
if_exists='replace'
)
#VectorDistance関数にテーブルデータを渡すには、teradataml DataFrameの形式である必要がある
#マニュアル、質問データテーブルよりteradataml DataFrameを作成
DATA_TBL = DataFrame.from_table(in_schema('demo_user','DATA_TBL')).set_index("id")
QUERY_TBL_TMP = DataFrame.from_table(in_schema('demo_user','QUERY_TBL_TMP')).set_index("id")
#VectorDistance関数を使用してベクトル検索を行う
#質問に対して類似度の高い上位2つのマニュアルのIDを取得し、ID・テキスト・距離の三項目を持ったpandas DataFrameを作成する
from teradataml import VectorDistance
VectorDistance_out = VectorDistance(target_id_column="id",
target_feature_columns=['embeddings_0','embeddings_1','embeddings_2','embeddings_3','embeddings_4','embeddings_5','embeddings_6','embeddings_7','embeddings_8','embeddings_9','embeddings_10','embeddings_11','embeddings_12','embeddings_13','embeddings_14','embeddings_15','embeddings_16','embeddings_17','embeddings_18','embeddings_19','embeddings_20','embeddings_21','embeddings_22','embeddings_23','embeddings_24','embeddings_25','embeddings_26','embeddings_27','embeddings_28','embeddings_29','embeddings_30','embeddings_31','embeddings_32','embeddings_33','embeddings_34','embeddings_35','embeddings_36','embeddings_37','embeddings_38','embeddings_39','embeddings_40','embeddings_41','embeddings_42','embeddings_43','embeddings_44','embeddings_45','embeddings_46','embeddings_47','embeddings_48','embeddings_49','embeddings_50','embeddings_51','embeddings_52','embeddings_53','embeddings_54','embeddings_55','embeddings_56','embeddings_57','embeddings_58','embeddings_59','embeddings_60','embeddings_61','embeddings_62','embeddings_63','embeddings_64','embeddings_65','embeddings_66','embeddings_67','embeddings_68','embeddings_69','embeddings_70','embeddings_71','embeddings_72','embeddings_73','embeddings_74','embeddings_75','embeddings_76','embeddings_77','embeddings_78','embeddings_79','embeddings_80','embeddings_81','embeddings_82','embeddings_83','embeddings_84','embeddings_85','embeddings_86','embeddings_87','embeddings_88','embeddings_89','embeddings_90','embeddings_91','embeddings_92','embeddings_93','embeddings_94','embeddings_95','embeddings_96','embeddings_97','embeddings_98','embeddings_99','embeddings_100','embeddings_101','embeddings_102','embeddings_103','embeddings_104','embeddings_105','embeddings_106','embeddings_107','embeddings_108','embeddings_109','embeddings_110','embeddings_111','embeddings_112','embeddings_113','embeddings_114','embeddings_115','embeddings_116','embeddings_117','embeddings_118','embeddings_119','embeddings_120','embeddings_121','embeddings_122','embeddings_123','embeddings_124','embeddings_125','embeddings_126','embeddings_127','embeddings_128','embeddings_129','embeddings_130','embeddings_131','embeddings_132','embeddings_133','embeddings_134','embeddings_135','embeddings_136','embeddings_137','embeddings_138','embeddings_139','embeddings_140','embeddings_141','embeddings_142','embeddings_143','embeddings_144','embeddings_145','embeddings_146','embeddings_147','embeddings_148','embeddings_149','embeddings_150','embeddings_151','embeddings_152','embeddings_153','embeddings_154','embeddings_155','embeddings_156','embeddings_157','embeddings_158','embeddings_159','embeddings_160','embeddings_161','embeddings_162','embeddings_163','embeddings_164','embeddings_165','embeddings_166','embeddings_167','embeddings_168','embeddings_169','embeddings_170','embeddings_171','embeddings_172','embeddings_173','embeddings_174','embeddings_175','embeddings_176','embeddings_177','embeddings_178','embeddings_179','embeddings_180','embeddings_181','embeddings_182','embeddings_183','embeddings_184','embeddings_185','embeddings_186','embeddings_187','embeddings_188','embeddings_189','embeddings_190','embeddings_191','embeddings_192','embeddings_193','embeddings_194','embeddings_195','embeddings_196','embeddings_197','embeddings_198','embeddings_199','embeddings_200','embeddings_201','embeddings_202','embeddings_203','embeddings_204','embeddings_205','embeddings_206','embeddings_207','embeddings_208','embeddings_209','embeddings_210','embeddings_211','embeddings_212','embeddings_213','embeddings_214','embeddings_215','embeddings_216','embeddings_217','embeddings_218','embeddings_219','embeddings_220','embeddings_221','embeddings_222','embeddings_223','embeddings_224','embeddings_225','embeddings_226','embeddings_227','embeddings_228','embeddings_229','embeddings_230','embeddings_231','embeddings_232','embeddings_233','embeddings_234','embeddings_235','embeddings_236','embeddings_237','embeddings_238','embeddings_239','embeddings_240','embeddings_241','embeddings_242','embeddings_243','embeddings_244','embeddings_245','embeddings_246','embeddings_247','embeddings_248','embeddings_249','embeddings_250','embeddings_251','embeddings_252','embeddings_253','embeddings_254','embeddings_255','embeddings_256','embeddings_257','embeddings_258','embeddings_259','embeddings_260','embeddings_261','embeddings_262','embeddings_263','embeddings_264','embeddings_265','embeddings_266','embeddings_267','embeddings_268','embeddings_269','embeddings_270','embeddings_271','embeddings_272','embeddings_273','embeddings_274','embeddings_275','embeddings_276','embeddings_277','embeddings_278','embeddings_279','embeddings_280','embeddings_281','embeddings_282','embeddings_283','embeddings_284','embeddings_285','embeddings_286','embeddings_287','embeddings_288','embeddings_289','embeddings_290','embeddings_291','embeddings_292','embeddings_293','embeddings_294','embeddings_295','embeddings_296','embeddings_297','embeddings_298','embeddings_299','embeddings_300','embeddings_301','embeddings_302','embeddings_303','embeddings_304','embeddings_305','embeddings_306','embeddings_307','embeddings_308','embeddings_309','embeddings_310','embeddings_311','embeddings_312','embeddings_313','embeddings_314','embeddings_315','embeddings_316','embeddings_317','embeddings_318','embeddings_319','embeddings_320','embeddings_321','embeddings_322','embeddings_323','embeddings_324','embeddings_325','embeddings_326','embeddings_327','embeddings_328','embeddings_329','embeddings_330','embeddings_331','embeddings_332','embeddings_333','embeddings_334','embeddings_335','embeddings_336','embeddings_337','embeddings_338','embeddings_339','embeddings_340','embeddings_341','embeddings_342','embeddings_343','embeddings_344','embeddings_345','embeddings_346','embeddings_347','embeddings_348','embeddings_349','embeddings_350','embeddings_351','embeddings_352','embeddings_353','embeddings_354','embeddings_355','embeddings_356','embeddings_357','embeddings_358','embeddings_359','embeddings_360','embeddings_361','embeddings_362','embeddings_363','embeddings_364','embeddings_365','embeddings_366','embeddings_367','embeddings_368','embeddings_369','embeddings_370','embeddings_371','embeddings_372','embeddings_373','embeddings_374','embeddings_375','embeddings_376','embeddings_377','embeddings_378','embeddings_379','embeddings_380','embeddings_381','embeddings_382','embeddings_383','embeddings_384','embeddings_385','embeddings_386','embeddings_387','embeddings_388','embeddings_389','embeddings_390','embeddings_391','embeddings_392','embeddings_393','embeddings_394','embeddings_395','embeddings_396','embeddings_397','embeddings_398','embeddings_399','embeddings_400','embeddings_401','embeddings_402','embeddings_403','embeddings_404','embeddings_405','embeddings_406','embeddings_407','embeddings_408','embeddings_409','embeddings_410','embeddings_411','embeddings_412','embeddings_413','embeddings_414','embeddings_415','embeddings_416','embeddings_417','embeddings_418','embeddings_419','embeddings_420','embeddings_421','embeddings_422','embeddings_423','embeddings_424','embeddings_425','embeddings_426','embeddings_427','embeddings_428','embeddings_429','embeddings_430','embeddings_431','embeddings_432','embeddings_433','embeddings_434','embeddings_435','embeddings_436','embeddings_437','embeddings_438','embeddings_439','embeddings_440','embeddings_441','embeddings_442','embeddings_443','embeddings_444','embeddings_445','embeddings_446','embeddings_447','embeddings_448','embeddings_449','embeddings_450','embeddings_451','embeddings_452','embeddings_453','embeddings_454','embeddings_455','embeddings_456','embeddings_457','embeddings_458','embeddings_459','embeddings_460','embeddings_461','embeddings_462','embeddings_463','embeddings_464','embeddings_465','embeddings_466','embeddings_467','embeddings_468','embeddings_469','embeddings_470','embeddings_471','embeddings_472','embeddings_473','embeddings_474','embeddings_475','embeddings_476','embeddings_477','embeddings_478','embeddings_479','embeddings_480','embeddings_481','embeddings_482','embeddings_483','embeddings_484','embeddings_485','embeddings_486','embeddings_487','embeddings_488','embeddings_489','embeddings_490','embeddings_491','embeddings_492','embeddings_493','embeddings_494','embeddings_495','embeddings_496','embeddings_497','embeddings_498','embeddings_499','embeddings_500','embeddings_501','embeddings_502','embeddings_503','embeddings_504','embeddings_505','embeddings_506','embeddings_507','embeddings_508','embeddings_509','embeddings_510','embeddings_511','embeddings_512','embeddings_513','embeddings_514','embeddings_515','embeddings_516','embeddings_517','embeddings_518','embeddings_519','embeddings_520','embeddings_521','embeddings_522','embeddings_523','embeddings_524','embeddings_525','embeddings_526','embeddings_527','embeddings_528','embeddings_529','embeddings_530','embeddings_531','embeddings_532','embeddings_533','embeddings_534','embeddings_535','embeddings_536','embeddings_537','embeddings_538','embeddings_539','embeddings_540','embeddings_541','embeddings_542','embeddings_543','embeddings_544','embeddings_545','embeddings_546','embeddings_547','embeddings_548','embeddings_549','embeddings_550','embeddings_551','embeddings_552','embeddings_553','embeddings_554','embeddings_555','embeddings_556','embeddings_557','embeddings_558','embeddings_559','embeddings_560','embeddings_561','embeddings_562','embeddings_563','embeddings_564','embeddings_565','embeddings_566','embeddings_567','embeddings_568','embeddings_569','embeddings_570','embeddings_571','embeddings_572','embeddings_573','embeddings_574','embeddings_575','embeddings_576','embeddings_577','embeddings_578','embeddings_579','embeddings_580','embeddings_581','embeddings_582','embeddings_583','embeddings_584','embeddings_585','embeddings_586','embeddings_587','embeddings_588','embeddings_589','embeddings_590','embeddings_591','embeddings_592','embeddings_593','embeddings_594','embeddings_595','embeddings_596','embeddings_597','embeddings_598','embeddings_599','embeddings_600','embeddings_601','embeddings_602','embeddings_603','embeddings_604','embeddings_605','embeddings_606','embeddings_607','embeddings_608','embeddings_609','embeddings_610','embeddings_611','embeddings_612','embeddings_613','embeddings_614','embeddings_615','embeddings_616','embeddings_617','embeddings_618','embeddings_619','embeddings_620','embeddings_621','embeddings_622','embeddings_623','embeddings_624','embeddings_625','embeddings_626','embeddings_627','embeddings_628','embeddings_629','embeddings_630','embeddings_631','embeddings_632','embeddings_633','embeddings_634','embeddings_635','embeddings_636','embeddings_637','embeddings_638','embeddings_639','embeddings_640','embeddings_641','embeddings_642','embeddings_643','embeddings_644','embeddings_645','embeddings_646','embeddings_647','embeddings_648','embeddings_649','embeddings_650','embeddings_651','embeddings_652','embeddings_653','embeddings_654','embeddings_655','embeddings_656','embeddings_657','embeddings_658','embeddings_659','embeddings_660','embeddings_661','embeddings_662','embeddings_663','embeddings_664','embeddings_665','embeddings_666','embeddings_667','embeddings_668','embeddings_669','embeddings_670','embeddings_671','embeddings_672','embeddings_673','embeddings_674','embeddings_675','embeddings_676','embeddings_677','embeddings_678','embeddings_679','embeddings_680','embeddings_681','embeddings_682','embeddings_683','embeddings_684','embeddings_685','embeddings_686','embeddings_687','embeddings_688','embeddings_689','embeddings_690','embeddings_691','embeddings_692','embeddings_693','embeddings_694','embeddings_695','embeddings_696','embeddings_697','embeddings_698','embeddings_699','embeddings_700','embeddings_701','embeddings_702','embeddings_703','embeddings_704','embeddings_705','embeddings_706','embeddings_707','embeddings_708','embeddings_709','embeddings_710','embeddings_711','embeddings_712','embeddings_713','embeddings_714','embeddings_715','embeddings_716','embeddings_717','embeddings_718','embeddings_719','embeddings_720','embeddings_721','embeddings_722','embeddings_723','embeddings_724','embeddings_725','embeddings_726','embeddings_727','embeddings_728','embeddings_729','embeddings_730','embeddings_731','embeddings_732','embeddings_733','embeddings_734','embeddings_735','embeddings_736','embeddings_737','embeddings_738','embeddings_739','embeddings_740','embeddings_741','embeddings_742','embeddings_743','embeddings_744','embeddings_745','embeddings_746','embeddings_747','embeddings_748','embeddings_749','embeddings_750','embeddings_751','embeddings_752','embeddings_753','embeddings_754','embeddings_755','embeddings_756','embeddings_757','embeddings_758','embeddings_759','embeddings_760','embeddings_761','embeddings_762','embeddings_763','embeddings_764','embeddings_765','embeddings_766','embeddings_767'],
ref_id_column="id",
ref_feature_columns=['embeddings_0','embeddings_1','embeddings_2','embeddings_3','embeddings_4','embeddings_5','embeddings_6','embeddings_7','embeddings_8','embeddings_9','embeddings_10','embeddings_11','embeddings_12','embeddings_13','embeddings_14','embeddings_15','embeddings_16','embeddings_17','embeddings_18','embeddings_19','embeddings_20','embeddings_21','embeddings_22','embeddings_23','embeddings_24','embeddings_25','embeddings_26','embeddings_27','embeddings_28','embeddings_29','embeddings_30','embeddings_31','embeddings_32','embeddings_33','embeddings_34','embeddings_35','embeddings_36','embeddings_37','embeddings_38','embeddings_39','embeddings_40','embeddings_41','embeddings_42','embeddings_43','embeddings_44','embeddings_45','embeddings_46','embeddings_47','embeddings_48','embeddings_49','embeddings_50','embeddings_51','embeddings_52','embeddings_53','embeddings_54','embeddings_55','embeddings_56','embeddings_57','embeddings_58','embeddings_59','embeddings_60','embeddings_61','embeddings_62','embeddings_63','embeddings_64','embeddings_65','embeddings_66','embeddings_67','embeddings_68','embeddings_69','embeddings_70','embeddings_71','embeddings_72','embeddings_73','embeddings_74','embeddings_75','embeddings_76','embeddings_77','embeddings_78','embeddings_79','embeddings_80','embeddings_81','embeddings_82','embeddings_83','embeddings_84','embeddings_85','embeddings_86','embeddings_87','embeddings_88','embeddings_89','embeddings_90','embeddings_91','embeddings_92','embeddings_93','embeddings_94','embeddings_95','embeddings_96','embeddings_97','embeddings_98','embeddings_99','embeddings_100','embeddings_101','embeddings_102','embeddings_103','embeddings_104','embeddings_105','embeddings_106','embeddings_107','embeddings_108','embeddings_109','embeddings_110','embeddings_111','embeddings_112','embeddings_113','embeddings_114','embeddings_115','embeddings_116','embeddings_117','embeddings_118','embeddings_119','embeddings_120','embeddings_121','embeddings_122','embeddings_123','embeddings_124','embeddings_125','embeddings_126','embeddings_127','embeddings_128','embeddings_129','embeddings_130','embeddings_131','embeddings_132','embeddings_133','embeddings_134','embeddings_135','embeddings_136','embeddings_137','embeddings_138','embeddings_139','embeddings_140','embeddings_141','embeddings_142','embeddings_143','embeddings_144','embeddings_145','embeddings_146','embeddings_147','embeddings_148','embeddings_149','embeddings_150','embeddings_151','embeddings_152','embeddings_153','embeddings_154','embeddings_155','embeddings_156','embeddings_157','embeddings_158','embeddings_159','embeddings_160','embeddings_161','embeddings_162','embeddings_163','embeddings_164','embeddings_165','embeddings_166','embeddings_167','embeddings_168','embeddings_169','embeddings_170','embeddings_171','embeddings_172','embeddings_173','embeddings_174','embeddings_175','embeddings_176','embeddings_177','embeddings_178','embeddings_179','embeddings_180','embeddings_181','embeddings_182','embeddings_183','embeddings_184','embeddings_185','embeddings_186','embeddings_187','embeddings_188','embeddings_189','embeddings_190','embeddings_191','embeddings_192','embeddings_193','embeddings_194','embeddings_195','embeddings_196','embeddings_197','embeddings_198','embeddings_199','embeddings_200','embeddings_201','embeddings_202','embeddings_203','embeddings_204','embeddings_205','embeddings_206','embeddings_207','embeddings_208','embeddings_209','embeddings_210','embeddings_211','embeddings_212','embeddings_213','embeddings_214','embeddings_215','embeddings_216','embeddings_217','embeddings_218','embeddings_219','embeddings_220','embeddings_221','embeddings_222','embeddings_223','embeddings_224','embeddings_225','embeddings_226','embeddings_227','embeddings_228','embeddings_229','embeddings_230','embeddings_231','embeddings_232','embeddings_233','embeddings_234','embeddings_235','embeddings_236','embeddings_237','embeddings_238','embeddings_239','embeddings_240','embeddings_241','embeddings_242','embeddings_243','embeddings_244','embeddings_245','embeddings_246','embeddings_247','embeddings_248','embeddings_249','embeddings_250','embeddings_251','embeddings_252','embeddings_253','embeddings_254','embeddings_255','embeddings_256','embeddings_257','embeddings_258','embeddings_259','embeddings_260','embeddings_261','embeddings_262','embeddings_263','embeddings_264','embeddings_265','embeddings_266','embeddings_267','embeddings_268','embeddings_269','embeddings_270','embeddings_271','embeddings_272','embeddings_273','embeddings_274','embeddings_275','embeddings_276','embeddings_277','embeddings_278','embeddings_279','embeddings_280','embeddings_281','embeddings_282','embeddings_283','embeddings_284','embeddings_285','embeddings_286','embeddings_287','embeddings_288','embeddings_289','embeddings_290','embeddings_291','embeddings_292','embeddings_293','embeddings_294','embeddings_295','embeddings_296','embeddings_297','embeddings_298','embeddings_299','embeddings_300','embeddings_301','embeddings_302','embeddings_303','embeddings_304','embeddings_305','embeddings_306','embeddings_307','embeddings_308','embeddings_309','embeddings_310','embeddings_311','embeddings_312','embeddings_313','embeddings_314','embeddings_315','embeddings_316','embeddings_317','embeddings_318','embeddings_319','embeddings_320','embeddings_321','embeddings_322','embeddings_323','embeddings_324','embeddings_325','embeddings_326','embeddings_327','embeddings_328','embeddings_329','embeddings_330','embeddings_331','embeddings_332','embeddings_333','embeddings_334','embeddings_335','embeddings_336','embeddings_337','embeddings_338','embeddings_339','embeddings_340','embeddings_341','embeddings_342','embeddings_343','embeddings_344','embeddings_345','embeddings_346','embeddings_347','embeddings_348','embeddings_349','embeddings_350','embeddings_351','embeddings_352','embeddings_353','embeddings_354','embeddings_355','embeddings_356','embeddings_357','embeddings_358','embeddings_359','embeddings_360','embeddings_361','embeddings_362','embeddings_363','embeddings_364','embeddings_365','embeddings_366','embeddings_367','embeddings_368','embeddings_369','embeddings_370','embeddings_371','embeddings_372','embeddings_373','embeddings_374','embeddings_375','embeddings_376','embeddings_377','embeddings_378','embeddings_379','embeddings_380','embeddings_381','embeddings_382','embeddings_383','embeddings_384','embeddings_385','embeddings_386','embeddings_387','embeddings_388','embeddings_389','embeddings_390','embeddings_391','embeddings_392','embeddings_393','embeddings_394','embeddings_395','embeddings_396','embeddings_397','embeddings_398','embeddings_399','embeddings_400','embeddings_401','embeddings_402','embeddings_403','embeddings_404','embeddings_405','embeddings_406','embeddings_407','embeddings_408','embeddings_409','embeddings_410','embeddings_411','embeddings_412','embeddings_413','embeddings_414','embeddings_415','embeddings_416','embeddings_417','embeddings_418','embeddings_419','embeddings_420','embeddings_421','embeddings_422','embeddings_423','embeddings_424','embeddings_425','embeddings_426','embeddings_427','embeddings_428','embeddings_429','embeddings_430','embeddings_431','embeddings_432','embeddings_433','embeddings_434','embeddings_435','embeddings_436','embeddings_437','embeddings_438','embeddings_439','embeddings_440','embeddings_441','embeddings_442','embeddings_443','embeddings_444','embeddings_445','embeddings_446','embeddings_447','embeddings_448','embeddings_449','embeddings_450','embeddings_451','embeddings_452','embeddings_453','embeddings_454','embeddings_455','embeddings_456','embeddings_457','embeddings_458','embeddings_459','embeddings_460','embeddings_461','embeddings_462','embeddings_463','embeddings_464','embeddings_465','embeddings_466','embeddings_467','embeddings_468','embeddings_469','embeddings_470','embeddings_471','embeddings_472','embeddings_473','embeddings_474','embeddings_475','embeddings_476','embeddings_477','embeddings_478','embeddings_479','embeddings_480','embeddings_481','embeddings_482','embeddings_483','embeddings_484','embeddings_485','embeddings_486','embeddings_487','embeddings_488','embeddings_489','embeddings_490','embeddings_491','embeddings_492','embeddings_493','embeddings_494','embeddings_495','embeddings_496','embeddings_497','embeddings_498','embeddings_499','embeddings_500','embeddings_501','embeddings_502','embeddings_503','embeddings_504','embeddings_505','embeddings_506','embeddings_507','embeddings_508','embeddings_509','embeddings_510','embeddings_511','embeddings_512','embeddings_513','embeddings_514','embeddings_515','embeddings_516','embeddings_517','embeddings_518','embeddings_519','embeddings_520','embeddings_521','embeddings_522','embeddings_523','embeddings_524','embeddings_525','embeddings_526','embeddings_527','embeddings_528','embeddings_529','embeddings_530','embeddings_531','embeddings_532','embeddings_533','embeddings_534','embeddings_535','embeddings_536','embeddings_537','embeddings_538','embeddings_539','embeddings_540','embeddings_541','embeddings_542','embeddings_543','embeddings_544','embeddings_545','embeddings_546','embeddings_547','embeddings_548','embeddings_549','embeddings_550','embeddings_551','embeddings_552','embeddings_553','embeddings_554','embeddings_555','embeddings_556','embeddings_557','embeddings_558','embeddings_559','embeddings_560','embeddings_561','embeddings_562','embeddings_563','embeddings_564','embeddings_565','embeddings_566','embeddings_567','embeddings_568','embeddings_569','embeddings_570','embeddings_571','embeddings_572','embeddings_573','embeddings_574','embeddings_575','embeddings_576','embeddings_577','embeddings_578','embeddings_579','embeddings_580','embeddings_581','embeddings_582','embeddings_583','embeddings_584','embeddings_585','embeddings_586','embeddings_587','embeddings_588','embeddings_589','embeddings_590','embeddings_591','embeddings_592','embeddings_593','embeddings_594','embeddings_595','embeddings_596','embeddings_597','embeddings_598','embeddings_599','embeddings_600','embeddings_601','embeddings_602','embeddings_603','embeddings_604','embeddings_605','embeddings_606','embeddings_607','embeddings_608','embeddings_609','embeddings_610','embeddings_611','embeddings_612','embeddings_613','embeddings_614','embeddings_615','embeddings_616','embeddings_617','embeddings_618','embeddings_619','embeddings_620','embeddings_621','embeddings_622','embeddings_623','embeddings_624','embeddings_625','embeddings_626','embeddings_627','embeddings_628','embeddings_629','embeddings_630','embeddings_631','embeddings_632','embeddings_633','embeddings_634','embeddings_635','embeddings_636','embeddings_637','embeddings_638','embeddings_639','embeddings_640','embeddings_641','embeddings_642','embeddings_643','embeddings_644','embeddings_645','embeddings_646','embeddings_647','embeddings_648','embeddings_649','embeddings_650','embeddings_651','embeddings_652','embeddings_653','embeddings_654','embeddings_655','embeddings_656','embeddings_657','embeddings_658','embeddings_659','embeddings_660','embeddings_661','embeddings_662','embeddings_663','embeddings_664','embeddings_665','embeddings_666','embeddings_667','embeddings_668','embeddings_669','embeddings_670','embeddings_671','embeddings_672','embeddings_673','embeddings_674','embeddings_675','embeddings_676','embeddings_677','embeddings_678','embeddings_679','embeddings_680','embeddings_681','embeddings_682','embeddings_683','embeddings_684','embeddings_685','embeddings_686','embeddings_687','embeddings_688','embeddings_689','embeddings_690','embeddings_691','embeddings_692','embeddings_693','embeddings_694','embeddings_695','embeddings_696','embeddings_697','embeddings_698','embeddings_699','embeddings_700','embeddings_701','embeddings_702','embeddings_703','embeddings_704','embeddings_705','embeddings_706','embeddings_707','embeddings_708','embeddings_709','embeddings_710','embeddings_711','embeddings_712','embeddings_713','embeddings_714','embeddings_715','embeddings_716','embeddings_717','embeddings_718','embeddings_719','embeddings_720','embeddings_721','embeddings_722','embeddings_723','embeddings_724','embeddings_725','embeddings_726','embeddings_727','embeddings_728','embeddings_729','embeddings_730','embeddings_731','embeddings_732','embeddings_733','embeddings_734','embeddings_735','embeddings_736','embeddings_737','embeddings_738','embeddings_739','embeddings_740','embeddings_741','embeddings_742','embeddings_743','embeddings_744','embeddings_745','embeddings_746','embeddings_747','embeddings_748','embeddings_749','embeddings_750','embeddings_751','embeddings_752','embeddings_753','embeddings_754','embeddings_755','embeddings_756','embeddings_757','embeddings_758','embeddings_759','embeddings_760','embeddings_761','embeddings_762','embeddings_763','embeddings_764','embeddings_765','embeddings_766','embeddings_767'],
distance_measure=['Cosine'], #類似度検索の手法を指定。今回はコサイン類似度を用います
topk=2, #類似しているデータの上位2個を取得
target_data=QUERY_TBL_TMP, #質問テーブルを指定
reference_data=DATA_TBL #マニュアルデータテーブルを指定
).result.join(other = DATA_TBL, on = ['reference_id = id']).select(['id','text','distance']).sort('id').to_pandas(index_column = 'id')
data_text=VectorDistance_out['text'].tolist()
#質問文と抽出した情報をLLMに与える
output = ollama.generate(
model="gemma3:latest",
prompt=f"以下の情報を踏まえて、質問に回答してください。情報: {data_text} 質問: {query}"
)
print(output['response'])
※VectorDistance関数は類似度の高いマニュアルのIDと距離しか返してくれないため、元のマニュアルテーブルと結合してテキストを取得しています。
最終的には以下のような項目のDataFrameが得られ、その中の「text」項目の内容をLLMに入力します。(DF内容は質問文②の場合)
id | text | distance |
---|---|---|
6 | 経費精算手続き:経費は立替精算方式で、領収書を受領し「NeoExpense」に登録します。交... | 0.100732 |
9 | 退職・異動手続き:退職希望者は一か月前までに上長へ申し出る必要があります。退職時は引き継ぎ計... | 0.181134 |
5.RAG構築後の回答
質問文①:新入社員の初期研修は何日間行いますか?
新入社員の初期研修は三週間行います。
質問文②:経費精算手続きはどうすればよいのでしょうか?
経費精算手続きは以下の通りです。
1. 経費は立替精算方式で、領収書を受領します。
2. 領収書を「NeoExpense」に登録します。
3. 交通費は合理的な経路を選び、特急や航空機利用は事前承認が必要です。
4. 接待交際費は上長承認と顧客名の記録が必須で、過剰提供は禁止です。
5. 精算は月末締め翌月10日提出とし、遅延は翌月処理になります。
マニュアルより内容を持ってくることができました。
6.感想
簡単な作りなので割とすんなり作れました。
次のステップとして、LangChainを利用したり、メタデータを活用したりしてRAGを構築してみたいと思います。