2023年3月17日金曜日

表形式のデータからPeppolのデジタルインボイスを生成する

先日の記事Peppolのデジタルインボイスを表形式で表示するにて、XMLのデータを読み込んで表形式に変換するビューを作成しました。今度は逆に表からXMLを生成するビューを作成します。

デジタルインボイスを表形式で表示するために、20のビューを作成しています。それらを逆にXMLとして表示するためのビューとして、以下の20のビューを作成します。

PEPPOL_INVOICE_XV

PEPPOL_INVOICE_BILLING_REFERENCE_XV

PEPPOL_INVOICE_ADDITIONAL_DOCUMENT_REFERENCE_XV

PEPPOL_INVOICE_ACCOUNTING_SUPPLIER_PARTY_XV

PEPPOL_INVOICE_ACCOUNTING_CUSTOMER_PARTY_XV

PEPPOL_INVOICE_PAYEE_PARTY_XV

PEPPOL_INVOICE_TAX_REPRESENTATIVE_PARTY_XV

PEPPOL_INVOICE_DELIVERY_XV

PEPPOL_INVOICE_PAYMENT_MEANS_XV

PEPPOL_INVOICE_PAYMENT_TERMS_XV

PEPPOL_INVOICE_PREPAID_PAYMENT_XV

PEPPOL_INVOICE_ALLOWANCE_CHARGE_XV

PEPPOL_INVOICE_TAX_TOTAL_XV

PEPPOL_INVOICE_TAX_TOTAL_TAX_SUBTOTAL_XV

PEPPOL_INVOICE_INVOICE_LINE_XV

PEPPOL_INVOICE_INVOICE_LINE_DOCUMENT_REFERENCE_XV

PEPPOL_INVOICE_INVOICE_LINE_ALLOWANCE_CHARGE_XV

PEPPOL_INVOICE_INVOICE_LINE_ITEM_ADDITIONAL_ITEM_PROPERTY_XV

PEPPOL_INVOICE_INVOICE_LINE_ITEM_CLASSIFIED_TAX_CATEGORY_XV

PEPPOL_INVOICE_INVOICE_LINE_ITEM_COMMODITY_CLASSIFICATION_XV


ビューのDDLは記事の末尾に添付します。

サンプルのデジタルインボイスは、表PEPPOL_DOCUMENTSの列INVOICEにXMLTYPEとして保存しています。表形式にしたデータから再度XML形式のデータを生成し、元のデジタルインボイスと比較することで、XMLと表の間の変換が正しく行われていることを確認します。

表PEPPOL_DOCUMENTSに再変換したXMLを保存する列RESULTを追加します。

alter table peppol_documents add (result xmltype);


列RESULTに再変換したデジタルインボイスを保存します。
update peppol_documents d
set
d.result =
(
    select i."Invoice" from peppol_invoice_xv i 
    where d.id = i.invoice_id
)
;


列INVOICEと列RESULTの差分を確認します。ファンクションXMLDIFFを使用します。

select xmldiff(invoice,result) from peppol_documents


差分の情報が表示されますが、以下のようにほとんどはコメントの差分です。

<xd:delete-node xd:node-type="comment" xd:xpath="/oraxdfns_0:Invoice[1]/comment()[1]"/>

以下のSELECT文を実行し、コメントに関する差分を除いて表示します。


結果が0行であれば、元のXMLと生成したXMLに違いがないと言えます。


XMLDIFFでは、XML要素の配列の出現順序が異なると差分として報告されます。本来であれば、配列の出現順序を気に掛ける必要はありません。今回はデバッグのためサンプルのデジタルインボイスと完全に一致していることが確認できるように、XMLから表形式にするビューにrownum(列名としてはseq_id)を含めて出現順序を参照できるようにしています。逆に表形式からXMLにする際には、ファンクションXMLAGGの引数としてorder by seq_idを加えています。

上記の調整を行ったビューを使って差分の確認をやり直し、結果が0行(つまりサンプルと一致している)になることは確認しました。


あくまでデジタル庁が提供しているサンプルのデータによる確認を行っただけにはなりますが、今時JSONではなくXMLを操作するコードを書くのも大変なので、手始めになるコードを書いてみました。

Oracle APEXのアプリケーション作成の参考になれば幸いです。


