Skip to content

Intersystems-jp/TryAIDevelopment

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🀖はじめおのAI開発 れロからのIRIS環境構築ずOpenAI連携チャットボット䜜り

🐋コンテナを利甚しお InterSystems IRIS の環境をコマンド 1 ぀で立ち䞊げ、暙準的な IDE である VSCode を䜿甚しお開発䜓隓を味わっおいただきながら、OpenAI API ず連携したシンプルなチャットボットを䜜成したす。

IRIS の環境構築からチャットボットアプリ実装たで、䞀緒に詊しながら「AI アプリを䜜成できた思ったより簡単」を参加者の皆さんず共有したしょう🔥

目次

事前準備

以䞋のむンストヌルずコンテナむメヌゞの pull を事前に行っおください。

  • VSCode

  • Docker

  • Docker compose

  • Git可胜であれば

  • IRIS コンテナの Pull

    docker pull containers.intersystems.com/intersystems/iris-community:2025.2
    

準備はよろしいですか👀

それでは早速、はじめたしょう💚

Phase1-爆速環境構築

docker compose を䜿甚しお IRIS コンテナを立ち䞊げ、VSCode や管理ツヌルからの接続を䜓隓したす。

(1)環境構築

早速、今日の流れが含たれるリポゞトリを clone たたは、ダりンロヌドしたしょう。

WSL 䞊に docker、docker compose、git をむンストヌルしおいる堎合は、WSL のタヌミナル䞊で git clone を行っおから以䞋の流れで VSCode を開くず操䜜が簡単です。

git clone https://github.com/Intersystems-jp/TryAIDevelopment.git

Zipでダりンロヌドした方は、展開しおください。

git clone たたは展開したディレクトリに移動し、以䞋実行するず VSCode が開き本日のワヌクスペヌスが開きたす。

code .

メモVSCode 䞊で README を以䞋の方法で開くず衚瀺圢匏で参照できたす。

ワヌクショップ盎䞋に .env があるので開きたす。

珟圚

OPENAI_API_KEY=

ず蚘茉されおいたすが、= の右偎 OpenAI の APIキヌ情報を远蚘し保存しおください二重匕甚笊は䞍芁です。

次に、以䞋のコマンドを実行したす。初回実行時のみコンテナのビルドが実行され、ビルドが終わるずコンテナを開始したす。

docker compose up -d

事前に IRIS のコンテナむメヌゞを pull しおいない堎合は少し時間がかかりたす。

以䞊で、本日の環境構築完了です

(2) VSCode での操䜜

次は、VSCode を利甚しお IRIS に接続したり、タヌミナルセッションから IRIS にログむンしおみたしょう

IRIS に接続するために必芁な、ObjectScript ゚クステンションをむンストヌルしたす。

むンストヌル方法の図解 「VSCodeを䜿っおみよう1、ObjectScript甚゚クステンションのむンストヌル」をご芧いただきながらむンストヌルしおみたしょう。

むンストヌルが完了したら、コンテナで起動しおいる IRIS に接続したす。接続するずワヌクスペヌスで IRIS のクラス定矩の䜜成、サヌバヌ偎コヌドの参照、管理ツヌルを起動するためのメニュヌ衚瀺などが行えたす。

本日の接続先情報は以䞋の通りです。

host port scheme pathPrefix
127.0.0.1 52773 http 指定したせん

接続方法の図解 「VSCodeを䜿っおみよう2、サヌバぞ接続する」をご芧いただきながら蚭定しおみたしょう。

接続が完了するず、管理ポヌタルを開くためのメニュヌなどが図のように開くこずができたす。

VSCode 䞊郚に衚瀺されるメニュヌの䞭から「Open Management Portal」をクリックし、管理ポヌタルを開いおみたしょう。

ナヌザ名、パスワヌドの入力画面が衚瀺されたす。ハンズオン環境では、以䞋のナヌザ名、パスワヌドでログむンしおください。

ナヌザ名 パスワヌド
SuperUser SYS

ログむンが完了するず以䞋の画面が開きたす。

ハンズオンでは、管理ポヌタルのSQLメニュヌを䞭心に操䜜しおきたす。

管理ポヌタル > [システム゚クスプロヌラ] > [SQL]

なお、SQL の操䜜に぀いおは、SQL shell でも行えたす。SQL shell を開くために、IRIS にログむンしおみたしょう。

VSCode の「Terminal」メニュヌをクリックし、「New Terminal」をクリックし、コンテナにログむンしたす。

本日のIRISのコンテナ名は、tryaidevelop です。

docker exec -it tryaidevelop bash

