Oracleの質問に答えるためのミニRAGパイプラインを構築 (2026/03/22)

Oracleの質問に答えるためのミニRAGパイプラインを構築 (2026/03/22)

https://www.thatjeffsmith.com/archive/2026/03/i-built-a-mini-rag-pipeline-to-answer-oracle-tool-questions/ 

前回の投稿では、Oracle AI Database 26aiのAIベクトル検索を使用して、私のエージェントと関連するLLMがパーソナルトレーニングについて知っている情報に、私自身のトレーニング履歴とフィットネス統計を追加して補強しました。

私のMCPサーバーを使用すると、エージェントは私のデータベースを検索して、回答の作成や、私が指示した命令を実行するためのタスク計画に役立つ知識を得ることができます。

なかなか良い出来栄えだった。しかし、明らかに非常に個人的な題材と例に基づいている。

でもジェフ、私が必要としているのはフィットネストレーナーではなく、ビジネスや技術的な作業を手伝ってくれるAIアシスタントなんです!

5km走のタイムといった個人的なデータをベクトル化する代わりに、SharePointやConfluenceのページ、PDF文書、その他の説明書といった、貴重な非構造化データのコレクションをAIツールに提供してみてはどうでしょうか?

少し前に、このブログに寄せられたコメントをエクスポートし、それを使ってAIを活用したダッシュボードを作成しました。これは、弊社のMCPサーバーであるSQLclを使用して、データベースに接続された優れたレポートコンソールやアプリケーションを作成する方法を示すためのものでした。そして、それはうまくいき、生のキーワードやパターン検索ではなく、ベクトル検索によって必要な情報を見つけるのに役立ちました。

しかし、私はこの技術の真価を、可能性を秘めたまま放置してしまったのだ…。

検索自体は基本的な機能ですが、RAGパイプライン検索をAIエージェントに組み込んでより良い回答を得ることは、画期的なことです。

2万件を超えるコメントの中には、長年にわたって蓄積された会話や質疑応答のやり取りが詰まっている。

  • SQL Developerでそれを行うにはどうすればいいですか?
  • このエラーは何を意味しますか?
  • ORDSでSYSを使用できないのはなぜですか?

LLMは、ドキュメントといくつかのブログでトレーニングされていますが、それらのコメントには良いものがあることを知っています。

それでは、そのデータをエージェントが利用できるようにし、AIベクター検索SQLクエリを使って簡単に検索できるようにしましょう!

ステップ1:データを整理する。

既にその作業は完了しています。WP_COMMENTSテーブルのJSONエクスポートをダウンロードし、担当エージェントが既存のOracle Database AIエージェントスキルを使って簡単にデータベースに移行してくれました。コメントはCLOBに格納することで合意しました。

次に、それらのコメントを検索できるようにベクトル化する必要があります。

SQL
UPDATE thatjeffsmith_comments
SET comment_vectorized = VECTOR_EMBEDDING(
      ALL_MINILM_L12_V2
      USING comment_content AS data
    )
WHERE comment_content IS NOT NULL
  AND comment_approved  = '1'
  AND comment_type      = 'comment'

失敗。

LLMは最初の問題に直面した。データのサイズがテキストデータ(char)のBUFFER制限を超えていたため、CLOBを直接ベクトル化できなかった。

そこで、エージェントはジョブを再送信し、今度はCLOBに対してsubst()関数を使って入力サイズを4000文字に制限しました。しかし、これも失敗しました。マルチバイト文字(くだらない絵文字や、時折出てくる中国語、韓国語、日本語の会話など)が含まれていたため、もう一度試行する必要があり、今度は最初の2000文字だけを取得しました。エージェントはこれらの問題を自動的に解決し、私の承認以外に介入は必要ありませんでした。

エージェントは、これらのクエリを非同期で実行しようとする試みにも十分対応できるほど賢く、これは当社のMCPサーバーのネイティブ機能です。つまり、エージェントは応答を待つ間にタイムアウトすることはありません(デフォルトのタイムアウトは60秒です)。代わりに、SQL実行のステータスを確認するために使用できるジョブID番号を取得します。

なお、エージェントにこの操作を指示する必要はありませんでした。エージェントはそれが必要であることを「認識」しており、MCPサーバーツールの説明のおかげで「正しい手順」を簡単に選択できました。

今回は前回よりも実行に少し時間がかかりました…ほぼ1時間です。

はい、弊社のVS Code拡張機能にはリアルタイムSQL監視レポート機能が搭載されています。

しかし、終わった!

そして、私たちのエージェントは挑戦する準備が整いました!

私のエージェントも、スキルの構築において非常に素晴らしい仕事をしてくれました。

試してみましょう!

ORDS REST APIを構築し、JSONプロパティ名を大文字小文字を区別したり、キャメルケースにしたりする場合、どのようにすればよいでしょうか?

エージェントの回答、LLMの採用はSonnet 4.6 Extendedです。

