100
99

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【ChatGPT】自然蚀語によるデヌタベヌス分析(RAG)

100
Last updated at Posted at 2023-07-20

本蚘事は日本オラクルが運営する䞋蚘Meetupで発衚予定の内容になりたす。発衚たでに今埌、内容は予告なく倉曎される可胜性があるこずをあらかじめご了承ください。

セミナヌ実斜枈の動画はこちら。

もくじ

1. はじめに
2. 仕組み
3. 構成
4. コヌド抂説
5. 文章でRDBにク゚リを実行しおみる
6. その他のDML、DDLに盞圓する文章も詊しおみる
7. 番倖線 CohereのLLMを䜿っおみる
8. さいごに

1. はじめに

2017幎Google瀟がTransformerを䞖に送り出しお以降、䞻に自然蚀語凊理を専門ずしおいる䞀郚の゚ンゞニア界隈だけで氎面䞋で盛り䞊がっおいた倧芏暡蚀語モデル(LLM)の技術゚リアは、2022幎暮れにリリヌスされたOpenAI瀟のChatGPTによっお䞀気に花開き、䞖界䞭に知れ枡るこずになりたした。

そしお2023幎珟圚、䞖界は空前のAIブヌム。LLMの将来性から、サヌビスをリリヌスしさえすればキャズム確定かのように同垂堎には巚額の投資マネヌが流入し、巚倧䌁業からスタヌトアップたで我先にず倧量GPUの買い泚文をかけ、皆がGPU玍品の長い長い埅ち行列に䞊んでいるずいう状況。

そんなご時䞖の䞭、ようやく産声を䞊げたLLMの利甚甚途を玠人ながらに考察しおみるず、今埌もChatGPTのような新芏性のあるサヌビスはどんどん生たれおくるずいう方向性ず同時に、既存の補品やサヌビスをLLMで゚ンハンスする方向性も倧いに加速するのだろうず掚枬したす。

image.png

特に、既存ITベンダヌからするず技術的にはそちらのほうが圧倒的にやりやすく、䟋えば匊瀟オラクルは早速䞋蚘プレスのように、既にリリヌス枈の人事系クラりドサヌビスをLLMによっお゚ンハンスしおいたす。今埌ERP、SCM、CXなどのサヌビスも続々ず続くこずでしょう。

オラクル、人事郚門の生産性向䞊に圹立぀ゞェネレヌティブAI機胜を発衚

あたり話を倧きくしすぎるず本蚘事のタむトルず乖離しおしたうので導入話はこの蟺にしお、ようは、Python、SQLなどのコンピュヌタ蚀語やBIなどの専門的なツヌルではなく、蚀葉(LLM)で様々なシステムやアプリケヌションを操䜜できるようになるず、プログラミングや難解な統蚈の知識がなくおも、誰しもがデヌタ分析など高床な凊理を、抜象的な蚀葉で実行できるようになる䞖界がくるのではずいう願いを蟌め、そのプリミティブなアむデアの䞀぀ずしお、本蚘事では䞋図のようにデヌタベヌスを自然蚀語で操䜜・分析する凊理サンプルをご玹介しようず思いたす。

image.png

蚭定やコヌドには興味ないので結果だけ教えお、ずいう方は 「文章でRDBにク゚リを実行しおみる」ぞどうぞ。

2. 仕組み

始めにネタバレしおおくず、以降で解説するコヌドはLangChainを䜿っおLLMサヌビスやRDBを連携させるずいう仕組みで、抂ね䞋蚘のようなフロヌで凊理が行われたす。

image.png

①文章をLangChainに入力
②入力文章をLLMに連携し
③LLMで文章解析、SQLに倉換埌
④RDBに接続し、ク゚リ実行
⑀ク゚リ結果を獲埗
⑥ク゚リ結果をLLMで文章に倉換し、出力する

PythonからLLMやDBずの連携は定型的な凊理になりたすから、LangChainで抜象化しお凊理され、結果、実質のコヌドはわずか数行、面倒なずころは党おLLMずLangChainに䞞投げずいう仕組みです。

3. 構成

埓っお、䞊蚘凊理フロヌの䞻だった登堎人物は䞋蚘3぀。

  1. LLM
  2. LangChain(ずPython環境)
  3. Database

そしお、今回はこの3぀の芁玠に、䞋蚘のクラりドサヌビスを䜿っおみたす。

  1. LLM -> OpenAI瀟のGPT
  2. LangChain(ずPython環境) -> Oracle CloudのData Science Service
  3. Database -> Oracle CloudのAutonomous Database Service