コンテナにログむンできたら、次は IRIS にログむンしたす以降 IRIS にログむンした端末を「IRIS タヌミナル」ず呌んでいきたす。

iris session iris

実行䟋は以䞋の通りです。

irisowner@0809d9d83a12:/opt/src$ iris session iris

ノヌド: 0809d9d83a12 むンスタンス: IRIS

USER>

USER> はネヌムスペヌスのプロンプトで、IRIS の USER ネヌムスペヌスにログむンしたこずを衚しおいたす。

このプロンプトが衚瀺されたらログむン成功です。

USER ネヌムスペヌスは、USER デヌタベヌスに接続する定矩が行われおいたすので、ここで SQL shell に切り替えお CREATE TABLE 文を実行するず、USER デヌタベヌスにテヌブル定矩が保存されるようになりたす。

SQL shell に切り替えるには、:s を入力したす。SQL shell を終了するずきは、quit たたは q を入力したす。

䟋

USER>:s
SQL Command Line Shell
----------------------------------------------------

The command prefix is currently set to: <<nothing>>.
Enter <command>, 'q' to quit, '?' for help.
[SQL]USER>>quit

USER>

ちなみに、コンテナログむン埌、盎接 IRIS の SQL shell を開くこずもできたす。iris sql iris

詊される方は、䞀旊 IRISの接続を終了するため、halt たたは h を入力したす。

USER>h
irisowner@0809d9d83a12:/opt/src$

盎接 IRIS の SQL shell を起動する方法は以䞋の通りです。終了する堎合は、quit たたは q を入力したす。

実行䟋は以䞋の通りです。

irisowner@0809d9d83a12:/opt/src$ iris sql iris
SQL Command Line Shell
----------------------------------------------------

The command prefix is currently set to: <<nothing>>.
Enter <command>, 'q' to quit, '?' for help.
[SQL]USER>>q
irisowner@0809d9d83a12:/opt/src$ 

なお、コンテナをログアりトする堎合は exit を入力しおください。

💡 たずめ

ここたでの流れで、IRIS コンテナを開始し、VSCode の ObjectScript ゚クステンションを䜿甚しお、IRIS に接続を行いたした。

VSCode を䜿甚しお、管理ポヌタルの起動や、Terminal を利甚しお IRIS ぞのログむンIRIS タヌミナルにログむン、SQL shell の起動を確認したした。

管理ポヌタルやタヌミナルセッション、プログラミング蚀語から接続するずきの接続先情報には、ネヌムスペヌスを指定するルヌルがありたすので、ハンズオン環境では、USER ネヌムスペヌス を接続先情報ずしお必ず指定しおしたしょう。

ネヌムスペヌスずはに぀いお詳しくは、参考動画もご参照ください🎥 InterSystems IRIS で開発を始めおみよう7:03以降ネヌムスペヌスずデヌタベヌスに぀いお

Phase2-IRIS デヌタベヌスの基瀎䜓隓

テヌブル定矩を䜜成し VSCode や管理ツヌルからデヌタの参照曎新などを詊したす。

ハンズオンでは、🀖AI チャットボットを䜜成しおいきたす。

チャット画面を閉じおも、前回の䌚話履歎を再珟できるず䟿利ですので、䌚話履歎をデヌタベヌスに登録できるようにテヌブルを甚意しおみたす。

テヌブルFS.MyLog のカラム定矩は以䞋の通りです。

カラム名 型 内容
LogDT DATETIME ログを蚘録した日付時刻
Content VARCHAR(10000) ログ蚘録時点の䌚話履歎党䜓

では、早速テヌブル定矩を䜜成したしょう

DDL 文の実行は、管理ポヌタルのSQL画面からでも、IRIS タヌミナルを SQL Shell に切り替えお実行でも、どちらでもかたいたせん。

SQL Shell は起動埌、耇数行の実行モヌドではありたせんので、1床 Enter 入力するず䟿利です。実行呜什には、go を入力しおください。

実行する文章は以䞋の通りです。

create table FS.MyLog (LogDT DATETIME,Content VARCHAR(100000))

実行埌、詊しにデヌタを登録しおみたしょう

insert into FS.MyLog (LogDT,Content) VALUES('2025-10-31 12:10:05','今日は䜕の日')

衚瀺しおみたしょう。

select * from FS.MyLog

埌でチャットボットからの䌚話履歎を登録したいので、䞀旊デヌタをクリアしたい方は、truncate table を実行しおください。

truncate table FS.MyLog

💡たずめ

ここたでの流れで、IRIS の管理ポヌタルや SQL shell を䜿っおテヌブル定矩を䜜成し、デヌタ登録、参照が行えるこずを確認し、䞀般的な RDB 補品ず同じように SQL の操䜜ができるこず確認できたした

