AI Research Topic/LLM

[Microsoft Azure] RAG 노드 구성하기

꾸준희 2024. 4. 26. 23:36
728x90
반응형

 

 

저번 블로그 글에서는 Microsoft Azure를 통해 Prompt Flow를 구성해보는 예제를 실행해보았다. 

이번에는 Cognitive search를 통해 Custom RAG 노드를 구성하는 방법에 대해 기록해보려고 한다. 

prompt flow github에 RAG 예제를 찾아봤는데 아직 예제 코드가 업로드 되기 전이라 직접 구성해보았다. 

 

 

0. Cognitive search connection 

 

먼저, RAG 노드를 구성하기 위해서는 Azure OpenAI, Cognitive search Connection 이 필요하다. (유료 리소스 플랜 필요)

 

 

api_key 와 api_base 그리고 name을 설정해주면 된다. 

api_key 및 api_base는 Microsoft Azure 계정에서 확인할 수 있다. 

 

 

 

1. Microsoft Azure에서 RAG 지식베이스 설정 및 등록하기 

 

RAG 노드를 구성하려면 내가 원하는 검색 결과를 나오게 하기 위해 지식베이스(= 데이터세트)를 설정하는 작업이 필요하다. 

내가 원하는 결과물이 나오도록 id, text, vector_text로 이루어진 csv 파일을 만들었다. (요즘은 이런것도 ChatGPT가 해주네?;;;;;) 

 

그 다음에 위 csv 데이터를 Microsoft Azure Search 서비스 > 검색관리 > 인덱서 에서 데이터를 등록해준다. 

 

 

 

그러면 아래와 같이 등록된 인덱스가 뜬다. 

여기서 한 번 삽질했던 내용은 targetIndexName을 올바르게 설정해주어야 데이터셋이 올바르게 적용되어 검색 결과가 잘 나오게 된다. 

(총 스토리지 크기가 올바른지 꼭 확인 할 것)

 

 

 

2. RAG 노드 구성을 위한 Input, Output 설정 

 

Input은 간단하게 question을 넣어주고, Output은 내가 설정한 파이썬 파일의 return 값인 string으로 설정해주었다. 

 

 

 

search_using_rag 파이썬 파일은 아래와 같이 설정해주었다. 

RAG 검색을 위해서는 Azure OpenAI Connection 및 Azure Search Connection이 필요하다. 

 

 

 

그러면 실행했을 때 Azure에 등록되어있는 사전 베이스 지식 (데이터세트)에 따라 검색한 결과를 출력해준다. 

 

 

3. RAG 노드 구현하기 

 

RAG 노드를 구성하기 위해서는 AzureOpenAIConnection, ConitiveSearchConnection을 활용해야한다. 

 

 

 

그 다음 OpenAI Embedding Deployment 및 ChatGPT Deployment를 설정해준다. 

나같은 경우엔 text-embedding-ada-002 및 gpt-35-turbo-16k를 사용했다. 

그 다음 Azure Search Index Name은 내가 사전에 Azure 상에서 설정한 인덱스의 이름으로 설정해야한다. 

여기서 인덱스 이름을 잘못 설정하게 되면 리소스를 못찾는다고 나오게되니 주의. 

 

 

 

RAG 노드는 간단히 아래와 같이 구성하였다. 

Input으로 question, chat_history, azure_open_ai_connection, azure_search_connection을 입력으로 받는다. 

output은 openai의 대답을 sentence로 받아 문장으로 출력하게 했다. 

 

 

 

여기서 이제 중요한건 _get_context 와 _rag 함수의 구성이다. 

_get_context 함수는 다음과 같이 구현하였다.

azure search index를 이용하여 질문과 관련된 context들을 모아온다. 

 

 

 

그 다음에 그 context를 가지고 _rag 함수를 통해 openai에게 질문에 대한 대답을 받아온다. 

이 때 jinja2 파일을 이용하게 된다.

jinja2 파일에 설정된 템플릿대로 context list들을 프롬프트로 만들어 openai 에게 질문하고, 그에 대한 대답을 받아오게 된다. 

 

 

 

 

4. RAG 검색 결과 확인하기 

 

처음에 실행해서 내가 입력한 Question이 제대로 들어갔는지 확인했다. 

 

 

그 다음에는 내가 질문한 내용에 맞는 관련된 지식들 (context)을 뽑아주게 된다. 총 3개까지 뽑게 설정했다. 

 

 

 

그랬더니 관련있는 지식들을 3개 (0에서부터 2까지) 뽑아주었다. 

 

 

 

사전 지식에 기반한 대답은 아래와 같이 만족스럽게 잘 나왔다.

심지어 { } 형태로 뽑아달라고 했고, { } 안에 형식을 지정해서 출력해달라고 했는데도 잘 나오는걸 확인 했다. 

 

 

 

최종 노드 형태는 굉장히 간단하게 구성되어있다. 

이렇게 search_using_rag 라는 간단한 노드를 하나 구성해놓으면, 다른 prompt flow에서 이 flow를 로드해서 사용할 수도 있다. 

 

 

 

예를 들면 이런식으로 가져올 수 있음. 

from promptflow.client의 load_flow를 import 한 다음,

아래와 같이 chat-basic(search_using_rag 노드가 있는 프로젝트 이름) flow를 불러오면 됨. 

 

 

728x90
반응형