取得拡張生成アプリケーションを構築する
取得拡張生成 (RAG) は、データと対話する AI アプリケーションのパターンです。 RAG アプリケーションは、トレーニング中に大規模な言語モデルに埋め込まれた知識のみに依存するのではなく、データベースから関連情報を動的に取得し、それを AI モデルのコンテキストとして提供します。 このアプローチにより、言語モデルの推論機能を使用しながら、応答が現在の正確なデータに確実に取り込まれます。
SQL Server 2025 は、ベクター検索機能、ネイティブ AI 統合、エンタープライズ レベルのデータ管理を組み合わせた RAG アプリケーションを構築するための完全なプラットフォームを提供します。 この統合アプローチは、複数のデータベースを管理したり、システム間でデータを同期したり、セキュリティとコンプライアンスを損なうことなく、AI アプリケーションを構築できることを意味します。
RAG は、モデルの応答をリアルタイムのデータ取得で強化することで、静的 AI モデルの制限 (ナレッジ カットオフ日、不適切な情報、ドメイン固有の情報の不足) に対処します。 開発者にとって、これは、使用されるデータソースを完全に制御しつつ、正確で文脈に適した最新の回答を提供するアプリケーションを構築することを意味します。
RAG パターンを理解する
RAG パターンは、従来のデータベース操作と AI 機能を組み合わせた体系的なワークフローに従います。
RAG ワークフローを調べる
RAG パターンは、データベース、AI モデル、およびアプリケーション ユーザー間の相互作用を調整します。 このワークフローを理解することは、コンテキストに応じた正確な応答を提供する AI を利用したアプリケーションを構築するために重要です。 Microsoft の Azure OpenAI ドキュメントの次の図は、RAG システムのさまざまなコンポーネントがどのように連携するかを示しています。
この図は、 取り込み (検索可能なインデックスへのデータのアップロードと埋め込み)、 開発 (プロンプトと検索意図を使用したアプリケーションの作成)、 推論 (意図の生成、取得、フィルター/再ランク付け、応答の生成によるユーザー プロンプトの処理) の 3 段階の RAG ワークフローを示しています。
このパターンは、SQL Server 2025 RAG 実装に適用されます。この実装では、応答生成のために言語モデルに送信される前に、データが SQL Server に格納および検索されます。
一般的な RAG 実装には、いくつかの重要な手順が含まれます。
- データ インジェスト: ソース ドキュメントまたはデータを SQL Server に格納する
- 埋め込み生成: AI モデルを使用してテキストをベクター埋め込みに変換する
- ベクター ストレージ: 埋め込みをリレーショナル データと共に格納する
- クエリ処理: ユーザーが質問をする場合は、クエリの埋め込みを生成します
- 類似性検索: ベクター検索を使用して最も関連性の高いドキュメントを検索する
- コンテキスト アセンブリ: 関連するドキュメントの完全なコンテンツを取得する
- プロンプトの構築: ユーザーの質問と関連するコンテキストを含むプロンプトを作成する
- AI 推論: 応答の生成のために言語モデル (GPT-4 など) にプロンプトを送信する
- 応答の配信: AI によって生成された回答をユーザーに返す
T-SQL を使用して基本的な RAG を実装する
SQL Server 2025 を使用すると、 T-SQL を使用してデータベース内で RAG アプリケーションを完全に構築できます。
ナレッジ ベースを準備する
まず、ドキュメントとその埋め込みを格納するテーブルを作成します。
CREATE TABLE knowledge_base (
doc_id INT IDENTITY(1,1) PRIMARY KEY,
title NVARCHAR(200),
content NVARCHAR(MAX),
category NVARCHAR(100),
created_date DATETIME2 DEFAULT GETDATE(),
embedding VECTOR(1536)
);
-- Create a vector index for efficient similarity search
-- NOTE: CREATE VECTOR INDEX is a preview feature in SQL Server 2025.
-- Enable it first: ALTER DATABASE SCOPED CONFIGURATION SET PREVIEW_FEATURES = ON;
CREATE VECTOR INDEX idx_knowledge_embedding ON knowledge_base(embedding);
このテーブルには、元のコンテンツとその ベクター 埋め込みの両方が格納されます。 ベクター インデックスを使用すると、ユーザーがナレッジ ベースに対してクエリを実行するときに、高速な類似性検索が可能になります。
埋め込みを生成して格納する
ドキュメントを挿入し、1 回の操作で埋め込みを生成します。
-- Insert a document with embedding generation
DECLARE @content NVARCHAR(MAX) = N'SQL Server 2025 introduces native vector support for AI applications. Developers can store high-dimensional embeddings alongside relational data and perform semantic similarity searches using the VECTOR_DISTANCE function.';
INSERT INTO knowledge_base (title, content, category, embedding)
VALUES (
N'SQL Server 2025 Vector Support',
@content,
N'Product Features',
AI_GENERATE_EMBEDDINGS(@content USE MODEL Ada2Embeddings)
);
このコードは、ドキュメントを挿入し、前に定義した外部モデルを使用してその 埋め込みを 自動的に生成します。 埋め込みはソース テキストと同じ行に格納され、データの一貫性が確保されます。
セマンティック検索の実行
ユーザーのクエリに基づいて関連するドキュメントを取得します。
-- User's question
DECLARE @user_query NVARCHAR(MAX) = N'How do I use vectors in SQL Server?';
-- Generate embedding for the query
DECLARE @query_embedding VECTOR(1536) = AI_GENERATE_EMBEDDINGS(@user_query USE MODEL Ada2Embeddings);
-- Find top 5 most relevant documents
SELECT TOP 5
doc_id,
title,
content,
category,
VECTOR_DISTANCE('cosine', @query_embedding, embedding) AS relevance_score
FROM knowledge_base
ORDER BY relevance_score;
このクエリでは、ベクター埋め込みを比較することで、ユーザーの質問と意味的に似たドキュメントを検索します。
VECTOR_DISTANCE関数は類似性を計算し、スコアが低いほど関連性が高いことを示します。
コンテキストを使用してプロンプトを作成する
取得したコンテキストを含むプロンプトを作成します。
DECLARE @user_query NVARCHAR(MAX) = N'How do I use vectors in SQL Server?';
DECLARE @query_embedding VECTOR(1536) = AI_GENERATE_EMBEDDINGS(@user_query USE MODEL Ada2Embeddings);
-- Retrieve relevant context
DECLARE @context NVARCHAR(MAX);
SELECT @context = STRING_AGG(
CONCAT('Document: ', title, CHAR(10), 'Content: ', content, CHAR(10), CHAR(10)),
''
)
FROM (
SELECT TOP 3
title,
content,
VECTOR_DISTANCE('cosine', @query_embedding, embedding) AS score
FROM knowledge_base
ORDER BY score
) AS relevant_docs;
-- Construct the prompt
DECLARE @prompt NVARCHAR(MAX) = CONCAT(
'You are a helpful assistant. Use the following context to answer the user''s question.',
CHAR(10), CHAR(10),
'Context:', CHAR(10),
@context,
CHAR(10),
'Question: ', @user_query,
CHAR(10),
'Answer:'
);
SELECT @prompt AS constructed_prompt;
このコードは、最も関連性の高い上位 3 つのドキュメントを取得し、それらをコンテキスト文字列に連結し、質問に回答するときに提供されたコンテキストを使用するように AI モデルに指示する完全なプロンプトを作成します。
AI 応答を生成する
構築されたプロンプトを言語モデルに送信します。
-- Build the chat completion request
DECLARE @chat_request NVARCHAR(MAX) = JSON_OBJECT(
'messages': JSON_ARRAY(
JSON_OBJECT('role': 'system', 'content': 'You are a helpful assistant that answers questions based on provided context.'),
JSON_OBJECT('role': 'user', 'content': @prompt)
),
'max_tokens': 500,
'temperature': 0.7
);
DECLARE @response NVARCHAR(MAX);
-- Call GPT-4
EXEC sp_invoke_external_rest_endpoint
@url = N'https://myopenai.openai.azure.com/openai/deployments/gpt-4/chat/completions?api-version=2024-02-15-preview',
@method = 'POST',
@credential = [MyAzureOpenAICredential],
@payload = @chat_request,
@response = @response OUTPUT;
-- Extract and display the answer
SELECT JSON_VALUE(@response, '$.result.choices[0].message.content') AS ai_answer;
これにより、コンテキストを含むプロンプトを GPT-4 に送信し、生成された回答を返すことで RAG パターンが完了します。 AI モデルでは、取得したコンテキストを使用して、正確なデータベースの応答を提供します。
LangChain との統合
LangChain は、大規模な言語モデルを使用してアプリケーションを構築するための一般的なフレームワークです。 SQL Server 2025 では、LangChain 統合がサポートされており、LangChain アプリケーションで SQL Server をベクター ストアとして使用できます。
注
LangChain と SQL Server ベクター機能の統合はプレビュー段階です。 パッケージ名、API、実装の詳細が変更される可能性があります。 SQL Server ベクター ストアのサポートに関する最新情報については、 LangChain のドキュメント を参照してください。
SQL Server を使用して LangChain を設定する
必要なパッケージをインストールします。
# Install LangChain SQL Server connector (preview)
# Package names may vary - check documentation for latest
pip install langchain-sqlserver
pip install langchain-openai
SQL Server への接続を構成します。
from langchain_sqlserver import SQLServerVectorStore
from langchain_openai import OpenAIEmbeddings, AzureChatOpenAI
from langchain.chains import RetrievalQA
# Configure Azure OpenAI
embeddings = OpenAIEmbeddings(
deployment="text-embedding-ada-002",
model="text-embedding-ada-002",
azure_endpoint="https://myopenai.openai.azure.com",
api_key="your-api-key"
)
# Connect to SQL Server vector store
vector_store = SQLServerVectorStore(
connection_string="Driver={ODBC Driver 18 for SQL Server};Server=myserver;Database=mydb;Trusted_Connection=yes;",
embedding_function=embeddings,
table_name="knowledge_base",
vector_column_name="embedding"
)
この Python コードは、LangChain と SQL Server データベース間の接続を確立し、RAG アプリケーションのベクター ストアとして SQL Server を使用できるようにします。
LangChain を使用して RAG チェーンを構築する
完全な質問に答えるシステムを作成します。
# Initialize the language model
llm = AzureChatOpenAI(
deployment_name="gpt-4",
azure_endpoint="https://myopenai.openai.azure.com",
api_key="your-api-key"
)
# Create a retrieval QA chain
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vector_store.as_retriever(search_kwargs={"k": 3})
)
# Ask a question
question = "How do I use vectors in SQL Server?"
answer = qa_chain.run(question)
print(answer)
これにより、LangChain が SQL Server から関連するドキュメントを自動的に取得し、プロンプトを構築し、言語モデルを呼び出し、回答を返す RAG パイプラインが作成されます。そのすべてが、わずか数行のコードで返されます。
セマンティック カーネルと統合する
セマンティック カーネル は、AI 機能をアプリケーションに統合するための Microsoft のオープンソース SDK です。 SQL Server 2025 ではセマンティック カーネル統合がサポートされており、AI アプリケーションで SQL Server をベクター ストアとして使用できます。
注
セマンティック カーネルと SQL Server ベクター機能の統合はプレビュー段階です。 パッケージ名、API、実装の詳細が変更される可能性があります。 SQL Server ベクター ストアのサポートに関する最新情報については、 セマンティック カーネルのドキュメント を参照してください。
SQL Server を使用してセマンティック カーネルを構成する
C# で接続を設定します。
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.SqlServer;
using Microsoft.SemanticKernel.Connectors.OpenAI;
// Build the kernel
var builder = Kernel.CreateBuilder();
// Add Azure OpenAI chat completion
builder.AddAzureOpenAIChatCompletion(
deploymentName: "gpt-4",
endpoint: "https://myopenai.openai.azure.com",
apiKey: "your-api-key"
);
// Add SQL Server vector store (preview - API may change)
builder.AddSqlServerVectorStore(
connectionString: "Server=myserver;Database=mydb;Trusted_Connection=True;",
tableName: "knowledge_base",
vectorColumnName: "embedding"
);
var kernel = builder.Build();
これにより、SQL Server をベクター ストアとして使用し、言語モデルの推論に Azure OpenAI を使用するようにセマンティック カーネルが構成されます。
セマンティック カーネルを使用して RAG を実装する
RAG を利用したプラグインを作成します。
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Memory;
public class KnowledgeBasePlugin
{
private readonly ISemanticTextMemory _memory;
public KnowledgeBasePlugin(ISemanticTextMemory memory)
{
_memory = memory;
}
[KernelFunction]
[Description("Answers questions based on the knowledge base")]
public async Task<string> AskQuestion(
[Description("The user's question")] string question)
{
// Search for relevant documents
var results = _memory.SearchAsync("knowledge_base", question, limit: 3);
// Build context from retrieved documents
var context = new StringBuilder();
await foreach (var result in results)
{
context.AppendLine($"Document: {result.Metadata.Text}");
context.AppendLine();
}
// The kernel will automatically use this context with the LLM
return context.ToString();
}
}
このプラグインは、SQL Server ベクター ストアを検索し、応答を生成するための言語モデルに関連するコンテキストを提供します。
Azure AI Search との統合
Azure AI Search には、SQL Server のベクター検索機能を補完する高度な検索機能が用意されています。
Azure AI Search を使用してハイブリッド検索を構成する
ハイブリッド検索は、ベクターベースのセマンティック検索と従来のキーワードベース のフルテキスト検索の両方の長所を組み合わせたものです。 ベクター検索は、正確な単語が一致しない場合でも概念的に似たコンテンツを見つけるのに優れていますが、フルテキスト検索では正確な用語とドメイン固有のフレーズがキャプチャされます。 この組み合わせは、意味的に関連性があり、ユーザーが尋ねる特定の用語を含むドキュメントを確実に取得し、より正確で包括的な AI 応答につながるため、RAG アプリケーションにとって非常に重要です。
SQL Server から Azure AI Search にデータを同期するようにインデクサーを設定します。
-- Enable Change Tracking on your table
ALTER DATABASE mydb SET CHANGE_TRACKING = ON;
ALTER TABLE knowledge_base ENABLE CHANGE_TRACKING;
Azure portal または REST API を使用して Azure AI Search インデクサー を構成し、SQL Server からデータをプルし、SQL Server のトランザクション機能と Azure AI Search の高度なテキスト分析の両方を使用できるようにします。
ベクター検索とフルテキスト検索の組み合わせ
ハイブリッド検索戦略を実装します。
DECLARE @user_query NVARCHAR(MAX) = N'machine learning with SQL Server';
DECLARE @query_embedding VECTOR(1536) = AI_GENERATE_EMBEDDINGS(@user_query USE MODEL Ada2Embeddings);
-- Hybrid search combining vector similarity and full-text search
SELECT
kb.doc_id,
kb.title,
kb.content,
VECTOR_DISTANCE('cosine', @query_embedding, kb.embedding) AS vector_score,
fts.RANK AS text_score,
-- Combined score (weighted average)
(VECTOR_DISTANCE('cosine', @query_embedding, kb.embedding) * 0.5) +
((1.0 - fts.RANK/1000.0) * 0.5) AS combined_score
FROM knowledge_base kb
INNER JOIN CONTAINSTABLE(knowledge_base, content, @user_query) fts
ON kb.doc_id = fts.[KEY]
ORDER BY combined_score;
このクエリは、セマンティック類似性 (ベクター検索) とキーワード マッチング (フルテキスト検索) を組み合わせて、概念的一致と完全一致の両方をキャプチャする関連する結果を提供します。
運用環境に対応した RAG アプリケーションを構築する
プロトタイプから運用環境に移行するには、パフォーマンス、信頼性、保守容易性に関する追加の考慮事項が必要です。
埋め込み生成を最適化する
複数のドキュメントの埋め込みを効率的に生成します。
-- Update embeddings for documents that don't have them yet
-- Note: AI_GENERATE_EMBEDDINGS executes once per row, not as a batch operation
UPDATE knowledge_base
SET embedding = AI_GENERATE_EMBEDDINGS(content USE MODEL Ada2Embeddings)
WHERE embedding IS NULL;
-- For large-scale operations, process in smaller batches to avoid long transactions
DECLARE @batch_size INT = 100;
WHILE EXISTS (SELECT 1 FROM knowledge_base WHERE embedding IS NULL)
BEGIN
-- Update a limited number of rows at a time
UPDATE TOP (@batch_size) knowledge_base
SET embedding = AI_GENERATE_EMBEDDINGS(content USE MODEL Ada2Embeddings)
WHERE embedding IS NULL;
-- Optional: Add a small delay to avoid overloading the API endpoint
WAITFOR DELAY '00:00:01';
END;
このアプローチでは、管理可能なバッチに埋め込みを処理し、トランザクション ロック時間を短縮し、大規模なドキュメント コレクションの進行状況を監視できます。
キャッシュ戦略を実装する
よく寄せられる質問とその回答をキャッシュします。
CREATE TABLE query_cache (
cache_id INT IDENTITY(1,1) PRIMARY KEY,
query_text NVARCHAR(500),
query_embedding VECTOR(1536),
response_text NVARCHAR(MAX),
created_date DATETIME2 DEFAULT GETDATE(),
hit_count INT DEFAULT 0,
INDEX idx_query_embedding (query_embedding)
);
-- Check cache before executing full RAG pipeline
DECLARE @user_query NVARCHAR(MAX) = N'What are vectors?';
DECLARE @query_embedding VECTOR(1536) = AI_GENERATE_EMBEDDINGS(@user_query USE MODEL Ada2Embeddings);
DECLARE @cached_response NVARCHAR(MAX);
-- Look for similar cached queries
SELECT TOP 1 @cached_response = response_text
FROM query_cache
WHERE VECTOR_DISTANCE('cosine', @query_embedding, query_embedding) < 0.05
ORDER BY VECTOR_DISTANCE('cosine', @query_embedding, query_embedding);
IF @cached_response IS NOT NULL
BEGIN
-- Return cached response
SELECT @cached_response AS answer;
-- Increment hit count
UPDATE query_cache
SET hit_count = hit_count + 1
WHERE response_text = @cached_response;
END
ELSE
BEGIN
-- Execute full RAG pipeline
-- ... (RAG code here)
-- Cache the new response
INSERT INTO query_cache (query_text, query_embedding, response_text)
VALUES (@user_query, @query_embedding, @generated_response);
END;
クエリ キャッシュでは、同様の質問に対する回答を再利用することで、コストが削減され、応答時間が向上します。
大きなドキュメントのチャンク処理
大きなドキュメントを管理可能なチャンクに分割する:
-- Use AI_GENERATE_CHUNKS for text splitting
DECLARE @large_document NVARCHAR(MAX) = N'... very long document content ...';
-- Generate chunks with AI_GENERATE_CHUNKS
-- The function splits text into fixed-size character chunks
INSERT INTO knowledge_base (title, content, embedding)
SELECT
CONCAT('Document Chunk ', c.chunk_order),
c.chunk,
AI_GENERATE_EMBEDDINGS(c.chunk USE MODEL Ada2Embeddings)
FROM AI_GENERATE_CHUNKS(
source = @large_document,
chunk_type = FIXED,
chunk_size = 512 -- Size in characters (not tokens)
) AS c;
分割処理により、取得されたコンテキストがトークンの制限内に収まり、取得された文章の関連性が向上します。
RAG のベスト プラクティスを適用する
効果的な RAG 実装については、次のガイドラインに従ってください。
| カテゴリ | 練習 | Description |
|---|---|---|
| 効果的なプロンプトを設計する | 具体的にする | 指定されたコンテキストのみを使用するようにモデルに明確に指示する |
| 制約の追加 | 情報がコンテキストに含まれていない場合にモデルが許可する必要があることを指定する | |
| 例を含める | 必要な応答形式の少数の例を提供する | |
| トーンを設定する | アシスタントのペルソナとコミュニケーション スタイルを定義する | |
| 取得パラメーターを調整する | k 値を調整する | さまざまな数のドキュメントを取得する実験 (通常は 3 ~ 5) |
| 類似性のしきい値を設定する | 関連性スコアのしきい値を下回るドキュメントを除外する | |
| バランスの精度と再現率 | ユース ケースに適したトレードオフを見つける | |
| さまざまなクエリを使用してテストする | さまざまな質問の種類で取得が機能することを確認する | |
| データ品質を確保する | ソース ドキュメントのクリーンアップ | ノイズ、書式設定の問題、および無関係なコンテンツを削除する |
| 定期的に更新する | ソース ドキュメントが変更されたときに埋め込みを更新する | |
| 埋め込みを検証する | 埋め込みによってコンテンツが正確に表されていることを確認する | |
| ドリフトを監視する | 取得品質が時間の経過と同時に低下するかどうかを追跡する | |
| セキュリティで保護された RAG アプリケーション | データ アクセスの制御 | 行レベルのセキュリティを使用して、ユーザーが取得できるドキュメントを制限する |
| AI 操作の監査 | コンプライアンスに関するすべてのクエリと応答をログに記録する | |
| 入力をサニタイズする | インジェクション攻撃を防ぐためにユーザー クエリを検証してクリーンアップする | |
| API キーを保護する | マネージド ID とセキュリティで保護された資格情報ストレージを使用する |
これらのプラクティスに従い、SQL Server 2025 の統合 AI 機能を適用することで、正確でコンテキストに応じた安全な AI を利用したエクスペリエンスを提供する運用対応の RAG アプリケーションを構築できます。