次はいよいよ、ベクトル怜玢のための準備を行っおいきたす

VSCode の SQLTools ゚クステンションを利甚しおも操䜜できたす。詳しくは「VSCodeSQLTools で IRIS に接続する方法」をご参照ください。

Phase3-ベクトル怜玢

瀟内文曞を䜿った生成 AI 掻甚を目指し、サンプル文章をベクトル化したものを IRIS に栌玍したす。

(1) ハンズオンのテヌマ

瀟内の芏則人事芏定をよく知る AI チャットボットを䜜っお以䞋のような質問に回答できるようにしたす。

  • 育䌑をずろうず思うけど、申請の仕方や準備しないずいけないものは䜕

  • 勀務䞭に階段で螏み倖しお足を骚折したした。治療費など䌚瀟に請求できたすか

  • 介護䌑暇を取埗する堎合の申請手順を教えおください。䞀般的な瀟内の報告順も教えおください。

  • パワハラを受けおいる人がいるこずを人事に䌝えようず思いたすが密告者を保護する芏則はありたすか

生成 AI に䞊蚘質問をするずもちろん回答は返りたすが、䞀般的な回答しか返せないため、瀟内の人事芏定に則っおいるのかたではわかりたせん。

そこで、瀟内の芏則に沿った回答を返せるように、チャットボットに入力された質問に類䌌する情報を人事芏定から入手し、ナヌザの質問に添えお生成 AI に枡し、回答を䜜っおもらおうず思いたす。

ハンズオンで䜿甚する人事芏定は、厚生省が公開しおいる 「モデル就業芏則」 を䜿甚したす。

泚意モデル就業芏則であるため、具䜓的な数倀などは含たれおいたせん。そのため、十分な補足情報にならない可胜性もありたす。

(2) 前凊理

生成 AI にファむルを添付しお回答をしおもらうのも 1 ぀の手段ですが、人事芏定は情報量が倚いためチャット内で䜿甚できるトヌクン数の制限をすぐに超えおしたう可胜性が高いです。

そのため、沢山ある情報の䞭かから質問に類䌌した情報だけを抜出すれば、トヌクン数を枛らすこずができたす。

この 「類䌌した情報だけを抜出する」 ためには、どうしたらいいでしょうか・・。


そうです 💡ベクトル怜玢です💡

IRIS でベクトル怜玢を行うためには、人事芏定の䞭に含たれる情報からベクトルを䜜っおテヌブルに栌玍しおおく必芁がありたす。

ここで問題になるのが、人事芏定は非垞に長い文章です。ハンズオンで䜿甚する OpenAI の text-embedding-3-small の Embeddingベクトル化は、1536 トヌクンなので、PDF にある党文字列からベクトルを䜜るこずは䞍可胜です。

ベクトルを正しく䜜るためには、人事芏定の文章を 1536 トヌクンの制限に合うように、分割しおいく必芁がありそうです。

参考情報Tiktokenizer では、モデルを指定した埌、確認したい文字列を入力するずトヌクンサむズをカりントしおくれたす。gpt-4-mini は、「o200k_base」 text-embedding-3-small は、「cl100k_base」を指定したす。ご参考Encodings

次に問題になるのが、PDF からどのように文章を取り出すか、に぀いおです。

様々な方法がありたすが、今回は豊富な機胜を持぀ Docling の力を借りたした。

参考情報ドキュメントファむルの解析ず倉換に特化したオヌプン゜ヌスツヌル「docling」を詊しおみた

Docling を䜿い、䞀旊 PDF をマヌクダりン圢匏に倉換しおいたす。

マヌクダりン圢匏でなくおも単玔な文字の抜出もできたすが、マヌクダりンの良い点は、文曞のタむトルや芋出し情報をみ぀けやすい点です。たた衚もマヌクダりンで衚珟できるため、今回は、マヌクダりン→トヌクンの制限未満の文字列抜出 を行っおいたす。

このほかにも、もっず良い方法があるかもしれたせんご存知でしたらぜひ共有お願いしたす

PDF からの倉換凊理ですが、操䜜される機材によっお凊理速床がかなり違うためMacだず数十秒、賌入から 3 幎経過の Windwos や Google Colab だず 20 分、など様々です。ハンズオンでは、PDF からマヌクダりン、マヌクダりンからテヌブル栌玍に必芁な情報に倉換したファむルEmbedding付きを䜿甚するこずにしたす。

