/**
* WPML compatibility functions
*
* @global array $duplicated_posts Array to store the posts being duplicated.
*
* @package Yoast\WP\Duplicate_Post
* @since 3.2
*/
add_action( 'admin_init', 'duplicate_post_wpml_init' );
/**
* Add handlers for WPML compatibility.
*/
function duplicate_post_wpml_init() {
if ( defined( 'ICL_SITEPRESS_VERSION' ) ) {
add_action( 'dp_duplicate_page', 'duplicate_post_wpml_copy_translations', 10, 3 );
add_action( 'dp_duplicate_post', 'duplicate_post_wpml_copy_translations', 10, 3 );
add_action( 'shutdown', 'duplicate_wpml_string_packages', 11 );
}
}
global $duplicated_posts;
// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: Renaming a global variable is a BC break.
$duplicated_posts = [];
/**
* Copy post translations.
*
* @global SitePress $sitepress Instance of the Main WPML class.
* @global array $duplicated_posts Array of duplicated posts.
*
* @param int $post_id ID of the copy.
* @param WP_Post $post Original post object.
* @param string $status Status of the new post.
*/
function duplicate_post_wpml_copy_translations( $post_id, $post, $status = '' ) {
global $sitepress;
global $duplicated_posts;
remove_action( 'dp_duplicate_page', 'duplicate_post_wpml_copy_translations', 10 );
remove_action( 'dp_duplicate_post', 'duplicate_post_wpml_copy_translations', 10 );
$current_language = $sitepress->get_current_language();
$trid = $sitepress->get_element_trid( $post->ID );
if ( ! empty( $trid ) ) {
$translations = $sitepress->get_element_translations( $trid );
$new_trid = $sitepress->get_element_trid( $post_id );
foreach ( $translations as $code => $details ) {
if ( $code !== $current_language ) {
if ( $details->element_id ) {
$translation = get_post( $details->element_id );
if ( ! $translation ) {
continue;
}
$new_post_id = duplicate_post_create_duplicate( $translation, $status );
if ( ! is_wp_error( $new_post_id ) ) {
$sitepress->set_element_language_details(
$new_post_id,
'post_' . $translation->post_type,
$new_trid,
$code,
$current_language
);
}
}
}
}
// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: see above.
$duplicated_posts[ $post->ID ] = $post_id;
}
}
/**
* Duplicate string packages.
*
* @global array() $duplicated_posts Array of duplicated posts.
*/
function duplicate_wpml_string_packages() { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: renaming the function would be a BC-break.
global $duplicated_posts;
foreach ( $duplicated_posts as $original_post_id => $duplicate_post_id ) {
// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: using WPML native filter.
$original_string_packages = apply_filters( 'wpml_st_get_post_string_packages', false, $original_post_id );
// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: using WPML native filter.
$new_string_packages = apply_filters( 'wpml_st_get_post_string_packages', false, $duplicate_post_id );
if ( is_array( $original_string_packages ) ) {
foreach ( $original_string_packages as $original_string_package ) {
$translated_original_strings = $original_string_package->get_translated_strings( [] );
foreach ( $new_string_packages as $new_string_package ) {
$cache = new WPML_WP_Cache( 'WPML_Package' );
$cache->flush_group_cache();
$new_strings = $new_string_package->get_package_strings();
foreach ( $new_strings as $new_string ) {
if ( isset( $translated_original_strings[ $new_string->name ] ) ) {
foreach ( $translated_original_strings[ $new_string->name ] as $language => $translated_string ) {
do_action(
// phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: using WPML native filter.
'wpml_add_string_translation',
$new_string->id,
$language,
$translated_string['value'],
$translated_string['status']
);
}
}
}
}
}
}
}
}
generative ai – Raqqa
https://wordpress.rakka.co.jp
Thu, 27 Aug 2026 12:58:14 +0000
ja
hourly
1
https://wordpress.org/?v=7.1
-
Odoo生成AI実現目標
https://wordpress.rakka.co.jp/2026/08/27/odoo%e7%94%9f%e6%88%90ai%e5%ae%9f%e7%8f%be%e7%9b%ae%e6%a8%99/
https://wordpress.rakka.co.jp/2026/08/27/odoo%e7%94%9f%e6%88%90ai%e5%ae%9f%e7%8f%be%e7%9b%ae%e6%a8%99/#respond
Thu, 27 Aug 2026 12:57:34 +0000
https://wordpress.rakka.co.jp/?p=570
① Retrieverパターン(RAG)
❖ 想定用途:
操作マニュアル、議事録、設計書、仕様書(ファイル・DBベース)の検索と要約
Odooのカスタマイズ仕様などの社内ナレッジ検索
❖ LangChain構成:
pythonコピーする編集するfrom langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.document_loaders import DirectoryLoader
from langchain.chains import RetrievalQA
文書はDirectoryLoaderで読み込み(PDF, Markdown, HTML)
OpenAIEmbeddingsでベクトル化
FAISSなどで永続ベクトルDB構築
RetrievalQAで質問に対してRAG方式で検索・回答
② Toolパターン(Odoo APIの操作)
❖ 想定用途:
LangChain AgentにOdooのJSON-RPCをラップしたToolを渡すことで、「データの照会」「レコード作成」などを自然言語で指示可能に
❖ 実装例:
pythonコピーする編集するfrom langchain.agents import Tool
from langchain.agents import initialize_agent
from langchain.agents.agent_types import AgentType
# Odoo JSON-RPCをラップする関数
def search_partner(query: str):
# 内部でrequests使ってOdooのsearch_read呼び出し
...
return f"{len(results)} results found"
odoo_search_tool = Tool(
name="SearchPartnerTool",
func=search_partner,
description="Find partners in Odoo by name or criteria"
)
agent = initialize_agent(
tools=[odoo_search_tool],
llm=ChatOpenAI(),
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION
)
③ SQLDatabaseChainによるPostgreSQL直結
❖ 想定用途:
OdooのバックエンドDBに対して直接SQL発行し、構造的な情報を取得・要約
例:売上レポート、在庫照会、期間別分析
❖ 実装:
pythonコピーする編集するfrom langchain.sql_database import SQLDatabase
from langchain.chains import SQLDatabaseChain
db = SQLDatabase.from_uri("postgresql+psycopg2://odoo:odoo@localhost:5432/odoo")
chain = SQLDatabaseChain.from_llm(llm=ChatOpenAI(), db=db, verbose=True)
response = chain.run("Show me total sales by month for the last 3 months.")
※ metadataの定義次第でJOINも可 ※ セキュリティのため読み取り専用アカウントを使うこと
LangChainの統合戦略(まとめ)
構成要素 LangChain構成 補足 Odoo JSON-RPC Tool として登録requests or xmlrpc.clientマニュアル/仕様書 RetrieverQA + FAISS社内ナレッジ検索 PostgreSQLの照会 SQLDatabaseChain読み取り専用接続 UI連携 Streamlit, Gradio, Odoo内iframe実装次第で埋め込み可能 チェーン制御 MultiPromptChain, RouterChain意図分類 or RAG/Tool切替
これに加えてMetabaseを用いてグラフをかけるようにする
]]>
https://wordpress.rakka.co.jp/2026/08/27/odoo%e7%94%9f%e6%88%90ai%e5%ae%9f%e7%8f%be%e7%9b%ae%e6%a8%99/feed/
0
-
Odoo データベース検索のサービス設計
https://wordpress.rakka.co.jp/2026/08/27/odoo%e3%80%80%e3%83%87%e3%83%bc%e3%82%bf%e3%83%99%e3%83%bc%e3%82%b9%e6%a4%9c%e7%b4%a2%e3%81%ae%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e8%a8%ad%e8%a8%88/
https://wordpress.rakka.co.jp/2026/08/27/odoo%e3%80%80%e3%83%87%e3%83%bc%e3%82%bf%e3%83%99%e3%83%bc%e3%82%b9%e6%a4%9c%e7%b4%a2%e3%81%ae%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e8%a8%ad%e8%a8%88/#respond
Thu, 27 Aug 2026 12:56:54 +0000
https://wordpress.rakka.co.jp/?p=573
システム構成と特長(description付き)
① 決まり文句辞書(自然文 → SQL構文 + メタ情報)
「自然言語の質問」と、それに対応する OdooのSQL文 のペアを登録・管理
各ペアには以下の情報を付与し、検索精度と業務理解を向上:
question: 実際に使われる自然文(例:「田中株式会社の最新の見積」)
sql: 対応するSQL文(SELECT限定)
description: このSQLが業務上どのような意味を持つか を記載(例:「顧客の見積履歴の中で最新1件を取得」)
parameters: 必要な入力項目(例:顧客名、期間など)を明示 → ユーザーに聞き返すときに活用
tags: 「見積」「在庫」「顧客」などの分類ラベルで検索性アップ
② 検索エンジン(類似表現対応 + description活用)
ユーザーが入力した自然文と辞書を照合し、最も意味が近いSQLを選出
マッチングには自然文・description・タグの情報を複合的に活用
将来的にはLangChainによる意味検索(ベクトル検索)への対応も可能
③ 実行エンジン(Odoo DBとの連携)
辞書から得られたSQLをOdooのデータベースに対して実行(読み取り専用 )
出力結果は整形され、表形式またはグラフ形式で表示可能(Matabase等との連携も想定)
③’ マッチなし時の対応(ナレッジ拡張)
辞書に一致する質問がない場合は、ユーザーの問いと意図を記録
導入企業に通知が届き、担当者が自然文・SQL・descriptionを登録
次回からはその検索が自動的に実行可能 になり、辞書が進化
このプロセスを通じて、導入企業にはOdooテーブル構造に関する知見 が蓄積されていく
④ ナレッジ辞書としての管理
辞書はSQL・自然文・description・tagsにより業務知識として体系化
検索ログ・利用頻度も管理でき、よく使う業務照会の可視化 が可能
複数部門・拠点間でのナレッジ共有にも活用可能
フロー図
なぜこのステップが重要なのか?
課題 このステップでどう解決するか 曖昧な質問(例:「A商品の動き教えて」)「どの期間?」「売上?在庫?」とAIが補足質問 データ構造をユーザーが知らない「この情報は sale_order_line テーブルを使います」とAIが提案 誤ったSQLや危険なクエリが実行されるリスクユーザーが確認してからSQL実行に進める(セーフティステップ)
概要:段階的進化型データ検索サービス
フェーズ 目的 機能 フェーズ1(導入初期〜)Odooに自然文で照会できるようにする 決まり文句検索+辞書蓄積型システム フェーズ2(導入半年〜1年)実際の検索行動からニーズ・データパターン を分析 よく使う項目・テーブル・条件の抽出 フェーズ3(1年後〜)より自由で高速な分析環境へ拡張 Snowflakeへの部分的データ同期+自由検索 を実現
なぜこのステップが優れているか
観点 フェーズ1→3戦略のメリット ユーザー適応 最初は操作が簡単で安心 → 少しずつ「考えて聞く力」が育つ データ最適化 無駄なテーブルやフィールドをSnowflakeに移さなくて済む(実用重視) コスト最適化 Odooだけで完結する軽量システムから始め、高コストなDWHを後から展開 学習効果 実際の「検索行動=意思決定パターン」そのものが、システム要件の材料になる 提案力向上 Odooの制限で困っているケースを収集 → Snowflakeが必要な根拠になる
学習フェーズの位置づけ(フェーズ2)
収集するユーザーデータ例
データ種別 意図 検索された自然文(頻度・再利用回数) どんな質問が多いか、汎用性があるか 実行されたSQL(テーブル、列、WHERE句) 実際に使われているデータ構造の傾向 マッチしなかった質問の記録 Odooだけでは表現しづらいニーズの特定 補完されたパラメータ ユーザーがいつも選んでいる条件(顧客名、期間など) タグの使用状況 検索パターンをジャンル分け(売上、見積、在庫、納期 etc.)
Snowflakeへの展開(フェーズ3)
ポイント:
利用頻度が高いテーブルだけをSnowflakeにミラーリング(ストレージ最適化)
検索文・タグ単位で「分析系質問」を分類し、自由度の高いSQL構文に変換
自由検索モードは
ChatGPT + LangChain + SQLDatabaseChain(Snowflake接続)
Metabaseと統合して展開
移行対象の絞り込み例
選定条件 説明 利用頻度Top20のSQLで使われたテーブル 業務で本当に使われている領域に限定 WHERE句で頻出のフィールド パーティショニングやインデックス最適化にも活用 JOINされる相手テーブル 関連性の高いものだけペアで移行
訴求ポイント
Odooの導入と同時に、**“検索の文化”**を根付かせる
導入後の行動データをもとに、段階的に分析環境を進化
初期はOdooだけ、DWH投資は1年後の実需ベースで判断
ユーザーの質問行動そのものが社内ナレッジの資産化
]]>
https://wordpress.rakka.co.jp/2026/08/27/odoo%e3%80%80%e3%83%87%e3%83%bc%e3%82%bf%e3%83%99%e3%83%bc%e3%82%b9%e6%a4%9c%e7%b4%a2%e3%81%ae%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e8%a8%ad%e8%a8%88/feed/
0
-
Odoo データ抽出での条件設定
https://wordpress.rakka.co.jp/2026/08/27/odoo-%e3%83%87%e3%83%bc%e3%82%bf%e6%8a%bd%e5%87%ba%e3%81%a7%e3%81%ae%e6%9d%a1%e4%bb%b6%e8%a8%ad%e5%ae%9a/
https://wordpress.rakka.co.jp/2026/08/27/odoo-%e3%83%87%e3%83%bc%e3%82%bf%e6%8a%bd%e5%87%ba%e3%81%a7%e3%81%ae%e6%9d%a1%e4%bb%b6%e8%a8%ad%e5%ae%9a/#respond
Thu, 27 Aug 2026 12:56:00 +0000
https://wordpress.rakka.co.jp/?p=580
週次でテーブルの行数を計測し、一定の閾値を超えたテーブルに対して「絞り込み条件を必須」とする制御は可能 です。これはLangChain+ChatGPTの活用だけでなく、Odoo/PostgreSQL側の定期計測・メタデータ管理・制御ロジックを組み合わせることで実現できます。
実現構成の全体像
[1] 毎週、OdooのPostgreSQLに対して各テーブルの行数を計測
↓
[2] 行数を辞書DBやYAML/JSONで保存(例:table_size_map)
↓
[3] LangChain/GPTのSQL生成フェーズで、
「対象テーブルの行数が閾値を超えていれば → 条件付き生成 or 警告 or UIで指定必須」に切り替える
④ 自動対応パターン
状況 対応方法 閾値超えテーブルを含むSQL GPTに「条件を追加して再生成して」とプロンプトを変える 自然文に期間などがない ChatGPTからユーザーに追加質問 UIで発行時に警告 「このテーブルには条件が必要です」などを表示 条件がなければSQL発行を拒否 サーバー側でチェックして弾く(例:WHERE句がない)
まとめ
項目 内容 行数計測方法PostgreSQLの pg_stat_user_tables を定期実行(cron) 保持形式JSON/YAML or Odoo独自モデル 活用GPTプロンプト補助/LangChain制御ロジック/UI警告 メリット無条件の全件抽出クエリを未然に防げる(安全・高速化)
補足:ご希望に応じて
行数チェック自動ジョブ(cron+Python or SQL script)
LangChain用制御コードテンプレート
GPTプロンプトテンプレート例(「このテーブルには条件が必要」と事前知識に入れる)
]]>
https://wordpress.rakka.co.jp/2026/08/27/odoo-%e3%83%87%e3%83%bc%e3%82%bf%e6%8a%bd%e5%87%ba%e3%81%a7%e3%81%ae%e6%9d%a1%e4%bb%b6%e8%a8%ad%e5%ae%9a/feed/
0
-
Snowflake中間レイヤー活用 – 2パターンの使い方
https://wordpress.rakka.co.jp/2026/08/27/snowflake%e4%b8%ad%e9%96%93%e3%83%ac%e3%82%a4%e3%83%a4%e3%83%bc%e6%b4%bb%e7%94%a8-2%e3%83%91%e3%82%bf%e3%83%bc%e3%83%b3%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9/
https://wordpress.rakka.co.jp/2026/08/27/snowflake%e4%b8%ad%e9%96%93%e3%83%ac%e3%82%a4%e3%83%a4%e3%83%bc%e6%b4%bb%e7%94%a8-2%e3%83%91%e3%82%bf%e3%83%bc%e3%83%b3%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9/#respond
Thu, 27 Aug 2026 12:37:31 +0000
https://wordpress.rakka.co.jp/?p=611
1. 現状の課題
Odoo Postgresに直接アドホック分析を実行すると、本番DBの可用性・パフォーマンスに悪影響が出る。
Snowflakeに全データを複製する方式では、不要データも含めてスキャンコスト・コンピューティングコストが増大。
大規模データ分析では、定型レポート用データも含めSnowflakeでのクエリが重くなり、コストが跳ね上がる。
2. 解決策:Snowflakeを2パターンで活用
パターンA:アドホック分析
Odoo Postgres
│
▼
(OpenAI Pod/FastAPI)
│
▼
Snowflake(内部テーブル)
│
▼
Metabase(BI/グラフ化)
特徴
OpenAI Podが生成するSQLに基づき、必要なデータだけをオンデマンドでSnowflake内部に格納 。
Postgresから抽出したデータを analysis_{UUID} のような一時テーブルとしてSnowflakeに作成。
MetabaseはSnowflake内部テーブルを直接参照し、分析完了後は不要テーブルをDROP。
メリット
短期的で軽量なアドホック分析がすぐ可能。
S3を経由しないため、リアルタイム性が高い 。
パターンB:大規模データ分析(定型レポート向け)
Odoo Postgres
│ (ETL/バッチ)
▼
Amazon S3 (Parquet)
│ (External Table参照)
▼
Snowflake
│
▼
Metabase
特徴
大量のトランザクションや履歴データは S3(Parquet)に蓄積し、SnowflakeからExternal Tableで参照 。
パーティション化(例:日付/year=2025/month=07/) によりスキャン対象を絞り、Snowflakeのクレジット消費を削減。
定型レポートや定期ダッシュボードに最適。
メリット
コスト効率が高い (Parquetで列指向かつ圧縮、S3は長期保存コストが安価)。
Snowflake内部に大量データを保持しないため、内部ストレージ課金を抑制。
分析負荷の分散 (ETL段階で必要なフィールド・期間だけ抽出)。
3. 両パターンの併用例
アドホック分析(即時可視化) : 部署やユーザーが自然文でクエリ(OpenAI → SQL) → Snowflake内部テーブル → Metabaseで即時グラフ。
定型分析(週次・月次レポート) : 大量データをバッチで S3+Parquetに出力 → SnowflakeのExternal Table → Metabaseダッシュボード。
4. メリット
Odoo本番DBの負荷を完全に分離 アドホック・定型いずれの分析もSnowflake経由。
コンピューティングコスト削減
アドホックは最小限のデータを直接Snowflakeに。
大規模分析はParquet列指向+パーティションでスキャン量を削減。
ストレージコスト最適化
S3は低コストストレージで長期保持可能。
Snowflake内部には一時テーブルのみ保持。
]]>
https://wordpress.rakka.co.jp/2026/08/27/snowflake%e4%b8%ad%e9%96%93%e3%83%ac%e3%82%a4%e3%83%a4%e3%83%bc%e6%b4%bb%e7%94%a8-2%e3%83%91%e3%82%bf%e3%83%bc%e3%83%b3%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9/feed/
0
-
Odoo×AI サービス設計
https://wordpress.rakka.co.jp/2026/08/27/odooxai%e3%80%80%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e8%a8%ad%e8%a8%88/
https://wordpress.rakka.co.jp/2026/08/27/odooxai%e3%80%80%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e8%a8%ad%e8%a8%88/#respond
Thu, 27 Aug 2026 12:05:11 +0000
https://wordpress.rakka.co.jp/?p=583
① OpenAIでSQL作成 ② SQLに基づき、データ抽出 ③ レポート画面生成 ④ レポート画面に抽出されたデータのグラフを表示 ⑤ グラフとデータに基づいてAIの分析結果とプランニングなどをテキスト表示 ⑥ レポートを共有
LangChain + FastAPI + Metabase + OpenAI + Odoo/Snowflake などを組み合わせる
ユーザー → 自然言語で質問
↓
① OpenAI / LangChain
→ Prompt → SQL生成(例: "月別売上を見せて" → SELECT ...)
↓
② DB(Odoo or Snowflake)
→ SQL実行 → 結果(JSON / Pandas)
↓
③ グラフ生成エンジン(Metabase or Python / Chart.js)
→ 結果をグラフ化(棒グラフ・折れ線・円など)
↓
④ Webレポート生成(FastAPI + HTML)
→ グラフ + データテーブル + ユーザーUI
↓
⑤ AIによる分析と提案(OpenAI)
→ 結果に基づく自然言語サマリーや施策提案
↓
⑥ レポート共有(PDF化 / Public URL / メール送信)
フェーズ 技術 概要 ① 自然文→SQL LangChain (LLMChain + OutputParser) ユーザー入力をSQLに変換 ② SQL実行 SQLAlchemy / psycopg2 / Snowflake Connector OdooやSnowflakeに接続してデータ取得 ③ グラフ生成 Metabase埋め込み or matplotlib / Plotly / Chart.js 視覚化 ④ Webレポート FastAPI + Jinja2 / Streamlit / React グラフとデータを統合表示 ⑤ AI分析 OpenAI API(GPT-4) chat() で分析文章を生成⑥ 共有 HTML/PDF化(WeasyPrint 等) + URL発行 PDFで保存 or メール送信 or iframe共有
graph TD
A[ユーザーの自然文入力] --> B[LangChainでSQL生成]
B --> C[Odoo/SnowflakeでSQL実行]
C --> D[グラフ/データを生成]
D --> E[Webページで表示]
C --> F[AI分析テキスト生成]
F --> E
E --> G[PDF化 or 公開URLで共有]
各パーツのコードイメージ(超簡略)
① SQL生成
pythonコピーする編集するchain = LLMChain(llm=ChatOpenAI(), prompt=sql_prompt)
sql = chain.run("月別売上を見せて")
② SQL実行
result = pd.read_sql(sql, con=engine)
③ グラフ生成
fig = px.bar(result, x='month', y='sales') fig.write_image("chart.png")
④ + ⑤ Web画面と分析(FastAPI)
@app.get("/report") def report(): gpt_summary = chat_model.predict(f"この結果を分析してください:\n{result.to_string()}") return templates.TemplateResponse("report.html", {"chart": "chart.png", "summary": gpt_summary})
⑥ 共有
メール添付送信
HTML/PDF出力
URLに埋め込み
応用展開も可能です
ユーザー操作ログから学習してよくある分析を自動レコメンド
分析結果をトリガーにOdoo操作(見積発行・受注通知など)
グラフの種類を自然言語で指定可能 (例:「棒グラフで見せて」)
まとめ
あなたの想定された ①〜⑥ の流れは、
LangChain × FastAPI × OpenAI × DB × グラフ可視化技術 の組み合わせで、完全に構築可能です。
比較:Odoo Knowledge vs WordPress
観点 Odoo Knowledge WordPress 目的 社内向けのドキュメント、ノウハウ共有 公開用または社外共有型のWebサイト、ポータル 対象読者 Odooユーザー(社内) 一般ユーザー、顧客、社内外問わず アクセス管理 Odoo内の権限設定に依存(社内的) ロール、パスワード、会員プラグインで柔軟に管理可 UI・編集性 ノートアプリのような直感的エディタ(Wiki風) 高機能なエディタ+多彩なテーマ/プラグイン 検索性 Odoo内検索と連携可(例:CRM、ヘルプ) 強力な全文検索+ベクトル検索にも対応可能(RAG) 外部連携性 他Odooモジュールとネイティブ連携(例:販売、製造) REST API、Webhook、プラグインで自由度が高い RAG用途 構造が整理されているため精度は高い Markdown / HTMLで構成すればRAG精度も良好 公開性 基本的に非公開(Odooユーザー内) インターネット上に公開しやすい(柔軟に制限可) インストールと管理 Odoo内で完結、追加構築不要 別サーバー/WordPressホスティングが必要
レポート作成例
SQL作成(OpenAI) SELECT month, SUM(amount) FROM sales GROUP BY month
データ抽出結果 月別売上(ダミーデータ例):
月 売上 前年比 1月 120,000 1.05 2月 135,000 1.10 3月 150,000 1.20 4月 170,000 1.25 5月 160,000 1.10 6月 180,000 1.15
グラフ表示(Metabase or API生成) → 上記のグラフは「棒グラフ(Bar)」で自動生成
AI分析結果(OpenAI) 「直近6か月で売上は安定的に増加傾向。特に3〜4月に大きく伸びており、販促キャンペーンとの関連が考えられる。」
次アクションの提案 「成果が高かった3月施策をベースに、7月に再実施を検討する。」
レポート共有 → Web APIで出力 or WordPress/Odooナレッジ等へEmbed、PDF化
想定される質問
直近半年の売上状況を教えてください。
より高精度を狙うなら:
「金額ベースで、直近半年の月別売上を知りたいです。 」
「キャンセルを除いた売上で、直近6ヶ月の動向を教えてください。 」
]]>
https://wordpress.rakka.co.jp/2026/08/27/odooxai%e3%80%80%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e8%a8%ad%e8%a8%88/feed/
0