要約すると、それは完全に間違っていて、選択肢は2つしかないと言っていました。

  • クエリにエイリアスを付けます。例: select FIRST_NAME “firstName” from employees または
  • ビューを作成し、必要に応じて列名を変更します。

しかし、 RAG Enhancedの回答ははるかに優れていた。

JSON_OBJECTJSONを自分で構築し、列に{}番兵マークを付けてORDSがその列に触れないようにするには、以下の方法を使用してください。

SQL

SQL
SELECT
    JSON_OBJECT(
        'employeeId'  VALUE employee_id,
        'firstName'   VALUE first_name,
        'lastName'    VALUE last_name,
        'hireDate'    VALUE hire_date
        RETURNING CLOB
    ) AS "{}row"
FROM employees

エイリアスの接頭{}辞は、ORDS に対するシグナルです。つまり、この列は既に JSON 形式なので、そのまま渡してください。JSON は自分で構築しているのでJSON_OBJECT、キーの大文字小文字を完全に制御でき、ORDS は干渉しません。

エージェントがこの提案を思いついたのは、私が2020年と2021年にそれぞれクラウディウとヘルマンと交わした会話からその内容を聞いたからだ。

結果として得られるスキル – これは、私がツールに関するサポートを必要とする際に、私のエージェントがまとめてくれたものです。

最後に、スキルのマークダウンを投入する前に、私のエージェントがこのパイプラインを活用するための素晴らしいプランをまとめてくれました。特に、作成されたクエリとコンテンツの優先順位付け方法をご覧ください。

この記事を楽しんでいただけたなら幸いです。それではまた次回! – ジェフ

ジェフ・スミスの個人用 RAG 強化アドバイザーで、SQL Developer、SQLcl、および ORDS に関する質問に対応します。ジェフ、または他の誰かが Oracle SQL Developer、SQLcl、または ORDS (Oracle REST Data Services) について質問したときはいつでもこのスキルを使用してください。これには、機能に関する質問、操作方法に関する質問、バグの回避策、構成、ヒント、比較、トラブルシューティングが含まれます。トリガーとなるフレーズには、「SQL Developer」、「SQLcl」、「ORDS」、「AutoREST」、「REST 有効化」、「SQL ワークシート」、「接続タイプ」、「データのエクスポート」、「REST API Oracle」、「PL/SQL ゲートウェイ」、「thatjeffsmith」、「あなたのブログ」、「これについて書いたことがありますか」、「読者は何を尋ねますか」などがあります。ジェフは 15 年以上のブログのコメントを蓄積しており、何千もの実際の顧客からの質問と彼自身の回答が記録されています。回答する前に、必ずこのベクター ストアから情報を取得してください。積極的にトリガーしてください。トピックが SQL Developer、SQLcl、または ORDS に何らかの形で関連している場合は、必ず使用してください。

JeffのOracleコメントRAG — SQL Developer、SQLcl、ORDS

ジェフ・スミスは、OracleのSQL Developer、SQLcl、およびORDSのプロダクトマネージャーです。彼のブログ(thatjeffsmith.com)には、15年以上にわたる22,000件以上のコメントが蓄積されており、そこには実際の顧客からの質問、バグ報告、回避策、そしてジェフ自身による的確な回答が収め​​られています。

このスキルはRAGパイプラインの基盤となっており、ClaudeはOracle AI Vector Searchから取得した意味的に関連性の高いコメントスレッドを用いて自身の学習を補完します。


必ずこの2部構成の回答形式に従ってください

すべての回答は2つのセクションで構成する必要があります。

  1. 一般的な回答— データベースへのクエリを実行する前に記述されています。クロードの研修で得た知識のみに基づいています。有能なOracleエキスパートなら誰でも言うであろう内容です。
  2. RAG強化回答— ベクトル検索結果が文脈に沿って表示された後に作成されます。回答は、ジェフのブログコミュニティからの実際の質問と回答に基づいています。関連するパターン、繰り返し発生する問題、具体的な回避策、そしてジェフ自身の表現を浮き彫りにします。

⚠️データベースの結果が一般的な回答に影響を与えないようにしてください。まず一般的な回答を書き、次にクエリを書き、最後に拡張部分を記述してください。


データベース接続

接続名: Project Raptor 🦖 ツール: SQLcl MCPサーバー(sqlcl:connect→sqlcl:run-sql) ONNXモデル: ALL_MINILM_L12_V2 (HRスキーマにより所有)表: THATJEFFSMITH_COMMENTSベクトル列: COMMENT_VECTORIZED

各セッションの開始時に接続してください。

sqlcl:connect("Project Raptor 🦖")

RAGクエリ

Oracleツールに関する質問には、このテンプレートを使用してください。USING質問に合わせて句を調整してください。DBMS_LOB.SUBSTR参照する場合は必ず を使用してくださいCOMMENT_CONTENT。これはCLOBです。

SQL

