

# Amazon Nova로 사용자 지정 RAG 시스템 구축
<a name="rag-building"></a>

**참고**  
Amazon Nova Premier는 아직 [RetrieveAndGenerate](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent-runtime_RetrieveAndGenerate.html) API를 통해 사용할 수 없습니다. Amazon Nova Premier에서 [RetrieveAndGenerate](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent-runtime_RetrieveAndGenerate.html) API를 사용하려면 [RetrieveAndGenerate](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent-runtime_RetrieveAndGenerate.html) API를 직접 호출할 때 사용자 지정 프롬프트를 제공해야 합니다. 이는 아래와 같이 [RetrieveAndGenerate](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent-runtime_RetrieveAndGenerate.html) API 직접 호출의 `generationConfiguration` 인수에 `promptTemplate`을 제공하여 수행됩니다.  

```
'generationConfiguration': {
                        'promptTemplate': {
                            'textPromptTemplate': promptTemplate
                        }
                    }
```
사용자 지정 프롬프트 템플릿을 빌드하려면 [prompting guidance for RAG](https://docs.aws.amazon.com/nova/latest/userguide/prompting-tools-rag.html)를 참조하세요.

Amazon Nova 모델을 사용자 지정 텍스트 RAG 시스템 내의 LLM으로 사용할 수 있습니다. Amazon Nova로 자체 RAG 시스템을 구축하려면 지식 기반을 직접 쿼리하도록 RAG 시스템을 구성하거나 지식 기반을 에이전트와 연결할 수 있습니다(자세한 내용은 [Amazon Nova로 AI 에이전트 구축](agents.md) 참조).

RAG 시스템 내에서 Amazon Nova를 사용하는 경우 두 가지 일반적인 접근 방식이 있습니다.
+ **리트리버를 도구로 사용**(권장): Converse API 또는 Invokemodel API의 ToolParameter에서 도구로 사용할 리트리버를 정의할 수 있습니다. 예를 들어 Bedrock [Retrieve API](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent-runtime_Retrieve.html) 또는 기타 리트리버를 ‘도구‘로 정의할 수 있습니다.
+ **RAG 시스템에 사용자 지정 지침 사용:** 사용자 지정 RAG 시스템을 구축하기 위해 사용자 지정 지침을 정의할 수 있습니다.

**리트리버를 도구로 사용**

모델이 리트리버를 간접적으로 호출할 수 있도록 허용하는 도구를 정의합니다. 도구의 정의는 `toolConfig`([ToolConfiguration](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ToolConfiguration.html)) 요청 파라미터에서 `Converse` 작업에 전달하는 JSON 스키마입니다.

```
{
    "tools": [
        {
            "toolSpec": {
                "name": "Retrieve information tool",
                "description": "This tool retrieves information from a custom database",
                "inputSchema": {
                    "json": {
                        "type": "object",
                        "properties": {
                            "query": {
                                "type": "string",
                                "description": "This is the description of the query parameter"
                            }
                        },
                        "required": [
                            "query"
                        ]
                    }
                }
            }
        }
    ]
}
```

도구가 정의된 후 Converse API에서 도구 구성을 파라미터로 전달할 수 있습니다.

**응답 요소를 해석하는 방법**

모델이 리트리버 도구를 사용하지 않기로 선택한 경우 어시스턴트 ‘역할‘에서 콘텐츠 유형이 ‘toolUse‘이고 컨텍스트 유형이 ‘text‘인 JSON으로 모델로부터 응답을 받게 됩니다. 모델이 리트리버 도구를 사용하기로 선택하면 응답은 도구(tool\_name)를 식별합니다. 요청한 도구를 어떻게 사용해야 하는지에 대한 정보는 모델이 `output`([ConverseOutput](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ConverseOutput.html)) 필드에 반환하는 메시지에 있습니다. 구체적으로는 `toolUse`([ToolUseBlock](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ToolUseBlock.html)) 필드입니다. `toolUseId` 필드를 사용하여 이후의 직접 호출에서 도구 요청을 식별합니다.

```
{
    "output": {
        "message": {
            "role": "assistant",
            "content": [
                {
                    "toolUse": {
                        "toolUseId": "tooluse_1234567",
                        "name": "Retrieve information tool",
                        "input": {
                            "query": "Reformatted user query" #various arguments needed by the chosen tool
                        }
                    }
                }
            ]
        }
    },
    "stopReason": "tool_use"
}
```

모델 응답의 `toolUse` 필드에서 `name` 필드를 사용하여 도구의 이름을 식별할 수 있습니다. 그런 다음 도구 구현을 직접적으로 호출하고 `input` 필드에서 입력 파라미터를 전달합니다.

**검색된 콘텐츠를 Converse API에 다시 입력하는 방법**

검색된 결과를 Amazon Nova로 다시 실행하려면 이제 사용자 역할 내에 `toolResult`([ToolResultBlock](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ToolResultBlock.html)) 콘텐츠 블록이 포함된 도구 블록 메시지를 구성할 수 있습니다. 콘텐츠 블록에 도구의 응답과 이전 단계에서 받은 도구 요청의 ID를 포함합니다.

```
{
    "role": "user",
    "content": [
        {
            "toolResult": {
                "toolUseId": "tooluse_1234567",
                "content": [
                    {
                        "json": {
                            "Text chunk 1": "retrieved information chunk 1",
                            "Text chunk 2": "retrieved information chunk 2"
                        }
                    }
                ],
                "status": "success | error"
            }
        }
    ]
}
```

[toolResult](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ToolResultBlock.html)에는 ‘text‘, ‘JSON‘ 및 ‘image‘(사용된 모델에 따라 다름)를 포함할 수 있는 ‘content‘가 있을 수 있습니다. 존재하지 않거나 잘못된 인수를 요청하는 등 도구에서 오류가 발생하면 `toolResult` 필드에서 모델에 오류 정보를 전송할 수 있습니다. 오류를 표시하려면 `status` 필드에 `error`를 지정합니다.