ビューを作成するDDL


2023年3月15日水曜日

Peppolのデジタルインボイスを表形式で表示する

 Oracle DatabaseにはXMLを扱う機能が組み込まれています。この機能を使って、デジタル庁が提供しているPeppolのデジタルインボイスのサンプルを表形式で表示してみます。

デジタルインボイスの標準仕様(JP PINT)については、デジタル庁のサイトで説明されています。

デジタルインボイスのサンプルは、こちらのサイトからダウンロードできるファイルpint-jp-resources-dev.zipに含まれています。


pint-jp-resources-dev.zipを展開すると、trn-invoice/example以下に9つのサンプルがあります。これらのファイルをOracle Databaseに読み込み、ファンクションXMLTABLEを使ってXMLから表形式のデータに変換します。

    20945  10-25-2022 00:35   trn-invoice/example/Japan PINT Invoice UBL Example6-CorrInv.xml

     9210  10-25-2022 00:35   trn-invoice/example/Japan PINT Invoice UBL Example2-TaxAcctCur.xml

    16042  10-25-2022 00:35   trn-invoice/example/Japan PINT Invoice UBL Example4-SumInv2.xml

    21151  10-25-2022 00:35   trn-invoice/example/Japan PINT Invoice UBL Example5-AllowanceCharge.xml

    21655  10-25-2022 00:35   trn-invoice/example/Japan PINT Invoice UBL Example9-SumInv1 and O.xml

    19305  10-25-2022 00:35   trn-invoice/example/Japan PINT Invoice UBL Example3-SumInv1.xml

     9817  10-25-2022 00:35   trn-invoice/example/Japan PINT Invoice UBL Example1-minimum.xml

    12551  10-25-2022 00:35   trn-invoice/example/Japan PINT Invoice UBL Example7-Return.Quan.ItPr.xml

    29603  10-25-2022 00:35   trn-invoice/example/Japan PINT Invoice UBL Example.xml

デジタルインボイスであるXMLファイルを保存するための表PEPPOL_DOCUMENTSを作成します。

以下のDDLを実行します。


アップロードしたファイルは列CONTENTにBLOBとして保存します。アップロードしたファイルをBLOBに保存したあとに、BLOBからXMLTYPEに変換し列INVOICEに保存します。

XMLTYPEで保存されているインボイスを表形式に変換します。XMLTABLEはビューから呼び出すように実装しました。以下のビューを作成します。左がビュー名、右が対応しているXML要素です。

XPathと列名の対応の確認を容易にするため、表名や列名に長い名前を付けています。識別子が30バイトまでという制限のある、古いOracle Databaseでは実行できません。

peppol_invoice_v:/Invoice
peppol_invoice_billing_reference_v:/Invoice/cac:BillingReference
peppol_invoice_additional_document_reference_v:/Invoice/cac:AdditionalDocumentReference
peppol_invoice_accounting_supplier_party_v:/Invoice/cac:AccountingSupplierParty
peppol_invoice_accounting_customer_party_v:/Invoice/cac:AccountingCustomerParty
peppol_invoice_payee_party_v:/Invoice/cac:PayeeParty
peppol_invoice_tax_representative_party_v:/Invoice/cac:TaxRepresentativeParty
peppol_invoice_delivery_v:/Invoice/cac:Delivery
peppol_invoice_payment_means_v:/Invoice/cac:PaymentMeans
peppol_invoice_payment_terms_v:/Invoice/cac:PaymentTerms
peppol_invoice_prepaid_payment_v:/Invoice/cac:PrepaidPayment
peppol_invoice_allowance_charge_v:/Invoice/cac:AllowanceCharge
peppol_invoice_tax_total_v:/Invoice/cac:TaxTotal
peppol_invoice_tax_total_tax_subtotal_v:/Invoice/cac:TaxTotal/cac:TaxSubtotal
peppol_invoice_invoice_line_v:/Invoice/cac:InvoiceLine
peppol_invoice_invoice_line_document_reference_v:/Invoice/cac:InvoiceLine/cac:DocumentReference
peppol_invoice_invoice_line_allowance_charge_v:/Invoice/cac:InvoiceLine/cac:AllowanceCharge
peppol_invoice_invoice_line_item_additonal_item_property_v:/Invoice/cac:InvoiceLine/cal:Item/cac:AdditionalItemProperty
peppol_invoice_invoice_line_item_classified_tax_property_v:/Invoice/cac:InvoiceLine/cal:Item/cac:ClassifiedTaxProperty
peppol_invoice_invoice_line_item_commodity_classification_v:/Invoice/cac:InvoiceLine/cal:Item/cac:CommodityClassification