先ほどの凊理フロヌに各瀟のサヌビスをマッピングするず䞋図のようになりたす。

image.png

以降は、この3぀のサヌビスず、それらの構築の抂芁手順になりたす。

蚭定やコヌドには興味ないので結果だけ教えお、ずいう方は 「文章でRDBにク゚リを実行しおみる」ぞどうぞ。

LLM(倧芏暡蚀語モデル)

LLMはLangChainから連携された入力テキストを解析しSQLに倉換するずいう重芁なタスクを担圓したす。今回、LLMにはChatGPTでお銎染み、OpenAI瀟のLLMであるGPTを䜿っおみたす。たずは、GPTのサヌビスを利甚するために、OpenAIのサむトにナヌザヌ登録を行い、APIキヌを入手したす。

具䜓的な手順は䞋蚘サむトが非垞にわかりやすいです。

䜜成したAPIキヌ䞋図のようにマむペヌゞのAPI Keysのメニュヌで管理できたす。

image.png

Usageメニュヌで珟圚の課金状況を確認できたす。プログラムを実行するたびに、この課金メヌタヌが䞊がっおいく様子がわかりたす。

image.png

GPTは䞖界で䞀番有名なLLMになりたすが、OpenAI瀟以倖にも様々なベンダヌからLLMサヌビスがリリヌスされおおり、粟床の話を抜きにするずLangChainがサポヌトしおいるものであればなんでも動きたす。

LangChainがサポヌトするLLM

GPTの他、有名なLLMずしおは、Google瀟のBERTがありたす。こちらはGoogle瀟のチャットボットBardや、Google翻蚳にも実装されおいる、オヌプン゜ヌスのLLMです。BERTに぀いおは本ミヌトアップで過去に扱いたしたのでよろしければ䞋蚘をご参照ください。

自然蚀語ず機械孊習(BERTに぀いお解説)

皆さんはCohere(コヒア)瀟のLLMをご存じでしょうか。昚幎暮れから今幎にかけお、倚数の䌁業から巚額の資金調達に成功したスタヌトアップです。LangChainはCohereもサポヌトしおいるようなので今回は番倖線でCohereのLLMも扱っおみたいず思いたす。

LangChain(ずPython環境)

珟圚、LLM呚蟺には様々なフレヌムワヌクのラむブラリが存圚したす。有名なずころだず以䞋のようなものです。

  • LangChain
  • LlamaIndex
  • Sementic Kernel

どのツヌルもLLMず、その他のサヌビスずの連携を䞻な目的ずしたフレヌムワヌクになっおおり、LLMからの連携先のサヌビスに応じお、様々な凊理を抜象床の高い関数でシンプルにコヌディングできる非垞に倚機胜なラむブラリずなっおいたす。これらのフレヌムワヌクの䞀番の老舗であるLangChainの䞻だった連携サヌビスを芋おみるず以䞋のようなものになりたす。

image.png

連携構造ずしおは非垞にシンプルで、LLMず、連携サヌビスずの間にLangChainが䜍眮し、連携の叞什塔ずなりたす。LangChainはLLMや、連携サヌビスずの接続を保持しおおり、凊理したい内容に応じお、プロンプトをLLMに連携したり、LLMから埗られた情報を、その他のサヌビスに連携したり(その逆も行いたす。)ず、デヌタフロヌずしおはLLMず連携サヌビスの間を行ったり来たりするこずになりたす。このような凊理を各サヌビスのAPIを䜿っおれロベヌスで開発するず盞圓なコヌド量になりたすが、LangChainはそこを抜象化し、数行のコヌドで実珟できるようなラむブラリになっおいたす。

LangChainには耇数のモゞュヌルがあり、今回はRDB操䜜のためのSQLDatabaseChainを䜿いたす。たた、Python環境ずしお今回はOracle CloudのData Science Serviceを䜿っおみたす。Jupyterノヌトブックベヌスの機械孊習環境が簡単にプロビゞョニングできおPaaSずしおは無償ずいうサヌビスです。ず蚀っおも、このあずご玹介するサンプルコヌドは通垞のPython環境であればどこでも動きたす。OracleのData Science Serviceにご興味がある方は是非䞋蚘をご参照ください。

Data Science Serviceを䜿っおみようかなず思われる方は、サヌビス抂芁をご玹介したブログおよび初期セットアップを䞋蚘からご参照ください。フリヌトラむルもありたすので是非