ファむル名 ファむルの圢匏 ご参考倉換に䜿ったプログラム
mhlw_full_caption_only.md マヌクダりン pdfmarkdown.py
mhlw_hr_rules_chunk_embeddings.jsonl
※このファむルの䞭身をベクトル怜玢で䜿甚するテヌブルに栌玍したす
JSON markdownToChunk.py

(3) ベクトル怜玢甚テヌブル䜜成

mhlw_hr_rules_chunk_embeddings.jsonl の䞭の情報をテヌブルに登録したす。

JSON の䞭身は以䞋の通りです。

{"id": "mhlw-hr-00001", "title": "モデル就業芏則", "text": "什和幎月版厚生劎働省劎働基準局監督課", "n_tokens": 30, "embedding": [-0.020464539527893066, 0.05013052746653557, -- 省略]}

"text" の䞭身の Embedding が "embedding" に蚭定されおいたす。

"embedding" はベクトルで、OpenAIの text-embedding-3-small の Embeddingベクトル化は、1536 次元なので、VECTOR 型を利甚しお、以䞋のようにテヌブルを䜜成したす。

CREATE TABLE FS.Document (
    Source VARCHAR(100),
    Title VARCHAR(100),
    Text VARCHAR(100000),
    NumOfToken INTEGER,
    TextVec VECTOR(Float,1536)
)

テヌブル定矩をよく芋るず、ベクトル甚の VECTOR 型以倖の通垞の型VARCHARやINTEGERを䜿甚する列も含たれおいたす。

䟋えば、ある倀でフィルタリングした埌、ベクトル怜玢で類䌌するものを取埗したい、ずいうような䜿い方に利甚できたす。

それでは、管理ポヌタルの SQL 画面、たたは、IRISタヌミナルを SQL shell に切り替えお、䞊蚘 CREATE 文を実行しおください。

テヌブル定矩の䜜成が完了したら、ベクトル怜玢を高速に凊理できるように、以䞋のむンデックス文を実行したす。

CREATE INDEX HNSWIndex ON TABLE FS.Document (TextVec)
     AS HNSW(Distance='DotProduct')

埌は、mhlw_hr_rules_chunk_embeddings.jsonl をテヌブルにむンポヌトするだけです。

予め IRIS のクラス定矩にむンポヌト甚メ゜ッドを甚意しおいたす。FS.InstallUtils.clsクラスのloadvectorjsonl() です。

メ゜ッドの実行は、IRIS タヌミナルで行いたす。

iris session iris で IRIS タヌミナルを起動し、以䞋実行したす。

do ##class(FS.InstallUtils).loadvectorjsonl("/data/mhlw_hr_rules_chunk_embeddings.jsonl",1)

IRIS はデヌタベヌス偎でプログラミングができる特城がありたす。メ゜ッドのコヌドは IRIS 独自の ObjectScript たたは Python を遞択できたす。

以䞊でベクトル怜玢のためのテヌブルの準備が完了です。

(4) ベクトル怜玢のテスト

早速、ベクトル怜玢で、質問内容に類䌌する人事芏定が拟えるか確認しおみたす。

怜玢を行うためには、質問内容の文字列を Embedding する必芁がありたす。

Embedding のためのコヌドは、あらかじめ甚意しおあり utils.py の getEmbed() 関数に蚘茉しおいたす。

質問内容を getEmbed() の匕数に指定し、ベクトルを入手した埌、以䞋 SQL を実行し、類䌌する人事芏定を入手できるかテストしたす実際の実行は埌ほど行いたす。

select TOP 5 VECTOR_DOT_PRODUCT(TextVec,TO_VECTOR(?,FLOAT,1536)) as sim ,Source,Title,Text
 FROM FS.Document ORDER BY sim DESC

メモSQL 文内の ? は匕数入力の眮き換え文字プレヌスホルダです。

それでは早速、Python シェルを起動したす。本日は、IRIS にログむンしたタヌミナルを Python シェルに切り替えお実隓しおみたす。

 IRIS にログむンしたタヌミナルを Python shell に切り替える

これはどういうこずかず蚀いたすず、

IRIS は、デヌタベヌスなのですが、サヌバ偎で Python を実行できたす。この Python は、「Embedded Python たたは埋め蟌み Python」ず呌ばれおいお、IRIS サヌバ内に Python のランタむムを組み蟌んでいるため、ネットワヌクコネクションを䜿甚せずに IRIS にあるデヌタにアクセスできたす。

それでは早速詊しおみたしょう

IRIS にログむンした埌、Python shell に切り替えるには、:p を入力したす。

コンテナにログむンした埌の状態から iris session iris で IRIS タヌミナルを開きたす。

iris session iris

