AISmarteasy – 시맨틱 커널 포크로 개발하기 5 – Worker

지금의 ai 애플리케이션은 생성형ai가 기본이므로 text로 질의(query) 응답이나 생성(generate)을 할 수 있어야 한다.  질의 응답도 응답을 생성하는 거니 text 생성이지만, 사용자가 ai 애플리케이션을 사용하는 이유를 크게 이 둘로 나눌 수 있으니 query를 분리 시켜 다루기로 하자.

ai 애플리케이션에서 사용자가 원하는 것을 처리하는 역할을 Worker(작업자)라 하자.

작업자는 질의 응답이나 생성을 위해 자연어 text를 생성하는 llm가 연동되어야 한다. llm의 태생적 한계로 llm과 연동되는 ai 애플리케이션에는 llm 외부에서 데이터를 가져올 수 있는 rag(Retrieval-Augmented Generation)가 요구된다.  훈련 되지 않은 기업이나 개인의 내부 데이터나 llm 훈련 이후에 등장한 데이터는 관리되어 필요할 때 사용되어야 한다. 시맨틱 커널은 이런 데이터 관리를 ai 애플리케이션이 기억해야 하는 것으로 memory라고 한다. 이름 참 잘 정한다.

단기 기억해야 하는 것도 있고 장기 기억해야 하는 것도 있다. llm은 언어 모델이니 데이터 기억에도 언어적인 면이 잘 반영되어야 한다. ai가 언어 데이터를 잘 다루는 방식으로 임베딩(embedding)이 있고, 이를 지원하는 데이터베이스로 벡터 데이터베이스(Vector Database)가 등장했다. 임베딩은 언어 데이터를 다루는 것이니 llm가 연동되어야 한다.

 

질의 응답이나 생성하는 작업자를 InstructionWorker라 하고, 메모리를 다루는 작업자를 MemoryWorker라 하고, 임베딩 하는 작업자를 EmbeddingWorker라 하자. 둘 다 자신의 일을 처리하려면 llm과 연동이 필요해야 하니 이들의 상위 개념으로 LLMWorker를 두자.

instruction worker가 작업하려면 memory를 다뤄야 한다. memory worker를 가져야 한다.

memory를 다루려면 임베딩을 할 수 있어야 한다. memory worker는 embedding worker를 가져야 한다.

 

단기 메모리는 휘발성 메모리를 사용할 수 있지만, 장기 메모리 데이터는 vector database가 좋다. 안 되면 파일로 저장한다. 벡터 데이터 베이스를 공급하는 벤더들은 여럿이니 벤더에 따라 커넥터를 작성하자.

 

지시할 때는 뭘 할지 상세하게 지시 할 수도, 뭘 할 지 목표만 주고 알아서 하도록 할 수도 있다. 목표만 주면 작업자가 알아서 어떻게 할 지 계획하고 계획을 실행해야 한다. 목표만 주고 지시를 처리하도록 하는 것을 알아서 한다는 의미를 주고 보통 agent라고 한다. 시맨틱 커널은 계획을 세우고 실행하는데 강조 점을 두어 planner라고 한다.

InstructionWorker는 이에 대해 지원해야 한다. AI로 하는 일의 기본은 Instruction.

 

요즘 ai 모델 공급자들은 텍스트 지원에서  끝나지 않고, 음성이나 이미지를 다룰 수 있는 모델을 가지고 이에 대한 api 또한 지원하고 있다. 이런 분위기이다 보니, ai 애플리케이션이 이를 당연히 지원하는 것이 되고 있다.

ai 모델 벤더들은 ai 서비스로 텍스트 뿐만 아니라 음성, 이미지 관련 ai 서비스를 제공하고 있고 비디오 부분을 지원하는 벤더도 있다.  이미지나 비디오 부분은 기존 ai 영역 개념을 가져다 비전(vision)이라고 하고 있다. 텍스트나 음성이나 비전이나 그것이 담고 있는 내용(의미)를 전달하고자 한다. 수단만 다르다. 이를 멀티모달이라 한다.

ai 서비스를 구분해 보면 다음과 같이 구분할 수 있다.
– Embedding
– TextCompletion,
– SpeechToText,
TextToSpeechSpeed,
TextToSpeechQuality,
– ImageGeneration,
– Vision

 