ビューを作成するDDLは、記事の最後に添付します。

作成した表とビューを使って、デジタルインボイスのサンプルのアップロードと表示を行うAPEXアプリケーションを作ります。

アプリケーション作成ウィザードを起動します。名前Peppolとします。


デフォルトで作成されるホーム・ページを削除し、代わりに対話モード・レポートページを追加します。

ページ名はDocumentsとします。表またはビューPEPPOL_DOCUMENTSを選択します。


上記の設定でアプリケーションの作成をクリックします。

アプリケーションが作成されたら、ファイルのアップロードに関係する設定を修正します。

対話モード・レポートのページを開き、列CONTENTを選択します。

BLOB属性MIMEタイプ列ファイル名列最終更新列文字セット列として、それぞれCONTENT_MIMETYPECONTENT_FILENAMECONTENT_LASTUPDCONTENT_CHARSETを設定します。


フォームのページを開き、ページ・アイテムP2_CONTENTに同様の設定を行ないます。


ファイルのアップロード後に、BLOBをXMLTYPEに変換し保存するプロセスを作成します。

フォームのページでプロセス・ビューを開き、プロセスの作成を実行します。

作成したプロセスはプロセス・フォームPeppol Documentsダイアログを閉じるの間に配置します。識別名前バイナリXMLで保存タイプコードを実行を選択します。

ソースPL/SQLコードとして、以下のコードを記述します。BLOBのデータを、XMLTYPEに変換して列INVOICEに保存しています。
update peppol_documents 
    set invoice = sys.xmltype(content, NLS_CHARSET_ID('AL32UTF8'))
where id = :P2_ID;
サーバー側の条件タイプリクエストは値に含まれるを選択し、としてCREATE,SAVEを指定します。ボタン作成または変更の適用を押した時に、このプロセスが実行されます。


以上でサンプルのデジタルインボイスのアップロードができるようになりました。

アプリケーションを実行し、サンプルのファイルをアップロードします。


デジタルインボイスの内容を表示するページを作成します。

ページの作成を実行します。


空白のページを選択します。


ページ番号名前Invoiceとします。ページ・モード標準で、ナビゲーションはデフォルトのまま、変更しません。

ページの作成をクリックします。


ページInvoiceが作成されます。

最初にページ・プロパティナビゲーション保存されていない変更の警告OFFにします。表示するインボイスを切り替えたときに、警告が表示されないようになります。


表示するインボイスを選択するページ・アイテムを作成します。

識別名前P3_INVOICE_IDタイプとして選択リストを選びます。ラベルInvoiceとします。

設定選択時のページ・アクションとして、Redirect and Set Valueを選択します。

LOVタイプSQL問合せを選択し、SQL問合せとして以下を記述します。

select content_filename d, id r from peppol_documents

追加値の表示OFFNULL値の表示ONNULL表示値として-- Select Invoice --を記述します。


ビューPEPPOL_INVOICE_Vをソースとした対話モード・レポートを作成します。

作成した対話モード・レポートの識別タイトルInvoiceとします。タイプ対話モード・レポートです。ソース表名PEPPOL_INVOICE_Vを選択します。

WHERE句に以下を記述し、ページ・アイテムP3_INVOICE_IDで選択されているインボイスの内容が表示されるように限定します。(サンプルは9つだけなので、未選択の場合はすべてのインボイスについて表示します。)

:P3_INVOICE_ID is null or invoice_id = :P3_INVOICE_ID

外観テンプレートStandardを選択し、テンプレート・オプションRemove Body Paddingにチェックを入れます。テンプレートIntractive Reportの場合、レポートのタイトルが表示されません。


この時点でアプリケーションを実行すると、以下のようにビューPEPPOL_INVOICE_Vから参照できる情報がレポートに表示されます。


残り16個のビューについても、同様に対話モード・レポートを作成します。