Python shell に切り替えたす。

:p

ここたでの画面䟋は以䞋の通りです。

irisowner@6eb0d94d6ff1:/opt/src$ iris session iris

ノヌド: 6eb0d94d6ff1 むンスタンス: IRIS

USER>:p

Python 3.12.3 (main, Aug 14 2025, 17:47:21) [GCC 13.3.0] on linux
Type quit() or Ctrl-D to exit this shell.
>>> 

Embedding に必芁な utils.py をむンポヌトし、指定文字のベクトルを任意の倉数に代入したす。

utils.py は /src 以䞋に配眮しおいたす。

import sys
sys.path+=["/src"]
import utils

「育䌑をずろうず思うけど、申請の仕方や準備しないずいけないものは䜕」 のベクトルを䜜成したす。

embedding=utils.getEmbed("育䌑をずろうず思うけど、申請の仕方や準備しないずいけないものは䜕")

続いお、SQL を実行したす。Embedded Python 内で IRIS の操䜜をするには、import iris を行いたす。

import iris

実行する SQL 文を倉数に蚭定したす。

匕数には眮き換え文字プレヌスホルダヌの ? を指定できたす。

sql="""
    select TOP 5 VECTOR_DOT_PRODUCT(TextVec,TO_VECTOR(?,FLOAT,1536)) as sim ,Source,Title,Text
    FROM FS.Document ORDER BY sim DESC
    """

💡解説VECTOR_DOT_PRODUCT(TextVec,TO_VECTOR(?,FLOAT,1536)) の意味

VECTOR_DOT_PRODUCT()関数は、ベクトルのドット積を求める関数です。

OpenAI の Embeddings のドキュメントより、「Embeddingの長さは1に正芏化されおいる」ずあるので、ベクトルのドット積を求める関数を利甚しおいたす。

SQL を実行したす。dataframe() 関数を䜿っお結果を確認しおみたす。

SQL の実行は、iris.sql.exec(SQL文)、たたは statement=iris.sql.prepare(SQL文)  statement.execute(匕数) で実行できたす。

匕数があるので、iris.sql.prepare() で実行しおみたす。

statement=iris.sql.prepare(sql)
result=statement.execute(embedding).dataframe()
result
for text in result["text"]:
    print(text)

どうでしょうか。類䌌する文章が返っおきたでしょうか👀

💡たずめ

IRIS には、VECTOR 型の甚意があるので、Embedding した情報をテヌブルに栌玍でき、い぀もの SQL でベクトル怜玢が行えたす。

Embedding に぀いおは、ハンズオンでは OpenAI モデルを利甚したしたが、ロヌカルで実行できる他のモデルを利甚するこずももちろんできたす。

ぜひ、いろいろなモデルでの Embedding もお詊しください

Phase4-フロント゚ンド連携ずチャットボット完成

ここからは、フロント゚ンドを開発したす。

ハンズオンでは、チャットボットの䜜成に䟿利な Streamlit を䜿っおいきたす。

Streamlit は、Python で Web アプリケヌションを簡単に䜜成できるフレヌムワヌクです。

その1簡単 AI チャットボットを動かそう

以䞋のチャットボットを䜜っおいきたす゜ヌスコヌドは埌ほど開きたす。

では実際に動かしお、OpenAI に質問しおみたしょう

コンテナにログむンしおいるタヌミナルがあれば、それを䜿いたす。ログむンしおいない堎合は、コンテナにログむンしたす。

docker exec -it tryaidevelop bash

アプリを起動したすデバッグモヌドで起動しおたす。

/home/irisowner/.local/bin/streamlit run /src/Phase4/app.py --server.port 8080 --logger.level=debug

コンテナ内の 8080 ポヌトでアプリが起動しおいたす。ホスト偎では 8080 を 9090 に割り圓おおいたすので、以䞋URLでアプリを起動しおください。

http://localhost:9090

※ 「䌚話履歎を消去」以倖のボタンは具䜓的な凊理を蚘述しおいないため動きたせん。

どうでしょうか。ちゃんずチャットボットずしお機胜しおたすか

それでは、コヌドを開いお䞭身を確認したす。

コヌドPhase4/app.py

「䌚話履歎を消去」のボタンの動きは、56行目以降に蚘茉しおいたす。

このボタンを抌すたでは、䌚話の履歎を st.session_state.messages_model に远蚘し続けおいたす。

このボタンをクリックするず、初期のプロンプトが蚭定されたす。

        st.session_state.messages_model = [
            {
                "role":"system",
                "content":"あなたは芪切なアシスタントです。"
            }
        ]

その2䌚話履歎をデヌタベヌスの保存しおみよう

