NetSuiteで5分で調査、夢の分析ボットへの道

**はじめに**
「NetSuiteで5分」シリーズ、5本目です。第2回の[「分析ボット」](https://qiita.com/fujitak/items/ff489dcdd59bb85d9d20) では、検索対象のデータを売上に絞った上で、自然言語の解釈を伝統的なテキスト分析で行うことで、ハルシネーション防止した安定した回答をするボットを作成しました。今回は、「どんなレコードを検索すべきかをLLMに判断させる」という、夢のアプローチへの第一歩を踏み出すことにしました。

実際にユーザーが自然言語で様々な質問を投げかけるだけで、ボットアプリが適切な検索対象や集約条件を判断して検索を実行し、それに対してコメントを提供するデータ分析機能を実現しています。
<br>

**ボットが対応する質問例**
今回は以下のような様々な質問に対応できるようにしました。
1.	今年の売上トップ10の顧客企業を教えてください（顧客売上・入金に関する分析）![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3431564/de9337ed-a670-408d-b003-e1ea27819cf2.png)
2.	今年最も売上を上げている営業担当者を3名教えてください（営業担当者・チーム別の売上分析）![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3431564/2ec18b92-f987-402a-918b-0fa496199fe6.png)
3.	昨年の営業所別売上金額のランキングを見せてください（拠点・子会社・部署別の売上分析）![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3431564/475163d7-d772-4d7b-b265-cbae277dbd6d.png)
4.	前月に注文数が多かったアイテムを上位5つ挙げてください（商品・サービス別の数量分析）![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3431564/26d4d959-a35e-45db-97bb-7f75a7a976ab.png)
5.	過去6ヶ月間で一番仕入が多かった仕入先はどこですか？（仕入・支払のベンダー別分析）![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3431564/2d98c801-e6b5-497d-b92f-a6bd035fbe20.png)
<br>

**ソースコードの技術的解説**

**N/searchモジュールを活用**
今回のスクリプトはNetSuite標準のN/searchモジュールのパラメーター設定に力を入れています。検索のための設定項目（フィルター、グループ化、ソート）を自動的に生成し、必要なデータのみを取得する機能を実現しています。
<br>

**柔軟な検索基準のマッピング**
「SearchCriteriaMappings.txt」というマッピングファイルを使用し、自然言語の質問を検索クエリに変換しています。このファイルでは、期間やレコードタイプ、取引タイプなどを自然言語のフレーズと対応付けることにより、質問の柔軟な解釈が可能になっています。

例えば、
timeFrame.thisYear:今年,本年,今年度,当年,今期
recordType.customer:顧客,取引先,クライアント,カスタマー,得意先,顧客企業

などの記述により、ユーザーの自然言葉をNetSuite内部のレコードタイプや検索パラメータへと変換ています。また、必要に応じてマッピングファイルにキーワードを追加したり削除することで、より各ユーザー企業様の業務にフィットした、自然言語による検索条件設定を実現することが可能です。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3431564/1122ba6e-4e3a-48c0-b221-f3184a96f8dc.png)
<br>

**自動化されたグループ化・集計**
分析系の質問に対応するため、「グループ化」や「集計関数」を動的に決定しています。たとえば、「前月に注文数が多かったアイテムを上位5つ挙げてください」という質問に対しては、
•	「item」でグループ化
•	集計関数に「件数（COUNT）」を自動設定

を実施しています（期待する集計結果が表示されないこともあり、まだまだ改善する必要がありますが）。
<br>

**インサイト生成にLLMを使用**
また、検索結果をそのまま提示するだけでなく、LLMを活用して有用なインサイトも生成しています。自然言語の質問とその結果データを元に、NetSuite標準のN/llmモジュールがデータ分析と洞察を提供します。
```
const insightsObject = llm.generateText({
    prompt: prompt,
    modelParameters: {
        temperature: 0.5,
        maxTokens: 4096
    }
});
```
※N/llmの無料枠の最大トークンを意識したプロンプトの最適化も、サンプルソースコードで行っています。検索結果のデータの表示がメインの機能のため、N/llmが生成するコメントは短くしています。
<br>