重複を使うと作業が早くできます。


以上でアプリケーションは完成です。アプリケーションを実行すると、記事の先頭のGIF動画のように動作します。

今回作成したAPEXアプいケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/peppol.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。


ビューを作成するDDL


2023年3月10日金曜日

Oracle APEXアプリケーションのコピーライトとライセンス

 Oracle APEXのアプリケーションはSQLファイルまたはZIPファイル形式でエクスポートすることができます。エクスポートするファイルには、コピーライトに関する情報を含めることができます。

アプリケーション定義コピーライト・バナーに設定する文章により、エクスポートしたアプリケーションの著作権を明示できます。


単一の.sqlファイルではなく、ZIPファイルでエクスポートするとコピーライトの出力が分かりやすいです。ZIPを展開するとlicense.txtというファイルが含まれており、このファイルにコピーライトが記述されています。

% ls -l

total 24

drwxr-xr-x@ 13 **********  staff   416  3 10 22:23 application

-rw-rw-rw-@  1 **********  staff    35  3 10 13:23 copyright.txt

-rw-rw-rw-@  1 **********  staff  7689  3 10 13:23 install.sql

% 


同じようにエクスポートするファイルに関係しますが、サポートするオブジェクトインストールメッセージという項目があります。


ライセンスメッセージが設定されていると、アプリケーションのインポート時に確認を求められます。


このアプリケーションをインポートしようとすると、以下の確認を求められます。ライセンスについて同意しないと、インストールを継続することはできません。


作成したOracle APEXアプリケーションのエクスポートを、広く共有する際に設定可能なオプションになります。

APEX_UTIL.HOST_URL、ORDS別名、アプリケーション別名を確認するアプリ

 Oracle APEXのページやORDSのRESTサービスを呼び出す直リンクを作成したい場合があります。APEXアプリケーションが動作しているホスト名やワークスペース名などを文字列として取得する必要があるため、通常はAPEX_UTIL.HOST_URLを呼び出します。

HOST_URLに与える引数p_optionには、NULL(引数なし)、SCRIPT、APEX_PATH、IMGPREがあります。マニュアルにどのような値が返ってくるか説明はあります。しかし、返される値はOracle APEXがどのようにインストールおよび構成されているか依存するため、実際にどのような値が返ってくるか、今ひとつ分かりにくいです。

結局、APEXが動作している環境で呼び出して確認するのが手っ取り早いので、以下のPL/SQLコードを書きました。動的コンテンツのリージョンのソースになります。HOST_URL以外にAPEXワークスペース名、ORDS別名、アプリケーション別名なども印刷しています。

APEXアプリケーションに組み込んで実行すると、以下のように表示されます。


このアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/apex-util-host-url.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。

rinna株式会社のText to Image -v2のAPIを使用する

rinna株式会社が提供しているText to Image - v2のAPIをOracle APEXのアプリケーションから呼び出して、テキストから画像を生成してみます。音声か画像かの違いなので、以前のText to Speech - v2を呼び出すAPEXアプリケーションとほとんど同じです。


手順として異なる部分に絞って、アプリケーションの作成作業を紹介します。

生成した画像は表RINNA_TEXT_TO_IMAGESに保存します。以下のクイックSQLのモデルから作成します。
# prefix: rinna
# auditcols: true
text_to_images
    text clob
    content_type vc16
    image blob
    scale num
    nsfwContentDetected vc1
    type vc80
画像を取り出すRESTサービスのソースは以下になります。

select content_type, image from rinna_text_to_images where id = :id

テンプレートimageメソッドGETソース・タイプMedia Resourceです。完全なURLコピーしておきます。


APEXアプリケーションを作成します。

名前Text to Image、追加する対話モード・レポートページ名Imagesソースとして表RINNA_TEXT_TO_IMAGESを指定します。


ホーム・ページにテキスト(APIの引数promptsになる)を入力するページ・アイテムを作成します。

識別名前P1_TEXTタイプテキスト領域検証必須の値ONにします。


スケールを指定するページ・アイテムを作成します。

識別名前P1_SCALEタイプ数値フィールドラベルscaleとします。設定最小値0最大値20を設定し、設定必須の値ONにします。デフォルト静的値として7.5を設定します。


Text to Imageを実行するボタンを作成します。