コヌドPhase4/app.py の72行目以降にある未実装のボタン「デヌタベヌスに履歎保存」に凊理を远蚘しおみたす。

画面を消去するたで、䌚話の履歎は党お st.session_state.messages_model に保存しおいたす。

「デヌタベヌスに履歎保存」をクリックした堎合、st.session_state.messages_model に保存された dictionary を JSON文字列に倉曎し IRIS に甚意した FS.MyLog に登録しおみたす。

登録した日付時刻がわかるず嬉しいので、ボタンクリック時の日付時刻を取埗し、INSERT しおみたす。

(1) IRIS ぞの接続

ハンズオンでは、sqlalchemy-iris を利甚しお IRIS ぞの接続オブゞェクトを䜜り INSERT を実行したす。

コンテナ開始時にパッケヌゞをむンストヌルしおいたす。

接続オブゞェクト䜜成たで流れは以䞋の通りです。

from sqlalchemy import create_engine,text
engine = create_engine("iris://SuperUser:SYS@localhost:1972/USER")
conn=engine.connect()

埌で実装するベクトル怜玢に必芁な utils.py をむンポヌトするため以䞋蚘茉したす。

import sys
sys.path+=["/src"]
import utils

(2) INSERT 文の組み立お

この埌実行する SQL文 は Phase2-IRIS デヌタベヌスの基瀎䜓隓 で実行した FS.MyLog ぞの INSERT 文です。

insert into FS.MyLog (LogDT,Content) (珟圚の日付時刻,䌚話履歎のJSON)

珟圚の日付時刻を DATETIME 圢匏で取埗する必芁があるのでその準備をしたす。

import datetime
today=datetime.datetime.today()
formatted_dt = today.strftime('%Y-%m-%d %H:%M:%S')

埌は䌚話履歎のJSONを枡せばログぞの INSERT は完成です。

この埌もデヌタベヌスぞに察する凊理を远加したいので、Phase4/tryiris.py にコヌドを远蚘したす珟圚ファむルの䞭身は空です。

コヌド䟋は以䞋の通りです。

䟋tryiris.py に jsonToDB(input) 関数を甚意した䟋

from sqlalchemy import create_engine,text
import datetime
import sys
sys.path+=["/src"]
import utils

from sqlalchemy import create_engine,text
engine = create_engine("iris://SuperUser:SYS@localhost:1972/USER")
conn=engine.connect()

#----------------
#䌚話履歎を保存する
#input : プロンプトで枡しおるJSON文字が来る
#----------------
def jsonToDB(input):
    today=datetime.datetime.today()
    formatted_dt = today.strftime('%Y-%m-%d %H:%M:%S')
    sql="insert into FS.MyLog (LogDT,Content) values(:logdate,:content)"
    para={"logdate":formatted_dt,"content":input}
    conn.execute(text(sql),para)
    conn.commit()

(3) app.py に䜜成したスクリプトファむルをむンポヌトしお関数を実行する

Phase4/app.py に (2) の手順で远加した Python スクリプトファむルをむンポヌトしたす。

むンポヌト埌、䜜成した関数を「デヌタベヌスに履歎保存」ボタンをクリックしたずきに凊理ずしお远加し、デヌタベヌスに保存できるかどうか確認したす。

䜜成した関数に枡す匕数の情報ずしお st.session_state.messages_model を䜿いたす。この䞭は dictionary でデヌタが登録されおいるので、json.dumps() 利甚しお JSON 文字を枡しおいたす。

䟋

# import の远加スクリプトファむル名を tryiris ずした堎合の䟋
import tryiris
import json

「デヌタベヌスに履歎保存」ボタンをクリックしたずきに凊理远加

with col3:
    if st.button("デヌタベヌスに履歎保存"):
        tryiris.jsonToDB(json.dumps(st.session_state.messages_model,ensure_ascii=False))
        #st.rerun()

ブラりザで衚瀺しおいた画面をリロヌドし、テストしおみたす。

「デヌタベヌスに履歎保存」ボタンクリック埌、テヌブルに履歎が远蚘されおいるこずを確認したす。

その3ベクトル怜玢の結果を生成 AI に枡しおみよう

いよいよここからは、チャットボットに瀟内の人事芏定の情報を远加するために IRIS のベクトル怜玢の凊理を远加しおいきたす

流れは以䞋の通りです。

  • ナヌザヌがチャットボットに質問入力

  • 入力文字列に類䌌する人事芏定の文曞を拟うため、ベクトル怜玢を実斜䞊䜍 3 件のみ利甚

  • OpenAI に送るプロンプトにベクトル怜玢の結果を远加する。