instruction worker에 뭘 하라고 요청할 때, ai 모델 공급자들은 모달에 따라 다른 ai 모델을 사용하기 때문에, 어떤 ai service를 사용할 지 지정해 주어야 한다.  멀티모달을  지원하고 하나의 모델이 개별로 할 때 보다 더 잘한다는 게 증명되면 이런 과정이 없어지겠지.

 

음성을 다루는 작업자와 이미지 생성을 다루는 작업자를 어떤 모달 – 의미를 전달하는 수단 – 을 사용하느냐에 따라 AudioWorker,  ImageWorker, VisionWorker라 하자.

이 모든 작업자들은 ai 애플리케이션 작업자이니 가장 상위 개념으로  AIWorker를 두자.

 

자연어 텍스트를 다루기 위한 llm이나, 음성이나 이미지를 다루는 ai 모델들이나, 벡터 데이터베이스와 연동되어 처리하는 역할을 Connector라 하자. worker는 connector를 통해 일을 하는 것이다.

ai 애플리케이션에 실제 적으로 요구되는 일은 모델이나 서비스를 제공하는 공급자가 api를 통해 제공한다. ai 모델 공급자의 서비스 api에 대한 접근은 ai 애플리케이션들에 공통적으로 요구하는 것이니 가장 먼저 개발되고, 개발 환경에 맞는 라이브러리(모듈)로 제공된다. 커넥터가 이런 라이브러리를 사용한다. 시맨틱 커널에서는 openai api와 연동을 지원하기 위한 라이브러리로 Azure.AI.OpenAI를 사용한다.

 

 

[Worker 계층]

AI Worker

  • LLMWorker
    • InstructionWorker, EmbeddingWorker, MemoryWorker
  • AudioWorker
  • ImageWorker
  • VisionWorker

 

[시나리오 예]

llm과 연동되어 사용자의 지시를 처리 해야 하는 ai 애플리케이션이 있다면,

지시를 처리하는 작업자인 InstructionWorker가 있다. open ai의 api를 사용한다면 이를 지원하는 라이브러리가 있어야 한다.  이 라이브러리와 연동하는 커넥터가 필요하다. 지시 처리를 위해 OpenAI의 text completion api와 연동이 필요하므로, OpenAITextCompletionConnector가 필요하다.

InstructionWorker가 질의 응답을 처리하기 위해 OpenAITextCompletionConnector에게 질의 응답을 요청하고,  OpenAITextCompletionConnector는 Azure.AI.OpenAI의 해당 역할을 사용해서 질의 응답을 요청해야 한다.

 

[RAG에 대해 좀 더]

Retrieval할 데이터를 구할 방법은
– 검색을 해야 하거나
– 벡터 데이터베이스에서 쿼리 하거나
– 웹 서비스나 애플리케이션 API를 통하거나
– 다양한 파일들을 통해서
이다.

 

rag를  하려면 llm과 연동되는 ai 애플리케이션은 뭘 해야 할까?

1. rag 해야 하는지 알아야 한다.

rag해야 하는 지 판단하라고 지시해야 한다. 이 지시가 프롬프트로 작성되어 llm에게 전달되어야 한다. llm이 자신의 데이터로만 답하기 어렵다면 어렵다고 해야 한다.

2. rag의 기본 소스는 벡터 데이터베이스로 하고, 벡터 데이터베이스 쿼리 결과를 기본 프롬프트에 포함해서 llm에 전달한다. llm이 스스로 답할 수 없음을 알리면 두 번째 소스로 검색 엔진에서 검색하고 그 결과를 포함한 프롬프트로 llm에게 지시한다.

3. 추가적인 rag 소스들이 있는 경우, rag 소스들에서 데이터를  구하고 그 결과를 포함한 프롬프트로 llm에게 지시한다.

추가적인 정보는 프롬프트에 보통 Context로 작성해서 제공한다.

 

검색 엔진을 사용하던 벡터 데이터베이스를 사용하던, 뭘 하든 Retrieval할 것에 접근해야 한다.  이런 역할을 Service라고 하자. 네이티브 함수의 가장 중요한 역할이 이런 서비스에 접근하는 것이다. Service는 실제 Retieval할 것을 사용한다. 실제 Retieval하는 역할을 시맨틱 커널에서는 Connector라고 한다.

 

[설계 결정]