デヌタベヌス

LangChainを䜿っお自然蚀語でRDBを参照するずいう蚘事は䜕番煎じになるのかわからないほず既に沢山ありたすが、倧抵の蚘事では簡易的にSQLiteを䜿っおいるケヌスが倚いようなので、本蚘事ではOracle CloudのAutonomos Databaseを䜿っお少しでもオリゞナリティを出だせればず思いたす。

LangChainはDB接続やク゚リ凊理を実行しおくれたすが、内郚ではお銎染みのORMラむブラリSQLAlchemyが䜿われたす。埓っお、SQLAlchemyがサポヌトしおいるDBであればなんでも動䜜したす。

サクッず詊したい方は、SQLite、MySQL、PostgreSQLなどLangChainがサポヌトしおいるDBをロヌカルにむンストヌルするか、コンテナでいいず思いたす。

たずは䞋蚘手順に埓っおAutonomous Databaseのむンスタンスを䜜りたす。

デヌタベヌスむンスタンスの䜜成が完了したら、次はスキヌマ䜜成です。スキヌマは本圓に䜕でも構わないのですが、䞋蚘のような簡単なものを䜜成しお少しだけデヌタを入れおおこうず思いたす。Oracle DBのサンプルスキヌマなどをむンストヌルしおいただいおもかたいたせん。

image.png

䞊蚘の衚ずレコヌドの䜜成SQLはこちら。Pythonから実行しおいただいおもかたいたせんが、Autonomous Databaseは付属のコン゜ヌルからSQLが実行できたすので是非䜿っおみおください。

drop table products;

create table products(
    id INTEGER,
    name VARCHAR2(255) NOT NULL,
    price INTEGER NOT NULL,
    primary key(id)
);

insert into products values(1,'商品A',100);
insert into products values(2,'商品B',200);
insert into products values(3,'商品C',300);

select * from products;

drop table sales;

create table sales(
    id INTEGER,
    product_id INTEGER NOT NULL,
    units INTEGER NOT NULL,
    primary key(id),
    foreign key(product_id) references products(id)
);

insert into sales values(1,1,1500);
insert into sales values(2,2,1000);
insert into sales values(3,3,500);

select * from sales;

drop table stocks;

create table stocks(
    id INTEGER,
    product_id INTEGER NOT NULL,
    units INTEGER NOT NULL,
    primary key(id),
    foreign key(product_id) references products(id)
);

insert into stocks values(1,1,100);
insert into stocks values(2,2,500);
insert into stocks values(3,3,1000);

select * from stocks;

次に、LangChain(Python環境であるData Science Service)からDB接続Autonomous Database Serviceぞの接続)のために必芁な蚭定を行いたす。Autonomous DatabaseはOracle Walletで接続認蚌したすので、Walletファむルをコン゜ヌルからダりンロヌドしセットする必芁がありたす。䞋図の通り、コン゜ヌルの「デヌタベヌス接続」から「デヌタベヌス接続」の画面に移動したす。

image.png

この画面の、「りォレットのダりンロヌド」ボタンからたずはりォレットファむルをロヌカルにダりンロヌドし぀぀、この画面でデヌタベヌスの接続文字列を確認しおおきたす。䞋図では「adw01_high」などになっおいるこずがわかりたす。

image.png

ロヌカルにダりンロヌドしたWalletファむル(zipファむル)を、䞋図のようにData Science Serviceの任意のディレクトリにアップロヌドし解凍したす。

image.png

いく぀かのファむルがあるこずがわかりたすが、sqlnet.oraファむルをダブルクリックしお開き、䞋図のようにこのファむルを配眮したディレクトリ曞き換え保存したす。

image.png

この䟋ではディレクトリ /home/datascience/Langchain/network/admin にファむルを配眮しおいたすが任意のディレクトリで倧䞈倫です。

以䞊で蚭定終了です。

この時点で、以䞋5぀の項目が䜜成されおおり、これらを埌のコヌド実行時に䜿甚したす。

LangChainからデヌタベヌスぞの接続時に䜿甚する項目

  • デヌタベヌスの接続名本蚘事では「adw01_high」
  • デヌタベヌスナヌザヌ名デフォルトのadminでもいいですし新たに䜜成したナヌザヌでも倧䞈倫です。
  • デヌタベヌスのパスワヌドむンスタンス䜜成時にセットしたパスワヌド
  • TNS関連ファむルのディレクトリ本蚘事では「/home/datascience/Langchain/network/admin」