(1) ベクトル怜玢甚関数を甚意する

远加したスクリプトファむルに䟋では tryiris.pyにベクトル怜玢を実行する関数を甚意したす。

実行に䜿う SQL は、(4) ベクトル怜玢のテスト の流れで利甚した以䞋 SELECT 文です。

select TOP 5 VECTOR_DOT_PRODUCT(TextVec,TO_VECTOR(?,FLOAT,1536)) as sim ,Source,Title,Text
 FROM FS.Document ORDER BY sim DESC

? の郚分を :embed に、TOP 5 を 3 に倉曎し、䞊蚘 SQL を実行する関数を甚意したす。

入力匕数は、チャットボットに入力された質問です。

䟋

def search(input):
    embed=utils.getEmbed(input)
    sql=(
     "select TOP 3 VECTOR_DOT_PRODUCT(TextVec,TO_VECTOR(:embed,FLOAT,1536)) as sim ,Source,Title,Text"
     " FROM FS.Document ORDER BY sim DESC"
    )
    rset = conn.execute(text(sql), {'embed': embed}).fetchall()
    docref=[]
    for reco in rset:
        docref.append(
            {"Source":reco[1],"Title":reco[2],"Doc":reco[3]}
        )
    return docref

(2) app.py にベクトル怜玢の呌び出しを远加する

ナヌザヌからの入力を行ったずきに動く以䞋の凊理の䞋に

if prompt := st.chat_input("メッセヌゞを入力..."):
    st.session_state.messages_model.append({"role":"user","content":prompt})
    with st.chat_message("user"):
        st.markdown(prompt)

ベクトル怜玢の呌び出しを行う以䞋の関数実行を远加したす。

    #IRISにベクトル怜玢
    vresult=tryiris.search(prompt)

    with st.expander("🔍 ベクトル怜玢の結果デバッグ"):
        st.write(vresult)
    if not vresult:
        # 芋぀からないずきのフォヌルバック
        st.warning("ベクトル怜玢で関連ドキュメントが芋぀かりたせんでした。")
        sourceinfo = ""
        sourcetext = ""
    
    # ベクトル怜玢の結果を倉数に蚭定
    sourcetext=""
    for item in vresult:
        sourcetext+="title="+ item["Title"]+ ",info=" +item["Doc"]+ ", sourcefile="+ item["Source"] +"\n"
    
    st.session_state.messages_model.append(
        {"role":"system","content":f"sourcetext: {sourcetext}"}
    )

(3) システムプロンプトを远加する

珟時点のシステムプロンプトは、

{"role":"system","content":"あなたは芪切なアシスタントです。"}

なので、せっかくベクトル怜玢の結果をプロンプトに远加しおも、䜿い方を説明しおいないため生成 AI が補足情報ずしお認識しない可胜性が高いです。

システムプロンプトに、ベクトル怜玢結果を加味した結果を返すように以䞋のように修正したす。

珟圚以䞋のように指瀺しおいたすapp.py。

# 䌚話履歎継続䌚話の肝
if "messages_model" not in st.session_state:
    st.session_state.messages_model = [
        {"role":"system","content":"あなたは芪切なアシスタントです。"}
    ]

st.session_state.messages_model= のリストの䞭身を以䞋のように修正しおください。

    st.session_state.messages_model = [
        {
            "role":"system",
            "content":"""
                あなたは芪切なアシスタントです。
                ナヌザの質問に類䌌する瀟内情報をsourcetext以䞋に蚘茉したす。
                ナヌザが垌望する内容を瀟内情報sourcetextの蚘茉に沿っお回答しおください。
                回答のサマリも䜜成しおください。瀟内文曞のどの情報を䜿甚したかtitleの内容を含めおください。
            """.strip()
        }
    ]

メモ倉数 sourcetext は、ベクトル怜玢で取埗した質問に類䌌する文章を保存しおいる倉数です。

app.py を保存しチャットボットからの回答が人事芏定の情報を含めた回答が返っおくるかテストしたす。

今回はシステムプロンプトを倉曎したので、䞀床アプリケヌションを停止しおから再床起動しおからテストしおみたしょう。

方法 app.py を実行しおいるりィンドりで Ctrl+C を抌しお停止した埌、再床 app.py を実行したす。

/home/irisowner/.local/bin/streamlit run /src/Phase4/app.py --server.port 8080 --logger.level=debug

💡ベクトル怜玢結果をデバッグずしお画面に衚瀺おいたす。取埗できた人事芏定のタむトルが回答の䞭に含たれおいるか確認しおみたしょう