– 프로젝트 분리

  • AISmarteasy.Core.Worker
  • AISmarteasy.Servic – 구체적인 벤더들이 제공하는 서비스((커넥터)들
  • AISmarteasy.Skill – Service를 사용하는 네이티브 함수들

– RAG

  • 벡터 데이터베이스는 파인콘만 지원
  • 검색 엔진은 구글만 지원
  • 파일은 pdf만 지원, 내용 데이터는 파인콘 벡터 데이터베이스에서 관리하도록

 

InstructionWorker의 query 기능 구현

기본 rag 소스를 벡터 데이터베이스로 하기로 했으니, query할 때 첫 번째 할 일은 벡터 데이터베이스에서 쿼리하고 그 결과를 query 프롬프트의 context에 포함하는 것이다. QuerySkill 플러그인의 WithVectorDatabase 시맨틱 함수를 작성한다.

 

QuerySkill – Default

BE BRIEF AND TO THE POINT, BUT WHEN SUPPLYING OPINION, IF YOU SEE THE NEED, YOU CAN BE LONGER.

[CONTEXT]
{{$context}}
[END CONTEXT]

Use the cotext to answer the following query:

Query: {{$input}}
Answer:

사용자 질의를 input 변수에, 벡터 데이터베이스 쿼리 결과를 context 변수에 담아 전달한다.

 

QuerySkill – WithSearchEngine

벡터 데이터베이스 쿼리 결과를  추가적으로 가지고 답할 수 있는지 없는지 llm이 판단해야 한다. 할 수 있다면 답변하고, 그렇지 않으면 검색이 필요하다고 답하도록 한다.

검색이 필요한 경우, “google.search”를 포함해서 응답하도록 다음 프롬프트를 사용한다.

Answer questions only when you know the facts or the information is provided.
When you don’t have sufficient information you reply with a list of commands to find the information needed.
When answering multiple questions, use a bullet point list.
Note: make sure single and double quotes are escaped using a backslash char.[COMMANDS AVAILABLE]
– google.search[EXAMPLE 1]
Question: what’s the biggest lake in Italy?
Answer: Lake Garda, also known as Lago di Garda.[EXAMPLE 2]
Question: what’s the biggest lake in Italy? What’s the smallest positive number?
Answer:
* Lake Garda, also known as Lago di Garda.
* The smallest positive number is 1.[EXAMPLE 3]
Question: what’s Ferrari stock price? Who is the current number one female tennis player in the world?
Answer:
{{ ‘{{‘ }} google.search “”what\\’s Ferrari stock price?”” {{ ‘}}’ }}.
{{ ‘{{‘ }} google.search “”Who is the current number one female tennis player in the world?”” {{ ‘}}’ }}.[END OF EXAMPLES][TASK]
Question: {{ $input }}.
Answer: “;

 

검색 결과를 context 변수 값에 포함한다. QuerySkill Default 함수를 다시 실행한다.

 

추가적인 rag 소스들이 있는 경우, 위 과정을 반복한다.

GPTVision(GPT-4 with Vision, GPT-4V라 하기로 함)은

OpenAI에서 개발한, 이미지에 대한 이해와 처리를 위해 훈련된, 주어진 이미지에 대해 답할 수 있는  gpt 모델 기반의 컴퓨터 비전 모델이다.

open ai는 이에 대한 ai 서비스를 api로 제공하고 있으니, instruction worker로 이와 관련된 기능을 지원할 수 있도록 하자. 지금 api로 사용할 수 있는 모델 이름은 gpt-4-vision-preview이다.

 

gptvision으로 컴퓨터 비전에서 했던 일들을 다 해 볼 수 있을 것 같다. 그것도 chat 방식으로.

chat하는 것이니, 사용자는 이미지와 텍스트를 전달하고, 이미지 가지고 어떤 처리를 할 지 텍스트 메시지를 작성하면 된다. 이걸 가지고 ai 서비스는 ai 모델로 부터 응답을 받아 전달 해 준다.

시맨틱 커널은 챗 메시지에 이미지를 담을 수 있도록 지원한다.

 

이미지는 이미지 링크나 base64 encode된 이미지로 전달될 수 있다. 시맨틱 커널은 지금은(2024.01) 원격에 있는 url 이미지만 지원하고 있다.

https://platform.openai.com/docs/guides/vision

About the Author
(주)뉴테크프라임 대표 김현남입니다. 저에 대해 좀 더 알기를 원하시는 분은 아래 링크를 참조하세요. http://www.umlcert.com/kimhn/

Leave a Reply

*