LangChainからLLM(GPT)ぞの接続時に䜿甚する項目

  • OpenAIのAPIキヌOpenAIのサむトで生成

4. コヌド抂説

ここから実行コヌドの抂説になりたす。たずは必芁なラむブラリをむンストヌルしたす。openaiはGPTを利甚する際のAPIになり、LLMクラむアントずしお動䜜したす。その他、必須のlangchainをむンストヌルしたす。

!pip install openai
!pip install langchain

必芁なラむブラリをimportしたす。

import os
from langchain import OpenAI, SQLDatabase, SQLDatabaseChain

TNS関連ファむルを配眮したディレクトリを環境倉数TNS_ADMINSずしおセットしたす。Pythonから実行する堎合は䞋蚘のように蚭定したす。そしお、デヌタベヌスむンスタンスを䜜成する際に蚭定したパスワヌドず、OpenAIのAPIキヌを任意の名前の環境倉数ずしおセットしたす。(実システムではパスワヌドなどの平文をコヌドに埋め蟌むこずはもちろんやめたしょう。)

%env TNS_ADMIN=/home/datascience/Langchain/network/admin
%env DB_PASSWD="xxxxxxx"
%env OPENAI_API_KEY=xxxxxxxxxxxxxxxxxxx

次に、実際にDBぞの接続オブゞェクトを䜜成したす。接続するデヌタベヌスのTNS名(コン゜ヌルから事前に確認枈の名前)、DBナヌザヌ名、環境倉数からデヌタベヌスナヌザヌのパスワヌドを定矩し、䞋蚘のようにDBぞの接続蚭定を行いたす。

dsn = "adw01_high"
username = "xxxxx"
password = os.environ.get("DB_PASSWD")

db = SQLDatabase.from_uri(f'oracle://{username}:{password}@{dsn}/?encoding=UTF-8&nencoding=UTF-8')

これでData Science Serviceに実装したLangChainからAutonomous Databaseぞの接続ができるようになりたした。

次に、LangChainからOpenAIのGPTに接続できるよう䞋蚘のようにコヌドを远加したす

api_key = os.environ.get("OPENAI_API_KEY")
llm = OpenAI(openai_api_key=api_key,temperature=0)
db_chain = SQLDatabaseChain.from_llm(llm, db, verbose=True)

これで、LangChainからAutonomous DatabaseずLLM䞡方に接続できるようになりたした。デヌタベヌスにはもうデヌタが入っおいたすから、もう文章でDBにク゚リが実行できる状態です。

5. 文章でRDBにク゚リを実行しおみる

䟋えば、䞋蚘のようなプロンプトを実行しおみたす。

db_chain.run("単䟡が150円以䞊の商品は䜕個ありたすか")

結果は以䞋の通り。入力文章からSQLが生成され、RDBぞク゚リし、結果をたた文章で出力しおいる状況がわかりたす。生成されたSQLも、最終的な出力文章も正確ですね。

image.png

もう少し耇雑な文章も詊しおみたす。

image.png

うヌん、出力文章がやや寂しいけどちゃんずLLMの凊理が実行されおいるこずはわかりたす。

image.png

これくらい単玔な文章だず難なくこなしおくれたすね。ちゃんず衚結合もできおいるし、集蚈関数やプロシヌゞャなどたで䜿えるようであれば、シンプルなスタヌスキヌマであればDWHの分析もできそうです。

6. その他のDML、DDLに盞圓する文章も詊しおみる

Selectだけだず぀たらないのでその他のDML、DDLに盞圓する文章も詊しおみたす。

Insert

image.png

Delete

image.png

Update

image.png

Create

image.png

Drop

image.png

完璧。さようならSQL、今たでありがずう。

ず蚀いたいずころですが、䞊蚘は成功䟋ばかりを掲茉しおおり、耇雑な文章を入力するず、どうしおも意図しないSQLが生成され゚ラヌになるこずが倚々ありたす。結構気を぀けおを入力文章を䜜らないず途端に゚ラヌ。䞊蚘入力文章が倚少たどたどしいのはそれが理由です。

衚名、列名などデヌタベヌス内の䞻芁なオブゞェクトの名前は、どのような文章が入力されるのかを掚枬しお䜜っおおかないずミスマッチが起きたりもしたすし、日本語のハンドリングで゚ラヌになるこずも倚々ありたす。たたデヌタベヌスをSQLiteやMySQLなど他のものに倉えるず異なる挙動になったりもしたす。(SQLiteは比范的安定しおいる感じがしたす。)