識別ボタン名TEXT_TO_IMAGEラベルText To Image動作アクションとして、デフォルトのページの送信を選択します。


生成された画像を表示するページ・アイテムを作成します。

識別名前P1_IMAGEタイプとしてイメージの表示を選択します。ラベル画像設定基準としてImage URL stored in Page Item Valueを選択します。


アイテムの配置は以上です。

ボタンTEXT_TO_IMAGEをクリックしたときに実行されるプロセスを作成します。

作成したプロセスの識別名前Text to Imageとします。タイプコードを実行です。ソースPL/SQLコードとして、以下を記述します。ワークスペース名がapexdevと決め打ちにしているので、その部分は変更が必要です。

サーバー側の条件ボタン押下時TEXT_TO_IMAGEを選択します。


ページ・デザイナ対話モード・レポートのページを開き、列IMAGEタイプイメージの表示に変更します。BLOB属性MIMEタイプ列としてCONTENT_TYPEを指定します。


以上でアプリケーションは完成です。

アプリケーションを実行すると記事の先頭のような動作になります。

作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/text-to-image.zip

rinna株式以外より提供されているAPIのTerms of UseおよびFAQなどは、利用者ご自身にて確認していだくようお願いします。FAQには、APIは現在、試験運用中で検証を除く業務用利用は禁止しております、と記載されています。

Oracle APEXのアプリケーション作成の参考になれば幸いです。

2023年3月9日木曜日

LlamaIndexにChatGPT(gpt-3.5-turbo)を使ったチャット・サーバーを作る

 以前に作成したOracle Cloudのコンピュート・インスタンスにLlamaIndexをインストールしてチャット・サーバーを作成し、Oracle APEXのアプリケーションから呼び出してみました。

以下の記事を参照しています。

Llama Index(GPT Index)にDevelopersIOの記事を100件読み込ませて質問してみた
LlamaIndex で ChatGPT API を試す
https://note.com/npaka/n/ncbb858cf11c3
LangChain の チャットモデル (ChatGPTの新しい抽象化) を試す
https://note.com/npaka/n/n403fc29a02c7
LlamaIndex クイックスタートガイド
https://note.com/npaka/n/n8c3867a55837

チャット・サーバーの実行には、Oracle CloudのAlways Free(無料)で作成できるAmpere A1の4OCPU, 24GBのコンピュート・インスタンスを使用しています。

このサーバーは、以前にOpenAIのWisperを実装したときに作成したものです。

OpenAI Whisperを使った文字起こしアプリの作成(2) - UbuntuへのWhisperの実装
http://apexugj.blogspot.com/2023/01/openai-whisper-2-ubuntu.html
OpenAI Whisperを使った文字起こしアプリの作成(3) - Flaskを使ったAPIサーバー

Wisperの実装は不要ですが、コンピュート・インスタンスへのホスト名の割り当て(DNSでIPアドレスの解決ができる)および、サーバー証明書の発行までは準備作業として必要です。

以上の準備ができているところから作業を始めます。

Ubuntuのインスタンスにsshでログインします。作業はすべてホーム・ディレクトリ上で行います。

llama-indexをインストールします。

pip install llama-index

ubuntu@mywhisper2:~$ pip install llama-index

Processing ./.cache/pip/wheels/57/26/ea/fc7cbfb104ac458cb33bfd2610d0e5ca597b184af49e73c1bf/llama_index-0.4.23-py3-none-any.whl

Requirement already satisfied: numpy in /usr/local/lib/python3.8/dist-packages (from llama-index) (1.23.5)

Requirement already satisfied: langchain in ./.local/lib/python3.8/site-packages (from llama-index) (0.0.104)



[中略]


Requirement already satisfied: six>=1.5 in /usr/lib/python3/dist-packages (from python-dateutil>=2.8.1->pandas->llama-index) (1.14.0)

Requirement already satisfied: idna>=2.0 in /usr/lib/python3/dist-packages (from yarl<2.0,>=1.0->aiohttp<4.0.0,>=3.8.3->langchain->llama-index) (2.8)

Installing collected packages: llama-index

Successfully installed llama-index-0.4.23

ubuntu@mywhisper2:~$ 


ディレクトリdataを作成します。このディレクトリの下に、チャット・サーバーが知識として使用するデータを配置します。