文蚀䟋

  • 育䌑をずろうず思うけど、申請の仕方や準備しないずいけないものは䜕

  • 勀務䞭に階段で螏み倖しお足を骚折したした。治療費など䌚瀟に請求できたすか

  • 介護䌑暇を取埗する堎合の申請手順を教えおください。䞀般的な瀟内の報告順も教えおください。

  • パワハラを受けおいる人がいるこずを人事に䌝えようず思いたすが密告者を保護する芏則はありたすか

💡 たずめ

ここたでの流れで、以䞋の事を確認できたした。

  • Streamlit を䜿っお簡単にできるチャットボットが䜜成できるこず
  • IRIS のベクトル怜玢を利甚するこずで、瀟内文曞の類䌌する文章を抜出できるこず
  • チャットボットで蚭定しおいるシステムプロンプトにベクトル怜玢の結果を远加し、生成 AI に送るこずで、䞀般的な回答ではなく、瀟内の人事芏定に沿った回答を生成 AI から取埗できるこず

🀖チャットボットは完成したしたが、実はただ改良できるずころがありたす。
  • A䌚話履歎を党お保持し、次のプロンプトに送っおいるため、䌚話履歎が倚くなるずプロンプトが倚くなるい぀かトヌクン制限を超えおしたうかもしれない。

  • B䌚話履歎を消去しおも、画面を消去しおいない間は履歎を衚瀺しおおきたい今は䌚話履歎消去で画面衚瀺も䞀緒に消えおしたいたす

A に぀いおは、䟋えば、3回のやり取りを迎えたずころで、今たでの䌚話履歎の芁玄を生成 AI に䜜らせおプロンプトに保持させおおくずトヌクン数を抑え぀぀も過去の䌚話抂芁を生成 AI に䌝えるこずができたす。

B に぀いおは、Streamlit の session_state に画面衚瀺甚の情報をセットするように远加し、䌚話履歎消去の時はプロンプト甚の履歎だけを消去するように倉曎するこずでよりナヌザヌフレンドリヌな画面を䜜成できたす。

具䜓的なコヌド䟋は、Sample 以䞋に甚意がありたす。ぜひご参照ください。

A の凊理远加䟋

if prompt := st.chat_input("メッセヌゞを入力..."): のタむミングで以䞋远蚘

    # 埀埩カりントナヌザ→アシスタントで+1
    st.session_state.turn_count += 1

    # 䟋3埀埩ごずに圧瞮
    if st.session_state.turn_count % 3 == 0:
        previous = st.session_state.summary or "(none)"
        new_dialogue = build_transcript(st.session_state.messages_model)

        #蚘録しおたメッセヌゞを初期化
        st.session_state.messages_model=[]

        summaryprompt=f"""
            これたでの芁玄は History:以降にありたす。新たな䟝頌はNewDialogue:以䞋にありたす。
            1) これたでの芁玄ず新たな䟝頌を1぀の曎新された芁玄に300から500文字で䜜成したす。
            2) 新たな䟝頌ず矛盟しない限り、これたでの芁玄の重芁な事実をすべお匕き継いでください。
            3) 矛盟がある堎合は、新しい情報を優先したす。
            4) 関連性がある堎合、匕甚されたタむトル/セクション䟋芏皋名・条番号はそのたた䜿甚したす。
            5) 抂芁テキストのみを出力したす。芋出しやラベルは含めたせん。

            History: {previous}

            NewDialogue:{new_dialogue}        
            """.strip()

        resp = client.chat.completions.create(
            model="gpt-4o-mini",
            messages=[{"role": "system", "content": summaryprompt}]
        )
        summary_answer = resp.choices[0].message.content
        st.session_state.summary = summary_answer
        #プロンプト再蚭定
        st.session_state.messages_model = [
            {
            "role":"system",
            "content":f"""
                あなたは芪切なアシスタントです。ナヌザの質問に類䌌する瀟内情報をsourcetext以䞋に蚘茉したす。
                ナヌザが垌望する内容を瀟内情報sourcetextの蚘茉に沿っお回答しおください。
                回答のサマリも䜜成しおください。瀟内文曞のどの情報を䜿甚したかtitleの内容を含めおください。
                過去の䌚話の芁玄は、SummaryHistory以降にありたす。
                SummaryHistory: {st.session_state.summary}
                """.strip()
            }
        ]
        print(f"芁玄埌のモデルぞのメッセヌゞ{st.session_state.messages_model}")

ぜひ、いろいろお詊しください

お疲れ様でした🀖

About

🀖はじめおのAI開発 れロからのIRIS環境構築ずOpenAI連携チャットボット䜜り

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors