DifyとOCI ADB Select AIで自然言語からSQL生成とデータベース検索を実現する方法



## 1. 概要
この記事では、**Difyのチャットフロー機能**と**OCI ADB Select AI**を組み合わせることで、**自然言語でのデータベース検索**を実現する方法を解説します。非技術者でも以下のような操作が可能になります：

- 「売上上位5件のデータを表示してください」といった自然言語の入力
- 入力内容をAIが自動でSQLに変換
- 結果をMarkdownテーブル形式で返却

OCI ADB Select AIの自然言語処理能力とDifyのワークフロー機能を活用することで、データ分析の敷居を大幅に下げられます。

**応用例**
- データ可視化連携：結果をPower BIやTableauで可視化
- チャットボット統合：SlackやTeams経由での質問対応
- バッチ処理：定期的なレポート生成

---

## 2. ステップバイステップ解説

### ステップ1. チャットフローの作成
![チャットフロー作成画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/f159e01b-d288-4a25-b65b-127a7c2b6e30.png)

1. Difyダッシュボードで「チャットフロー」を選択
2. チャットフローの名前を設定（例：「自然言語検索フロー」）

### ステップ2. SQL生成用HTTPリクエスト
![OCI ADB APIリクエスト設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/71d1b160-26ce-4485-a840-a4e6ad4700d1.png)

- **メソッド**: POST
- **URL**: showsqlのエンドポイント（例：`http://192.168.31.20:9999/selectai/showsql`）
- **ボディ**:
  ```json
  {
    {"query" : "{{#sys.query#}}"}
  }
  ```

### ステップ3. SQL抽出用コードブロック
![SQL抽出コード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/06097c29-f9e6-41c6-a8b0-f2d522695c5f.png)

```python

import json


def main(json_body: str) -> dict:
    dict_body = json.loads(json_body)
    sql_query = dict_body["sql"]
    sql_query = sql_query.replace('"', '\\"')
    return {"result": sql_query}
```

### ステップ4. SQL実行リクエスト
![SQL実行リクエスト設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/ce4fc94b-450a-4477-8c10-d3f2036e7f85.png)

- **メソッド**: POST
- **URL**: runsqlのエンドポイント（例：`http://192.168.31.20:9999/selectai/runsql`）
- **ボディ**:
  ```json
  {
    {"query" : "{{#1742363069217.result#}}"}
  }
  ```

### ステップ5. 結果のMarkdown変換
![Markdown変換コード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/ad290a0e-0ab2-4245-b053-dc9ea977d0a9.png)

```python

import json


def main(json_body: str) -> dict:
    dict_body = json.loads(json_body)
    columns = dict_body['columns']
    table_data = dict_body['data']

    header = "|{}|".format(" | ".join(columns))
    separator = "|{}|".format(" | ".join(["---" for _ in columns]))

    rows = []
    for row in table_data:
        row_str = " | ".join(map(str, row))
        rows.append(f"|{row_str}|")

    markdown_table = "\n".join([header, separator] + rows)

    return {"result": markdown_table}


```

### ステップ6. 最終出力設定
![回答表示設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/ea912be1-611f-411a-ac24-feb6fe97d195.png)

```


query is:

---

{{#sys.query#}}

---

sql is:

---

{{#1742363069217.result#}}

---

result is:

----

{{#1742363491175.result#}}

---
```

---

## 3. テストケース

テスト１：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/074ea154-0e3a-4125-8578-8f8c7e87e69c.png)


テスト２：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/c196e9f5-4646-4265-95d2-2c034893f1a5.png)

テスト３：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/ddc76d40-9a81-4bbd-8b21-2fdd585df895.png)


テスト４：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932781/f255721a-c8f4-4625-9be5-767b0f59b668.png)

---

## 4. 注意点
- **セキュリティ**: APIキーは環境変数で管理推奨
- **パフォーマンス**: 複雑なクエリは実行時間に注意
- **サポート対象**: OCI ADB Select AIがサポートするSQL文式に限定



このフローを活用することで、データ分析業務の効率化とチーム間のコミュニケーションコスト削減が期待できます。