Neo4j Knowledge Graphs and Azure OpenAI 動画和訳。LLM、グラフ、グラフアルゴリズムの統合デモ
このビデオは、当社がNeo4jと協力して、日本のお客様に実施したデモです。(※動画編集によりお客様の発言や名前は出てきません)
本ページでは動画のスクリーンショットと和訳を掲載しています。また、公開動画にはなっていませんが、実際のミーティングでは、neo4j納入先でのLLM(Large Language Models:大規模言語モデル)とneo4jを統合した事例についても簡単に紹介されました。
このように、当社ではneo4jを巻き込んだ形でデモや事例の紹介ができます。最新の技術を活用した事例は、海外が進んでいます。ご興味がある方は、お気軽にお問い合わせください。
要点:
・事例として、様々な患者の症例履歴を大量に持つ仮想的な病院のデータを使用しています。患者や症状、原因となる部位などのデータを取り扱います。
・OPEN AIのGPTを使用してテキストからエンティティやリレーションシップを抽出し、グラフ構造としてneo4jに格納します。
・格納したデータは、チャットによるQ&A、ダッシュボードによる可視化やPageRank Centralityのようなグラフアルゴリズムにより活用されます。
・pythonによるサンプルコードも提供しているので、コードを見ることにより理解が深まります。
皆さんこんにちは。今日は、企業がAzure OpenAIとNeo4jを活用して、テキスト、ビデオ、文字起こしなどの形の非構造化データから洞察を得る方法を紹介します。
このデモでは、様々な患者の症例履歴を大量に持つ仮想的な病院の例を考え、Azure OpenAIとNeo4jを活用して、それらの症例履歴から情報を抽出し、Neo4jに登録し、Azure OpenAIを使って再びそれらを利用するつもりです。
このアーキテクチャは、私たちがプロジェクトでよく使用する参考アーキテクチャです。
構造化データから情報を抽出し、それをNeo4jの中に入れるのは簡単です。通常、テキストや文字起こしなどの形の非構造化データでは、一筋縄ではいきません。しかし、OpenAIの助けを借りれば、今ではこの非構造化データからエンティティやリレーションシップを抽出し、Neo4jに送り込むことは非常に簡単です。
Neo4jを真ん中に置くことの価値は、従来はサイロに置かれていた非構造化データを、Neo4jを使ってつなげることができるということです。デモでお見せするように、そこから非常に大きな洞察を得ることができます。また、データの活用側では、OpenAIとNeo4jを使ってチャットボットを構築することができます。誰があなたのデータのどの部分にアクセスできるかをコントロールすることができ、また、これまでのチャットボットで直面していたハルシネーション(Hallucination)の問題を解決することができます。
では、早速デモをご覧いただきます。
このデモは、医療記録という形でデータを入力します。典型的な医療記録はこのようなテキストで、非常に構造化されておらず、患者の病歴、診断内容などで構成されています。
参考:医療記録例(和訳)
「患者は34歳の男性で、発熱と慢性的な咳を訴えました。彼は喫煙者で、肺結核の病歴があり、治療を受けて治癒しました。
コンピューター断層撮影(CT)スキャンにより、両方の肺に複数の小さな小結節が明らかになった。胸腔鏡による肺生検を右上葉から採取した。顕微鏡検査により、典型的な LCH であることが明らかになりました。腫瘍細胞は小胞状で溝状の核を持ち、細気管支の周囲に小さな凝集体を形成していました(図1)。腫瘍細胞は、S-100 タンパク質、ビメンチン、CD68、および CD1a に対して強い陽性を示しました。腫瘍細胞の周囲にはリンパ球と好酸球の浸潤が見られました。追加の放射線検査を行ったところ、他の臓器が関与しているとは考えられませんでした。彼は喫煙をやめたが、他に特別な治療は受けなかった。その後1年間、彼は元気でした。その後、フォローアップのCTスキャンを行ったところ、両肺に複数の小さな結節に加えて、左下葉に4cm大の腫瘤が認められました(図2)。針生検標本により肉腫の可能性が明らかになりました。 したがって、肺葉切除術が行われました。肉眼的には、境界が不十分な小葉状の灰白色の 4 cm の腫瘤が見つかり (図 3)、主要な腫瘤の周囲にいくつかの小さな付随結節がありました。顕微鏡で見ると、腫瘍細胞は大きなシート状に凝集しており、浸潤性の増殖を示していました。一部の腫瘍細胞の細胞学的特徴は、典型的な LCH で見られるものと類似していました。しかし、多くの腫瘍細胞は多形性/過色性核や顕著な核小体などの明らかな悪性細胞学的特徴を示し(図4)、多核腫瘍巨細胞も見つかりました。10 の高倍率フィールドあたり 30 ~ 60 の範囲の多数の有糸分裂数値があり、それらのいくつかは異常でした。典型的な LCH のいくつかの病巣が主要な腫瘍塊の周囲に残っていました。免疫組織化学的に、腫瘍細胞は S-100 タンパク質 (図 5) とビメンチンに対して強く陽性でした。 また、CD68 (Dako N1577、クローン KPI) についても陽性であり、CD1a についても局所的に陽性であり (図 6)、サイトケラチン、上皮膜抗原、CD3、CD20、および HMB45 については陰性でした。超微細構造分析では、腫瘍細胞の細胞質にバーベック顆粒が存在することは示されませんでした。肺葉切除後 5 か月が経過した現在、患者は良好であり、放射線学的所見に大きな変化はありません。」
デモ・アプリケーションのアーキテクチャは次のようになっています。テキスト・コーパスを、Azure内で動作しているAzure open AIに送り込みます。Azure MLには、このテキスト・コーパスを構造化フォーマットに変換するプロセス全体を自動化するノートブックがあります。この構造化されたデータは、Neo4jデータベースに投入されます。
Neo4jデータベース内で構造化されたデータが変換されると、StreamlitとLangChainで構築されたアプリケーションを使って、それを利用する準備が整います。これにより、どのようなユーザーでもNeo4jデータベースと直接やりとりできるようになります。
データ取り込みの部分では、入力されテキストがスキーマに変換されます。
このデモでは、アプリケーションの利用者がドメインの専門家であるため、ドメイン固有のスキーマが使用されています。
スキーマには、症例履歴から抽出された以下の情報が含まれます:
Case:システムに入力された症例を示す。
Person:症例履歴の対象者。
Diagnosis:症例に記載された診断名。
Symptom:症例情報から抽出された症状。
BodySystem:罹患した身体の部位。
Biological:診断に示されたあらゆる生物学的情報。
これらの抽出された情報はすべてNeo4jデータベース内に保存されます。
Neo4jデータベースがセットアップされ、すべての症例履歴がスキーマに変換されると、システムはユーザーからの問い合わせを受け付ける準備が整います。チャットボットを構築する場合、ユーザーは自然言語で質問をすることができます。英語でも、言語モデル(LLM)がサポートする他の言語でも構いません。複数の言語を理解できる言語モデルは、ユーザーの質問を処理し、”Cypher “と呼ばれるNeo4j固有のクエリ言語に変換します。
Cypherクエリは、Neo4jデータベース内で実行される。データ自体はNeo4j内に存在し、言語モデルと一緒に置かれる必要はないです。質問はデータベースに向けられ、結果はそこから得られます。
Neo4jデータベースから得られる結果は、関連する情報を含むJSON形式です。ユーザーが理解しやすいように、システムは結果を要約してからユーザーに返します。この要約により、ユーザーはチャットボットから提供された重要な洞察や情報を素早く把握することができます。
要約すると、チャットボットのフローは、ユーザーが自然言語で質問し、言語モデルがそれをCypherクエリに変換し、クエリがNeo4jデータベースで実行され、要約された結果がユーザーフレンドリーな形式でユーザーに提示されます。このプロセスにより、ユーザーはチャットボットと対話し、Neo4jに保存された構造化データから洞察を得ることができます。
次に、チャットボットが実際にどのように見え、機能するかを簡単にデモンストレーションします。 チャットボットは、ドメインの専門家が対話して、知りたい洞察を活用できるように構築されています。
デモンストレーションでは、発表者はチャットボットに、「Which body part got affected in most of my patients ? (私の患者さんは、体のどの部分が悪いことが多いですか?)」と質問します。チャットボットはこの質問を処理し、Neo4j データベースで適切な Cypher クエリを実行し、要約された結果を返します。
このデモでは、チャットボットが Neo4j データベースに保存されている構造化データに基づいて貴重な情報と洞察をどのように提供できるかを紹介します。 これにより、分野の専門家はユーザーフレンドリーな方法でデータを操作し、医療記録から貴重な洞察を得ることができます。
具体的洞察を得るためには、すべての症例履歴からつながりのある情報を得ることが不可欠です。チャットボットからの回答では、「The body part that got affected in most of your patients is the heart, with 144 patients affected.(かなりの数の患者(約144人)が心臓に関連する疾患に罹患している)」と述べています。チャットボットは、このようなユーザーが様々な質問をするためのユーザーフレンドリーなインターフェースを提供する。
また、ダッシュボードを作り、貴重な洞察を得ることができます。このケースでは、197人の患者の197の症例からデータを抽出しています。このデータから、421の疾患と125の罹患部位を特定しました。サンキチャートで情報を視覚化することで、病気、罹患した身体部位、患者間の関係を簡単に見ることができる。例えば、このチャートから、胸部に影響を及ぼす疾患が多数あることがわかります。また、細胞癌と腺癌の両方に罹患している患者も発見され、その一方は膵臓に、もう一方は胸部に影響を及ぼしていました。以前はサイロ化されていた非構造化症例履歴データを、グラフ構造でつなげることで、貴重な洞察が得られます。
ここで終わりにせず、もっと深く掘り下げて情報を得ることもできます。
例えば、インフルエンザか何かの病気が流行る季節であれば、患者さんの多くがどんな症状にかかっていることがすぐにわかります。
また、診断情報や、患者が罹患する上位の病気についても知ることができます。
さて、このダッシュボードはとてもシンプルですが、さらに掘り下げる必要があるかもしれません。
データはNeo4jにすべて格納されており、グラフ構造でつながっているので、その上にデータサイエンスのアルゴリズムを適用することができます。これから適用するアルゴリズムは “PageRank Centrality “と呼ばれるものです。
アルゴリズムを実行すると、特定の体の部位、特に中心性スコアが15と高いのは胸部であることがわかります。これは、より多くの病気や症状がこの特定のノードに集中していることを意味します。同様に、適用できるアルゴリズムはもっとたくさんあり、通常は目に見えないところに隠れている洞察を得ることができます。Neo4jグラフ・データ・サイエンスは、現在70以上のアルゴリズムをサポートしており、これらのグラフ・データ・サイエンス・アルゴリズムを活用することができます。