검색으로 강화된 생성 애플리케이션 구축

완료됨

RAG(검색 증강 세대)는 데이터와 상호 작용하는 AI 애플리케이션의 패턴입니다. RAG 애플리케이션은 학습 중에 대규모 언어 모델에 포함된 지식에만 의존하는 대신 데이터베이스에서 관련 정보를 동적으로 검색하여 AI 모델에 대한 컨텍스트로 제공합니다. 이 방법을 사용하면 언어 모델의 추론 기능을 사용하는 동안 응답이 현재 정확한 데이터에 기반을 두고 있습니다.

SQL Server 2025 는 RAG 애플리케이션을 빌드하고 벡터 검색 기능, 네이티브 AI 통합 및 엔터프라이즈급 데이터 관리를 결합하는 완벽한 플랫폼을 제공합니다. 이 통합 접근 방식은 여러 데이터베이스를 관리하거나, 시스템 간에 데이터를 동기화하거나, 보안 및 규정 준수를 손상시키지 않고 AI 애플리케이션을 빌드할 수 있습니다.

RAG는 실시간 데이터 검색을 사용하여 모델 응답을 보강하여 정적 AI 모델의 제한 사항(지식 차단 날짜, 잘못된 정보 및 도메인별 정보 부족)을 해결합니다. 개발자의 경우 이는 사용되는 데이터 원본에 대한 모든 권한을 유지하면서 정확하고 상황에 맞는 up-to-date 답변을 제공하는 애플리케이션을 빌드하는 것을 의미합니다.

RAG 패턴 이해

RAG 패턴은 기존 데이터베이스 작업과 AI 기능을 결합하는 체계적인 워크플로를 따릅니다.

RAG 워크플로 살펴보기

RAG 패턴은 데이터베이스, AI 모델 및 애플리케이션 사용자 간의 상호 작용을 오케스트레이션합니다. 이 워크플로를 이해하는 것은 정확하고 상황에 맞는 응답을 제공하는 AI 기반 애플리케이션을 빌드하는 데 중요합니다. Microsoft의 Azure OpenAI 설명서에서 다음 다이어그램은 RAG 시스템의 여러 구성 요소가 함께 작동하는 방법을 보여 줍니다.

데이터 수집, 개발 및 유추 단계를 보여 주는 검색 보강된 생성 워크플로를 보여 주는 다이어그램

다이어그램은 수집 (검색 가능한 인덱스에 데이터 업로드 및 포함), 개발 (프롬프트 및 검색 의도를 사용하여 애플리케이션 만들기), 유추 (의도 생성, 검색, 여과/재전송 및 응답 생성을 통한 사용자 프롬프트 처리)의 3단계 RAG 워크플로를 보여 줍니다.

이 패턴은 응답 생성을 위해 언어 모델로 전송되기 전에 SQL Server에 데이터를 저장하고 검색하는 SQL Server 2025 RAG 구현에 적용됩니다.

일반적인 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
CREATE VECTOR INDEX idx_knowledge_embedding ON knowledge_base(embedding);

이 표에서는 원본 콘텐츠와 해당 벡터 포함을 모두 저장합니다. 벡터 인덱스를 사용하면 사용자가 기술 자료를 쿼리할 때 빠른 유사성 검색이 가능합니다.

임베딩 생성 및 저장

문서를 삽입하고 단일 작업에서 임베딩을 생성합니다.

-- 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를 벡터 저장소로 사용할 수 있습니다.

비고

SQL Server 벡터 기능과 LangChain 통합은 미리 보기로 제공됩니다. 패키지 이름, 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 는 SQL Server의 벡터 검색 기능을 보완하는 고급 검색 기능을 제공합니다.

하이브리드 검색은 벡터 기반 의미 체계 검색과 기존 키워드 기반 전체 텍스트 검색의 장점을 결합합니다. 벡터 검색은 정확한 단어가 일치하지 않는 경우에도 개념적으로 유사한 콘텐츠를 찾는 데 탁월하며 전체 텍스트 검색은 정확한 용어 및 도메인별 구를 캡처합니다. 이 조합은 의미 체계적으로 관련이 있고 사용자가 요청하는 특정 용어를 포함하는 문서를 검색하여 보다 정확하고 포괄적인 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;

SQL Server에서 데이터를 끌어오도록 Azure Portal 또는 REST API를 통해 Azure AI Search 인덱서 구성을 통해 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 애플리케이션을 빌드할 수 있습니다.