mkdir data

ubuntu@mywhisper2:~$ mkdir data

ubuntu@mywhisper2:~$ 


ディレクトリdataの下にapex_introduction.txtを配置しました。Oracle APEXの紹介が記述されています。このデータはこの通りでなくても全く問題ないので、それぞれ興味のあるデータを配置されると良いでしょう。


ファイルchat-server.pyとして、以下の内容が記述されたファイルを作成します。index.jsonがあれば作成済みのインデックスとして読み込みます。無い場合はインデックスの作成を行います。そのため、初回実行時は起動に時間がかかります。また、ディレクトリdata以下の内容を更新した場合は、index.jsonを削除してchat-servcer.pyを再起動する必要があります。

/chatPOSTされたJSONドキュメント{ "query": "問合せ文字列" }を受け取って、応答であるJSONドキュメント{ "answer": "応答となる文字列" }を返します。


環境変数OPENAI_API_KEYOpenAIのAPIキーを設定して、chat-server.pyを実行します。あらかじめディレクトリcertsの下にfullchain.pemprivkey.pemを作成しておきます。

ubuntu@mywhisper2:~$ export OPENAI_API_KEY=OpenAIのAPIキー

ubuntu@mywhisper2:~$ python chat-server.py 

/usr/lib/python3/dist-packages/requests/__init__.py:89: RequestsDependencyWarning: urllib3 (1.26.13) or chardet (3.0.4) doesn't match a supported version!

  warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported "

 * Serving Flask app 'chat-server'

 * Debug mode: on

INFO:werkzeug:WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.

 * Running on all addresses (0.0.0.0)

 * Running on https://127.0.0.1:8443

 * Running on https://10.0.0.131:8443

WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.

 * Running on all addresses (0.0.0.0)

 * Running on https://127.0.0.1:8443

 * Running on https://10.0.0.131:8443

INFO:werkzeug:Press CTRL+C to quit

Press CTRL+C to quit

INFO:werkzeug: * Restarting with stat

 * Restarting with stat

/usr/lib/python3/dist-packages/requests/__init__.py:89: RequestsDependencyWarning: urllib3 (1.26.13) or chardet (3.0.4) doesn't match a supported version!

  warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported "

WARNING:werkzeug: * Debugger is active!

 * Debugger is active!

INFO:werkzeug: * Debugger PIN: 197-750-656

 * Debugger PIN: 197-750-656



以上でチャット・サーバーが実行されました。

このサーバーに質問するOracle APEXのアプリケーションを作成します。

アプリケーション作成ウィザードを起動し、空のアプリケーションを作成します。名前Chat Clientとします。


アプリケーションが作成されたらアプリケーション定義を開き、置換文字列G_ENDPOINTとして、チャット・サーバーの呼び出しURLを設定します。以下のようなURLになります。

https://チャット・サーバーのホスト名/chat


ページ・デザイナホーム・ページを開きます。

問合せ文字列を入力するページ・アイテムを作成します。

識別名前P1_QUERYタイプテキスト領域ラベルQueryとします。


問合せを送信するボタンを作成します。

識別ボタン名SUBMITラベルSubmit動作アクションはデフォルトのページの送信とします。


チャット・サーバーが返す応答を印刷するページ・アイテムを作成します。

識別名前P1_ANSWERタイプテキスト領域ラベルAnswerとします。


プロセス・ビューを開き、チャット・サーバーにリクエストを送信するプロセスを作成します。

識別名前Query on Chat Serverタイプコードの実行を選択します。ソースPL/SQLコードとして以下を記述します。

サーバー側の条件ボタン押下時として、SUBMITを選択します。


以上でアプリケーションは完成です。実行すると記事の最初のGIF動画のように動作します。サーバー側では、以下のようなメッセージが表示されます。


クラスChatGPTLLMPredictorの引数prepend_messagesとして、ロール(system, user, assistant)の異なる履歴が設定できるようですが、それも含めてGPTSimpleVectorIndexでインデックスを作成するコードになっています。ChatGPTのように履歴を含めて問合せをする場合、毎回インデックスの作成が必要になり効率が良くないように見えます。今のところ、どうすればよいか分かりません。

今回作成したアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/llama-index-chat-client.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。