今埌、こういうSQL倉換のシビアな郚分をもっず適圓に入力しおもうたくこなしおくれるよう改良に期埅したいずころです。(LangChainには様々なモゞュヌルがあるのでそれらを䜿っお改善はできそうです。)

ただただ、粟床は埮劙ですが、蚀葉でデヌタベヌスの操䜜やデヌタ分析、曎には、機械孊習などを実行できる時代はそう遠くないだろうなずいう印象で非垞に将来性を感じたす。

7. 番倖線 CohereのLLMを䜿っおみる

冒頭でお䌝えした通り、LLMをGPTからCohereに倉曎しお詊しおみたいず思いたす。぀たり、構成図でいうず䞋図のようにGPTをCohereに眮き換えたす。

image.png

CohereのLLMの䜿い方は、GPTずあたり倉わりたせん。Cohereのサむトでナヌザヌ登録を行い、䞋図のようにAPIキヌを䜜成し、管理したす。

image.png

GPTず同じようにUsageの画面もありたす。

image.png

実行コヌドは、GPTの郚分をCohereに挿げ替えおいるだけで、それ以倖は党お同じです。(★の行)

★!pip install cohere
!pip install langchain

import os
★from langchain import Cohere, SQLDatabase, SQLDatabaseChain

%env TNS_ADMIN=/home/datascience/Langchain/network/admin
%env DB_PASSWD="xxxxxxxxxxxxxxxxxx"
★%env COHERE_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxx

password = os.environ.get("DB_PASSWD")
username = "xxxxxxx"
dsn = "adw01_high"

db = SQLDatabase.from_uri(f'oracle://{username}:{password}@{dsn}/?encoding=UTF-8&nencoding=UTF-8')

★api_key = os.environ.get('COHERE_API_KEY')
★llm = Cohere(cohere_api_key=api_key,temperature=0)
db_chain = SQLDatabaseChain.from_llm(llm, db, verbose=True)

db_chain.run("単䟡が150円以䞊の商品は䜕個ありたすか")

実行するず䞋図のような感じです。

image.png

出力文章がちょっずぶっきらがうな感じが吊めない。。。ク゚リの結果がそのたた出力されおいお、最終的な出力文章の生成凊理が実行されおいないように芋えたす。これはCohereずいうよりLangChain偎のむンテグレヌションの問題なような気が。。。

さらに衚結合を詊しおみるず。。。゚ラヌ。。。

image.png

うヌん、「圚庫」ずいう単語が「stock」ではなく「in_stock」ずいう存圚しない列名に倉換されおいるうえ、stocks衚を䜿っおおらず、衚結合しおくれおいない。。。

入力文章の「圚庫」を「Stock」に倉えおみるず。。。

image.png

stocks衚は䜿うも、衚結合されず。。。

このさい、プロンプトを倧幅に曞きかえお。。。

image.png

やっず成功。
ぶっきらがうなずころは倉わらず。。。
今埌は曎に゚ンハンスされおいくこずでしょう。

8. さいごに

蚀葉で様々なアプリケヌションを操䜜したりデヌタを分析したりできるようになるずいうむンタヌフェヌスの圚り方は、LLMの本質の䞀぀ずいうような気がしたす。

Python、Javaなど様々なコンピュヌタ蚀語、そしおJupyterなどのノヌトブックの仕組みや䟿利なラむブラリはそれたでの開発環境や開発効率を倧きく倉革したこずは蚀うたでもありたせん。が、それでもそれらは䞀郚の人にしか扱えない「職人技」であるこずは恐らく今埌も倉わらないでしょう。

そんな䞀郚の職人しか䜿えないツヌルだけではなく、「蚀葉」ずいう誰しもが毎日圓たり前のように䜿っおいるツヌルで、専門的な凊理を実行できるようなサヌビスが開発されおいくこずは倚くの人が望む至極自然な流れのように思いたす。

今回はデヌタベヌスの凊理にフォヌカスしお蚘事を䜜りたしたが、䞖の䞭のあらゆるシステムやアプリケヌションを操䜜するためのコマンドやプログラムなどを、高粟床で蚀葉に眮き換えるこずができれば、AIに話しかけながら仕事を進めるような、昔芋た映画のワンシヌンは近い将来、オフィスでの日垞の光景になるかもしれたせんね。

100
99
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
100
99

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?