SELECT
    c.comment_id,
    c.comment_date,
    c.comment_author,
    c.comment_post_id,
    DBMS_LOB.SUBSTR(c.comment_content, 2000, 1) AS comment_text,
    VECTOR_DISTANCE(
        c.comment_vectorized,
        VECTOR_EMBEDDING(ALL_MINILM_L12_V2 USING '<search phrase>' AS data),
        COSINE
    ) AS distance
FROM thatjeffsmith_comments c
WHERE c.comment_vectorized IS NOT NULL
  [ADD FILTERS AS NEEDED — see Filter Reference below]
ORDER BY distance ASC
FETCH FIRST 8 ROWS ONLY

検索フレーズの調整

質問の意図に合った語句を選びなさい。

トピック検索フレーズ例
SQL Developerの接続に関する問題'SQL Developer connection failed TNS ORA error'
SQLclスクリプト作成/自動化'SQLcl script automate command line javascript'
ORDS REST有効化テーブル'ORDS REST enable table AutoREST endpoint'
ORDS認証/OAuth'ORDS authentication OAuth token privilege role'
SQL Developerのエクスポートデータ'export data CSV Excel SQL Developer worksheet'
ORDS PL/SQLハンドラ'ORDS PL/SQL handler POST GET source type'
SQLcl Liquibase'SQLcl Liquibase changelog schema version control'
SQL Developerの書式設定'SQL Developer format code style preferences'
ORDS APEXとの相互作用'ORDS APEX REST service module'
一般的なハウツーユーザー自身のキーワードをそのまま使用する

フィルター参照

複数のフィルターを組み合わせて結果を絞り込む:

ゴールフィルター
ジェフ自身の回答のみAND c.comment_author IN ('JeffS', 'thatjeffsmith', 'Jeff Smith')
読者からの質問のみAND c.comment_author NOT IN ('JeffS', 'thatjeffsmith', 'Jeff Smith')
最近のコメントのみAND c.comment_date > ADD_MONTHS(SYSDATE, -60)
特定の投稿からAND c.comment_post_id = <post_id>
より長く詳細なコメントAND DBMS_LOB.GETLENGTH(c.comment_content) > 300

このデータセットに関する重要な事実

  • コメント総数22,728件、うちベクトル化されたコメント数22,638件(承認済みコメント+ジェフの返信のみ)
  • 対象期間: 2010年から現在まで — SQL Developer 1.xから24.x、SQLcl、ORDSを対象
  • コメント投稿者:JeffSジェフ自身の返信( )と読者からの質問/報告が混在
  • トピック: SQL Developer UI、ORDS構成、SQLcl CL​​I、接続設定、エクスポート/インポート、REST API設計、認証、プラグインに関する質問に重点が置かれています。
  • コンテンツの種類:実際のサポート対応(バグ報告、回避策、設定に関する質問、機能リクエストなど)であり、洗練されたドキュメントではない。

結果の解釈

距離スコア信号
< 0.35強固なマッチ — 高い確信度
0.35~0.50良い組み合わせです。含める価値があります。
0.50~0.60弱いマッチです。使用には注意が必要です。
> 0.60一致しません — 別のフレーズで再検​​索してください

結果が明らかになった場合:

  • ジェフ自身の回答を優先してください。それらは単なる質問ではなく、権威ある回答です。
  • 実際のコメントテキストを引用または言い換えてください。実際の言葉遣いが重要です。
  • 繰り返し出てくるテーマに注目してください。8件の結果のうち6件が同じ問題に言及している場合は、それは兆候です。
  • 表面的な回避策を明確に示すこと― これらは同じ問題に直面しているユーザーにとって非常に役立つ情報です
  • 日付に注意してください。古いコメントは、その後変更されたUIや動作について言及している可能性があります。

例:RAGの回答が追加すべき内容

一般的な回答:「ORDSでテーブルをREST対応にするには、ORDS.ENABLE_OBJECTSQL DeveloperのREST開発ペインでAutoRESTを使用するか、チェックを入れてください。」

RAGによる補足:「ジェフの読者はここでいくつかの共通の問題に直面しています。最も一般的なのは、テーブル所有者にORDS_METADATA権限がない場合、AutoRESTがサイレントに失敗してしまうことです。2019年のコメントスレッドでは、古いORDSバージョンCOMMITではマニュアルが必要であることをジェフが確認していますORDS.ENABLE_OBJECT。また、スキーマレベルでの有効化とオブジェクトレベルでの有効化の混同を指摘するコメントも複数あり、ジェフの標準的な回答は「SELECT * FROM USER_ORDS_ENABLED_OBJECTSまず確認すること」です。」

コメント

このブログの人気の投稿

Oracle Database 19cサポート・タイムラインの重要な更新 (2024/11/20)

ミリ秒の問題: BCCグループとOCIが市場データ・パフォーマンスを再定義する方法(AWSに対するベンチマークを使用) (2025/11/13)

OCIサービスを利用したWebサイトの作成 その4~Identity Cloud Serviceでサイトの一部を保護 (2021/12/30)