---
title: "Auth0 FGA と LangGraph を使用して安全な LangChain RAG エージェントを Node.js 上で構築"
description: "Auth0 FGA と LangGraph を使用して安全な LangChain RAG エージェントを Node.js 上で構築する方法を紹介します。"
authors:
  - name: "Deepu K Sasidharan"
    url: "https://auth0.com/blog/authors/deepu-sasidharan/"
date: "Apr 24, 2025"
category: "AI"
tags: ["ai", "fga", "langchain", "rag", "developers", "auth0-fga"]
url: "https://auth0.com/blog/jp-genai-langchain-js-fga/"
---

# Auth0 FGA と LangGraph を使用して安全な LangChain RAG エージェントを Node.js 上で構築

> 本記事は 2025年3月12日 に更新された「[Build a Secure LangChain RAG Agent Using Auth0 FGA and LangGraph on Node.js](https://auth0.com/blog/genai-langchain-js-fga/)」を機械翻訳した記事です。

好むと好まざるとにかかわらず、生成 AI (GenAI) はソフトウェアの状況を大きく変えました。検索拡張生成 (RAG) は、生成 AI アプリケーションの基礎で、より多くのコンテキストを提供して LLM (大規模言語モデル) の精度を向上させるアーキテクチャです。データベースや検索エンジンから更新されたデータやドメイン固有のデータを取得することで実現します。さまざまなアプリケーションで LLM の精度を向上できる強力なテクニックです。

RAG ベースのシステムでは、 LLM が機密データに誤ってアクセスしたり公開したりすることを防ぐため、セキュリティはさらに重要になります。従来のロールベースアクセス制御 (RBAC) システムでは、 RAG アプリケーションを保護するには不十分です。そこで [Fine-Grained Authorization (FGA)](https://fga.dev/) が役立ちます。

RAG で FGA を使用する基本を学びたい場合は、ブログ記事 [信頼できる AI アプリケーションの構築: FGA を用いた RAG システムのアクセス制御](https://auth0.com/blog/jp-rag-and-access-control-where-do-you-start/) を確認ください。

<include
  src="LinkCard"
  title="RAG and Access Control: Where Do You Start?"
  link="https://auth0.com/blog/rag-and-access-control-where-do-you-start/"
  description="Learn how to get started with Auth0 FGA for a RAG application."
  img="https://images.ctfassets.net/23aumh6u8s0i/79NCborGcFIrAMeaV7G8oi/f9c588c2d05f0828d447e72e1fe825cc/Latam01.jpg"
/>
本チュートリアルでは、 [LangChain](https://www.langchain.com/) フレームワークを使用してシンプルな RAG エージェントを構築し、Auth0 FGA を使用して保護します。


<AmpContent>
<amp-youtube
    data-videoid="u81b6nsDoPA"
    layout="responsive"
    width="480" height="270">
</amp-youtube>
</AmpContent>

<NonAmpContent>
<div
  className='embed-container'
  style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;margin-bottom:40px;">
    <iframe
      style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;"
      src='https://www.youtube.com/embed/u81b6nsDoPA'
      frameborder='0' allowfullscreen>
    </iframe>
</div>
</NonAmpContent>

## 前提条件

> **本チュートリアルでは、以下のツールとサービスが必要になります。**:
>
> - [NodeJS v20](https://nodejs.org/en/download)
> - Auth0 FGA アカウント [こちらで作成](https://dashboard.fga.dev)
> - OpenAI アカウントと API キー [こちらで作成](https://platform.openai.com)

## LangChain を使用する理由

[LangChain](https://www.langchain.com/) は、検索拡張生成 (RAG) アプリケーションを含むコンテキストを考慮できる AI アプリケーションを構築するための主要なフレームワークの 1 つです。LangChain はオープンソースであり、基盤となる LLM (大規模言語モデル) と対話するためのシンプルな API を提供します。LangChain は、OpenAI の GPT モデル、Google VertexAI、Anthropic など、さまざまな LLM をサポートしています。また、データベースや検索エンジンからデータを取得し、LLM により多くのコンテキストを提供するための簡単な方法も提供します。このチュートリアルでは、LangChain の [LangGraph](https://www.langchain.com/langgraph) を使用して、エージェント型の RAG アプリケーションを構築します。LangGraph は、RAG アプリケーションを含む複雑なタスクを処理できるエージェントを構築可能な、強力なツールです。LangGraph は、ワークフロー、永続化コンテキスト、ストリーミングサポートなどの高度な機能を提供します。

## LangGraph RAG アプリケーションのセットアップ

まず、 GitHub から [**auth0-ai-samples**](https://a0.to/auth0-ai-samples) リポジトリをダウンロードします。:

```bash
git clone https://github.com/auth0-samples/auth0-ai-samples.git
cd auth0-ai-samples/authorization-for-rag/langgraph-agentic-js
# install dependencies
npm install
```

アプリケーションは Node.js プラットフォーム向けに TypeScript で記述されており、以下のように構成されています。:

- `index.ts`: RAG パイプラインを定義するアプリケーションのメインエントリーポイントです。
- `assets/docs/*.md`: LLM のコンテキストとして使用するサンプル Markdown ドキュメントです。デモンストレーション用に、パブリックドキュメントとプライベートドキュメントを用意しています。
- `helpers/read-documents.ts`: Markdown ファイルをドキュメントとして読み込むためのユーティリティです。
- `helpers/langchain.ts`: LangGraph 検索エージェントを定義します。
- `scripts/fga-init.ts`: Auth0 FGA 認可モデルを初期化するためのユーティリティです。

アプリケーションを実行する前に、重要な部分を確認しましょう。

### RAG パイプライン

RAG パイプラインは `index.ts` で定義します。このパイプラインは LangGraph フレームワークを使用して、基盤となる LLM と対話し、データベースからデータを取得します。パイプラインは以下のように定義します。:

```js
/** index.ts **/
const user = 'user1';
// 1. Read and load documents from the assets folder
const documents = await readDocuments();
// 2. Create an in-memory vector store from the documents for OpenAI models.
const vectorStore = await MemoryVectorStore.fromDocuments(
  documents,
  new OpenAIEmbeddings({ model: 'text-embedding-3-small' }),
);
// 3. Create a retriever that uses FGA to gate fetching documents on permissions.
const retriever = FGARetriever.create({
  retriever: vectorStore.asRetriever(),
  // FGA tuple to query for the user's permissions
  buildQuery: (doc) => ({
    user: `user:${user}`,
    object: `doc:${doc.metadata.id}`,
    relation: 'viewer',
  }),
});
// 4. Convert the retriever into a tool for an agent.
const fgaTool = retriever.asJoinedStringTool();
// 5. The agent will call the tool, rephrasing the original question and
// populating the "query" argument, until it can answer the user's question.
const retrievalAgent = RetrievalAgent.create([fgaTool]);
// 6. Query the retrieval agent with a prompt
const answer = await retrievalAgent.query('Show me forecast for ZEKO?');
```

以下に RAG アーキテクチャを図で示します。:

![LangChain RAG architecture](https://images.ctfassets.net/23aumh6u8s0i/707VuhSJ2FqDBTrQNP6rTl/0fcd90a881441369e1466b109c02686c/langgraph-rag.jpg)

### FGA retriever

`FGARetriever` クラスは [auth0-ai-js](https://www.google.com/search?q=%5Bhttps://github.com/auth0-lab/auth0-ai-js%5D\(https://github.com/auth0-lab/auth0-ai-js\)) SDK の一部として提供され、Auth0 FGA で定義された認可モデルに基づいてドキュメントをフィルターします。このクラスは、既にベクターストアにドキュメントがあり、ユーザーのパーミッションに基づいてベクターストアの結果をフィルターするシナリオに最適です。ベクターストアが既にドキュメントを少数に絞り込んでいる場合に、ユーザーがアクセスできるドキュメントのみにさらに絞り込みます。 

アルファ版は、以下のコマンドを使用してインストールできます。(訳注:より新しいバージョンがリリースされていますが本記事はアルファ版に基づいています):

```bash
npm install "https://github.com/auth0-lab/auth0-ai-js.git#alpha-1" --save
```

`buildQuery` 関数は、FGA ストアへのクエリーを作成します。クエリーは、ユーザー、オブジェクト、リレーションで構成されます。ユーザーはユーザー ID、オブジェクトはドキュメント ID、リレーションはユーザーがドキュメントに対して持つパーミッションです。

```typescript
buildQuery: (doc) => ({
  user: `user:${user}`,
  object: `doc:${doc.metadata.id}`,
  relation: 'viewer',
}),
```

### Retrieval Agent

`RetrievalAgent` クラスは、FGA retriever ツールと OpenAI モデルを使用してユーザーの質問に答える LangGraph の取得エージェントを設定します。エージェントはコンテキストのドキュメントを取得するためにツールを呼び出します。

```typescript
/** helpers/langchain.ts **/
static create(tools: StructuredToolInterface[]) {
  // Create a retrieval agent that has access to the retrieval tool.
  const retrievalAgent = createReactAgent({
    llm: new ChatOpenAI({ temperature: 0, model: 'gpt-4o-mini' }),
    tools,
    stateModifier: [
      "Answer the user's question only based on context retrieved from provided tools.",
      'Only use the information provided by the tools.',
      'If you need more information, ask for it.',
    ].join(' '),
  });
  return new RetrievalAgent(retrievalAgent);
}
```

## FGA ストアをセットアップする

[Auth0 FGA ダッシュボード](https://dashboard.fga.dev/)で **Settings** に移動し、**Authorized Clients** セクションで **+ Create Client** をクリックします。クライアントに名前を付け、3 つすべてのクライアントパーミッションにチェックを付け、**Create** をクリックします。

![FGA クライアントの作成](https://images.ctfassets.net/23aumh6u8s0i/2KQc8ACR0MDTqftUgUSXpX/5b779bcece07a69ac775de0fc760c208/Uploaded_from_RAG_and_Access_Control__Where_Do_You_Start)

クライアントが作成されると、Store ID、Client ID、Client Secret が記載された画面が表示されます。

プロジェクトのルートに、以下の内容の `.env` ファイルを作成します。**Continue** をクリックして `FGA_API_URL` と `FGA_API_AUDIENCE` を確認します。

```
# OpenAI
OPENAI_API_KEY=<your-openai-api-key>

# Auth0 FGA
FGA_STORE_ID=<your-fga-store-id>
FGA_CLIENT_ID=<your-fga-store-client-id>
FGA_CLIENT_SECRET=<your-fga-store-client-secret>
# Required only for non-US regions
FGA_API_URL=https://api.xxx.fga.dev
FGA_API_AUDIENCE=https://api.xxx.fga.dev/
```

OpenAI の API キーは [こちら](https://help.openai.com/en/articles/4936850-where-do-i-find-my-openai-api-key) を確認ください。

次に、**Model Explorer** に移動します。モデル情報を以下の内容に更新する必要があります。:

```text
model
  schema 1.1

type user

type doc
  relations
    define owner: [user]
    define viewer: [user, user:*]
```

**Save** をクリックします。

> FGA で認可モデルを作成する方法の詳細は、[こちらのドキュメント](https://docs.fga.dev/modeling) を確認ください。

公開情報にアクセスするには、FGA にタプルを追加する必要があります。**Tuple Management** セクションに移動し、**+ Add Tuple** をクリックして、以下の情報を入力します。

- **User**: `user:*` を入力
- **Object**: doc を選択し、ID に `public-doc` を入力
- **Relation**: `viewer` を入力

タプルは、特定のオブジェクトに対するユーザーの関係を示します。たとえば、上記のタプルは、すべてのユーザーが `public-doc` オブジェクトを閲覧できることを意味します。

> または、`scripts/fga-init.ts` スクリプトを使用して、FGA ストアのモデルとタプルを初期化することもできます。
> `.env` ファイルを設定した後、`npm run fga:init` コマンドを実行します。

## アプリケーションをテストする

アプリケーションと FGA ストアのセットアップが完了したので、以下のコマンドを使用してアプリケーションを実行できます。:

```bash
npm start
```

アプリケーションは `Show me forecast for ZEKO?` というクエリーで開始します。この情報はプライベート ドキュメント内にあり、このドキュメントへのアクセス権を持つタプルを定義していないため、アプリケーションはドキュメントを取得できません。FGA retriever はベクターストアの結果からプライベートドキュメントをフィルターで除外し、その結果、以下のような応答を出力します。

```text
The provided context does not include specific forecasts or projections for Zeko Advanced Systems Inc. ...
```

クエリーを公開ドキュメントで利用可能な情報に関するものに変更すると、アプリケーションはその情報を取得できます。

プライベート情報にアクセスするには、タプル リストを更新する必要があります。Auth0 FGA ダッシュボードの **Tuple Management** セクションに戻り、**+ Add Tuple** をクリックして、以下の情報を入力します。:

- **User**: `user:user1` を入力
- **Object**: doc を選択し、ID に `private-doc` を入力
- **Relation**: `viewer` を入力

**Add Tuple** をクリックし、再度スクリプトを実行します。:

```bash
npm start
```

今回は `user1` の `private-doc` オブジェクトに対する `viewer` リレーションを定義するタプルを追加したため、予測情報を含む応答が表示されます。

これで、LangChain を使用し、Auth0 FGA を使用して保護するシンプルな RAG アプリケーションを実行できました。

## Auth0 for AI Agents、Auth0 FGA、生成 AI についてさらに学ぶ

本記事では、Auth0 の [Auth0 for AI Agents](https://a0.to/ai-content) と [Auth0 FGA](https://fga.dev/) を使用して、LangChain ベースの RAG アプリケーションを保護する方法を紹介しました。Auth0 FGA は、オープンソースである OpenFGA に基づいて構築されています。[GitHub 上の OpenFGA コード](https://a0.to/fga_repo)も確認ください。

さらに、[LlamaIndex](https://www.llamaindex.ai/)、[LangChain](https://www.langchain.com/)、[CrewAI](https://www.crewai.com/)、[Vercel AI SDK](https://sdk.vercel.ai/)、[GenKit](https://firebase.google.com/docs/genkit) のような優れた生成 AI フレームワークと協力し、より多くのコンテンツやサンプル アプリを開発中です。[Auth0 for AI Agents](https://auth0.com/blog/auth-for-genai/) は、生成 AI アプリケーションでユーザーの情報を保護するための Auth0 の製品です。詳細の確認や質問は、[Auth0 Lab Discord サーバー](http://a0.to/auth0-lab-discord)に参加ください。
