데이터베이스 컨텍스트를 사용하여 프롬프트 보강
Tip
자세한 내용은 텍스트 및 이미지 탭을 참조하세요.
검색은 데이터를 가져옵니다. 그러나 자체적으로 JSON Blob은 다른 사람의 질문에 대답하지 않습니다. 고객이 자전거 페달 호환성에 대해 묻는 경우 데이터베이스에서 제품 정보를 얻었지만 이제 언어 모델에 무엇을 해야 하는지 알려야 합니다. 해당 단계는 RAG: 확대의 "A"를 나타냅니다.
채팅 메시지 구조 이해
모델별로 API가 다르지만 대부분의 채팅 기반 모델은 비슷한 패턴을 따릅니다. Azure OpenAI를 예제로 사용하지만 개념은 광범위하게 적용됩니다.
Azure OpenAI 채팅 모델은 역할이 있는 메시지를 기대합니다. 시스템 역할은 도우미의 동작 방식을 정의합니다. 사용자 역할에는 원래 질문과 모델이 답변을 접지해야 하는 데이터베이스 컨텍스트가 포함됩니다. 필요에 따라 도우미 역할은 다중 턴 대화에서 이전 응답을 보유할 수 있습니다. 프롬프트 구조의 간소화된 예는 다음과 같습니다.
{
"messages": [
{
"role": "system",
"content": "You are a helpful assistant that answers questions about products. Use only the provided context to answer. If the context doesn't contain enough information, say so."
},
{
"role": "user",
"content": "Context: {retrieved_data}\n\nQuestion: {user_question}"
}
]
}
이 예시에서, {retrieved_data}는 제품 쿼리로부터 작성된 JSON일 수 있으며, {user_question}는 "Mountain-500에 호환되는 페달은 무엇인가요?"와 같은 질문이 될 수 있습니다.
시스템 메시지는 기본 규칙을 설정합니다. 사용자 메시지는 데이터베이스 컨텍스트를 실제 질문과 결합합니다.
T-SQL의 빌드 프롬프트
애플리케이션 코드에서 이 JSON을 빌드할 수 있지만 데이터베이스에 모두 보관하는 것이 편리한 경우가 많습니다. 검색 쿼리, 컨텍스트 서식 및 프롬프트 생성이 함께 라이브로 진행되며 T-SQL JSON_OBJECT 과 JSON_ARRAY 함수는 JSON 서식 지정을 처리합니다.
DECLARE @userQuestion NVARCHAR(1000) = 'Which pedals are compatible with the Mountain-500?';
-- @context contains retrieved product data as JSON from the retrieval step
DECLARE @systemMessage NVARCHAR(MAX) = 'You are a customer service assistant for Adventure Works. Answer questions using only the provided product information. Be concise and helpful.';
DECLARE @userMessage NVARCHAR(MAX) = 'Product information: ' + @context + CHAR(10) + CHAR(10) + 'Customer question: ' + @userQuestion;
DECLARE @payload NVARCHAR(MAX) = JSON_OBJECT(
'messages': JSON_ARRAY(
JSON_OBJECT('role': 'system', 'content': @systemMessage),
JSON_OBJECT('role': 'user', 'content': @userMessage)
),
'max_tokens': 500,
'temperature': 0.7
);
이제 변수에 @payload Azure OpenAI API에 대해 준비된 전체 요청 본문이 포함됩니다.
데이터에 모델을 기반으로 두기
모델에게 데이터를 사실 판단의 기준으로 활용하도록 명령하는 것을 근거라고 부릅니다. 모델이 없으면 모델이 학습 데이터에 의존할 수 있으며, 이는 도메인에 대해 오래되었거나 잘못되었을 수 있습니다. Adventure Works 자전거 보증에 대해 묻는 고객은 인터넷에서 일반 보증 정보를 가져와서는 안 됩니다.
좋은 접지 지침은 범위를 설정하고("제공된 제품 데이터만 사용"), 정직을 장려하고("충분한 정보가 없는 경우 그렇게 말하십시오"), 형식을 지정할 수 있습니다("응답을 100단어 미만으로 유지"). 시스템 역할에 대한 예제는 다음과 같습니다.
DECLARE @systemMessage NVARCHAR(MAX) =
'You are an Adventure Works product expert. Follow these rules:
1. Answer only using the product information provided
2. Do not invent features or specifications
3. If information is missing, tell the customer you''ll need to check
4. Keep responses under 100 words
5. Suggest related products when relevant';
이러한 지침은 모델의 초점을 유지하고 유용하고 정확한 답변을 제공하는 데 도움이 됩니다.
컨트롤 모델 동작
요청 페이로드에는 모델이 응답을 생성하는 방법에 영향을 주는 몇 가지 매개 변수가 포함됩니다.
-
max_tokens는 응답 길이를 제한합니다. 자세한 제품 답변의 경우 500~1,000개는 잘 작동합니다. -
temperature는 0에서 2까지의 규모로 창의성을 제어합니다. 값이 0.3에서 0.5로 낮으면 보다 일관되고 사실적인 응답이 생성됩니다. 값이 높을수록 모델이 창의성을 발휘하게 하며, 일반적으로 RAG에는 이러한 창의성을 지양합니다.
토큰 및 온도를 제어하면 데이터가 접지될 때 모델이 예측 가능하게 동작하도록 할 수 있습니다.
전체 페이로드 생성
Adventure Works 테이블을 사용하여 제품 질문에 대한 RAG 프롬프트를 작성하는 방법은 다음과 같습니다.
DECLARE @userQuestion NVARCHAR(1000) = 'Which pedals are compatible with the Mountain-500?';
DECLARE @questionVector VECTOR(1536);
DECLARE @context NVARCHAR(MAX);
DECLARE @payload NVARCHAR(MAX);
-- Generate embedding for the question
SELECT @questionVector = AI_GENERATE_EMBEDDINGS(@userQuestion USE MODEL my_embedding_model);
-- Get product context using vector search
SET @context = (
SELECT TOP 3
p.Name AS ProductName,
p.Color,
p.Size,
pc.Name AS Category,
pm.Name AS Model
FROM Production.Product p
INNER JOIN Production.ProductSubcategory ps ON p.ProductSubcategoryID = ps.ProductSubcategoryID
INNER JOIN Production.ProductCategory pc ON ps.ProductCategoryID = pc.ProductCategoryID
INNER JOIN Production.ProductModel pm ON p.ProductModelID = pm.ProductModelID
ORDER BY VECTOR_DISTANCE('cosine', p.DescriptionVector, @questionVector)
FOR JSON PATH
);
-- Build the prompt
SET @payload = JSON_OBJECT(
'messages': JSON_ARRAY(
JSON_OBJECT(
'role': 'system',
'content': 'You are an Adventure Works product assistant. Use only the provided product data to answer questions.'
),
JSON_OBJECT(
'role': 'user',
'content': 'Product data: ' + @context + CHAR(10) + 'Question: ' + @userQuestion
)
),
'max_tokens': 500,
'temperature': 0.5
);
이제 변수에는 @payload 접지 지침, 검색된 제품 데이터 및 고객의 질문 등 모델에 필요한 모든 것이 포함됩니다. 모델 엔드포인트로 보내고 응답을 처리하기만 하면 됩니다.
주요 내용
프롬프트는 검색이 유용해지는 위치입니다. JSON 컨텍스트는 모델에서 사용 방법을 알려주지 않는 한 아무 의미가 없습니다. 모델이 데이터에 충실하도록 시스템 메시지에 명확한 접지 규칙을 설정합니다. 사실적인 답변을 위해 온도를 낮게 유지합니다. T-SQL에서 JSON_OBJECT 및 JSON_ARRAY을 사용하여 유효한 JSON 페이로드를 직접 빌드합니다.