**今後の展望**
実は、マッピングによる検索パラメーターの設定に加え、N/llmによって追加パラメーターを設定するよう、ソースコードを書きました。でも、やはりその部分はまだハルシネーションが頻繁に発生するため、コメントアウトしているのが実態です。自然言語からの検索条件設定をLLMに任せる、という「夢のアプローチ」は、まだ夢のままなのが現実です。

ただし、自然言語からの様々な検索や分析を行う、というボットアプリのプロトタイプの作成は、いちおうできた気がします。ろくに整理していないソースコードで恐縮ですが、アイディアの共有ということで、ご参考にして頂けましたら幸いです。
<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3431564/ef503b02-62eb-49e5-b2db-fd0c96b39ddf.png)

[※「AnalyticBot.zip（ソースコード、デプロイ手順書、デモシナリオ）」（© 2025 Takusuke Fujii）は、CC BY 4.0（原作者名の表記が必要）で自由に共有・改変・配布可能ですが、無保証につき著作者は一切責任を負いません。](https://drive.google.com/file/d/1rob_y75oV0L8fH2J09CHkia_RmA-DQfW/view?usp=sharing)
<br>

**質問サンプル**
売上・入金に関する分析
1.　今年の売上トップ10の顧客企業を教えてください。
2.　今年の顧客からの入金取引を、金額の高い順に20件表示してください。
3.　今週販売金額が最も大きかった取引は何ですか？

営業担当者・チーム別の実績
4.　今年最も売上を上げている営業担当者を3名教えてください。
5.　今月最も売上が低かった営業担当者を挙げてください。
6.　今週取引が発生しなかった営業担当者は誰ですか？

組織別（拠点・子会社・部署）分析
7.　昨年の営業所別売上金額のランキングを見せてください。
8.　前四半期の子会社における主な取引を15件挙げてください。
9.　前月の部署別の売上合計を教えてください。
10.	今年、売上の多かった上位3つの地域（拠点）はどこですか？

商品・サービス・注文分析
11.	前月に注文数が多かったアイテムを上位5つ挙げてください。
12.	前四半期の商品別販売数を表示してください。
13.	昨年最も多く注文されたサービスアイテムは何ですか？

仕入・支払・取引先分析
14.	過去6ヶ月間で一番仕入が多かった仕入先はどこですか？
15.	先月支払額が大きかったベンダー取引を20件挙げてください。
<br>

**参考リンク**
N/llmは無料で使用を開始できます。有料モードの設定をしない限り追加料金は発生しませんので、安心してチャットボットをお試し下さい。使用モード（無料、オンデマンド、専用AIクラスタ）やその他のAI関連機能について、以下のNetSuite日本語コミュニティの記事をご参考にされて下さい。
[NetSuite サポートコミュニティ› AI関連機能› SuiteScript 2.x 生成AI API](https://community.oracle.com/netsuite/japanese/discussion/4503315/suitescript-2-x-%E7%94%9F%E6%88%90ai-api#latest)

N/llmと、N/search につきましては、ヘルプセンターをご参照ください。
[Oracle NetSuite Help Center > N/llm Module](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/article_9123730083.html#subsect_1014032311)
[Oracle NetSuite Help Center > N/search Module](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_4345764122.html#subsect_87180423808)

オラクル開発者ブログ
[Oracle Developers Blog > NetSuite Five-Minute Investigation: The Path to the Dream Analysis Bot](https://blogs.oracle.com/developers/post/netsuite-fiveminute-investigation-the-path-to-the-dream-analysis-bot)
<br>

© 2025 Takusuke Fujii
本記事は CC BY 4.0（原作者名の表記が必要）で自由に共有・改変・配布できますが、無保証につき著作者は一切責任を負いません。