AISmarteasy – 시맨틱 커널 포크로 개발하기 3 – Semantic Function
사용자는 ai 애플리케이션을 사용하고, ai 애플리케이션은 llm을 사용한다.
* 지금 ai는 llm 빼고는 할 말이 없다. ai 애플리케이션의 주된 일은 llm 서비스와 연동하는 것이다. llm에게 뭘 해 달라고 지시하고, 그 처리 결과를 받는 것이다. 그게 아닌 뭔가 해야 할 일이 있다면, 그것은 llm이 잘 할 수 있는데 스스로 좋은 상황을 만들지 못할 때 그 상황이 좀 더 나아지도록 도와 주는 것이다.
llm은 언어 모델이므로, ai 애플리케이션은 뭘 해 달라고 지시할 때 자연어를 사용해야 한다. 자연어로 작성된 llm에게 전달되는 자연어 지시를 llm 세계에서는 프롬프트라고 한다.
ai 애플리케이션은 llm을 사용해야 하고, llm에게 지시할 유일한 수단은 프롬프트이니, ai 애플리케이션은 프롬프트를 잘 다뤄야 한다. llm 연동 ai 애플리케이션 개발을 도와주는 개발 프레임워크도 이 부분에 중점을 둘 수 밖에 없다. 프롬프트를 잘 다루려다 보니 템플릿도 등장 시켰으니, 개발 프레임워크도 프롬프트 템플릿을 잘 다뤄줘야 한다.
llm은 할 수 있는 일을 잘 지시하면, 지시한 일을 잘 한다. 함수 관점으로 보면, ai 애플리케이션은 함수를 호출하는 것이고 llm은 함수를 실행하는 것이다. ai 애플리케이션의 중요한 일이 llm에게 지시하는 거니, llm 에게 지시하는 부분이 기능(함수)이다. llm에게 지시하는 함수를 시맨틱 함수라 한다. ai 애플리케이션 주된 개발이 llm 연동이고, llm에게 지시하는 일을 시맨틱 함수로 작성하니, ai 애플리케이션 개발의 주 됨이 프롬프트 템플릿 작성이 된다.
사용자는 ai 애플리케이션을 사용하고, ai 애플리케이션은 llm을 사용한다.
* 지금 ai는 llm 빼고는 할 말이 없다. ai 애플리케이션의 주된 일은 llm 서비스와 연동하는 것이다. llm에게 뭘 해 달라고 지시하고, 그 처리 결과를 받는 것이다. 그게 아닌 뭔가 해야 할 일이 있다면, 그것은 llm이 잘 할 수 있는데 스스로 좋은 상황을 만들지 못할 때 그 상황이 좀 더 나아지도록 도와 주는 것이다.
llm은 언어 모델이므로, ai 애플리케이션은 뭘 해 달라고 지시할 때 자연어를 사용해야 한다. 자연어로 작성된 llm에게 전달되는 자연어 지시를 llm 세계에서는 프롬프트라고 한다.
ai 애플리케이션은 llm을 사용해야 하고, llm에게 지시할 유일한 수단은 프롬프트이니, ai 애플리케이션은 프롬프트를 잘 다뤄야 한다. llm 연동 ai 애플리케이션 개발을 도와주는 개발 프레임워크도 이 부분에 중점을 둘 수 밖에 없다. 프롬프트를 잘 다루려다 보니 템플릿도 등장 시켰으니, 개발 프레임워크도 프롬프트 템플릿을 잘 다뤄줘야 한다.
llm은 할 수 있는 일을 잘 지시하면, 지시한 일을 잘 한다. 함수 관점으로 보면, ai 애플리케이션은 함수를 호출하는 것이고 llm은 함수를 실행하는 것이다. ai 애플리케이션의 중요한 일이 llm에게 지시하는 거니, llm 에게 지시하는 부분이 기능(함수)이다. llm에게 지시하는 함수를 시맨틱 함수라 한다. ai 애플리케이션 주된 개발이 llm 연동이고, llm에게 지시하는 일을 시맨틱 함수로 작성하니, ai 애플리케이션 개발의 주 됨이 프롬프트 템플릿 작성이 된다.
시맨틱 함수란 프롬프트 템플릿을 llm에게 전달하는 것이니, 프롬프트 템플릿이 관리되어야 한다.
llm과 연동한다고 해서 llm 모델과 직접 연동 되는 경우는 별로 없고, llm 연동 서비스 api와 연동한다. 서비스를 사용할 때 사용자나 제공자가 요구하는 설정들이 있을 수 있다. 이런 설정도 시맨틱 함수에서 관리하면서 llm 서비스와 연동될 때 전달해 줘야 한다.
시맨틱 커널에서는 프롬프트 템플릿과 설정을 파일로 구분하고 있고 시맨틱 함수는 이들을 포함하는 폴더로 작성한다. 보통 프롬프트 템플릿은 skprompt.txt로, 설정은 config.json으로 작성한다. 함수 하나로도 의미를 갖기도 하지만 하나의 개념을 처리하기 위해 다수의 함수들이 필요한 경우가 더 일반적이다. 함수들을 묶어 다룰 개념도 필요한데 시맨틱 커널에서는 플러그인이라 한다.
[사용 시나리오]
llm(서비스)을 사용하기 위해 사용자는 프롬프트를 작성한다. 매번 프롬프트를 작성하는 것은 좀 그러니 프롬프트 템플릿을 만들어, 프롬프트를 좀 더 쉽게 만들 수 있도록 해 주자.
사용자들은 llm 서비스를 사용해서
쿼리에 대한 응답을 구하거나,
요약과 같은 (텍스트) 생성을 원한다.
사용자들은 다양한 분야의 다양한 (텍스트) 생성을 원할 거니, 프롬프트 템플릿도 다양하게 분류되어 제공되는 게 좋다.
프롬프트 템플릿을 가지고 프롬프트를 만들어 llm에게 쿼리 응답이나 (텍스트) 생성을 지시하는 기능을 시맨틱 함수라 했고, 이들을 그룹으로 묶어 관리하는 것이 플러그인이라 했으니, 결국 플러그인이 분류되어야 할 대상이다. 사용자는 생성을 지시할 프롬프트를 얻기 위해 분류된 플러그인을 선택하고, 플러그인에 포함된 시맨틱 함수 – 프롬프트 템플릿 -를 선택해야 한다.
사용자는 쿼리 응답을 지시할 지, 텍스트 생성을 지시할 지 정하고, 텍스트 생성을 지시할 경우는 무엇을 생성할 지에 따라 플러그인 분류를 선택하고, 선택한 플러그인에 포함된 시맨틱 함수 – 프롬프트 템플릿 – 를 선택한다. 쿼리 응답을 지시하는 경우 쿼리를 작성하고, 생성을 요청할 경우 선택한 프롬프트 템플릿의 placeholder 부분을 작성할 함수나 변수나 값을 작성해야 한다.
사용자와 llm의 상호작용은 챗 방식이 좋다. 챗 방식으로 할 경우 원하는 결과를 얻을 때 까지 위의 과정을 반복한다.
[추후 반영할 요구사항]
텍스트 생성을 원하는 사용자들이 대다수 이겠지만, 같은 의미를 전달하는 소리, 이미지, 영상 생성을 원할 수도 있다. 프롬프트 작성도 텍스트 뿐만 아니라 이런 형태로 작성하기를 원할 수도 있다.
[설계 결정]
– 시맨틱 함수는 폴더로 작성하고, 시맨틱 함수에 해당하는 프롬프트와 llm 서비스 요청을 위한 설정은 함수 폴더에 파일로 작성한다. 프롬프트 파일은 skprompt.txt라고 하고, 설정 파일은 config.json이라고 하자.
시맨틱 함수들은 플러그인에 포함되니, 전체 시맨틱 함수 폴더 계층은 다음과 같이 구성하자.
plugins – semantic – [Skill 접미어를 사용해 작성한 플러그인 이름] – [시맨틱 함수 이름]
예) summarize하고 topic을 작성하는 기능이 있다고 할 때, 이것들은 writer skill로 보고 디렉토리 계층을 구성해 보면
plugins -semantic – writerskill
– summarize
– topic
– ai 애플리케이션 실행 시작 시, 시맨틱 함수들은 모두 로딩하고 시작한다.
함수는 플러그인 이름을 알고 함수 이름을 알면 찾을 수 있다. 이렇게 함수가 관리되도록 하자.
커널이 ai 애플리케이션 코어이니, 여기서 로딩 된 함수들을 관리하도록 하자.
– llm 서비스 응답은 streaming 방식을 지원함으로 이를 처리할 수 있도록 해야 한다.
– 프롬프트 템플릿은 사용자에게 카테고리화 되어 제공되어야 한다. 프롬프트 템플릿의 place holder에 따라 ui가 동적으로 생성될 수 있도록, 값 작성을 위한 메타 정보가 제공되어야 한다.
– [개발 미 반영] 설정은 함수 마다 작성하는 것은 낭비이니. llm이 처리해 주기를 원하는 수준에 따라 몇 개만 만들어두고, 어떤 수준으로 할 것 인지에 따라 선택해서 사용하도록 하자. 프롬프트 템플릿은 내용을 직접 바꿀 일이 많으니 코딩 할 수도 있지만 별도 텍스트 파일을 두도록 하고. 설정은 몇 개에서 선택해서 사용하게 코딩하도록 하자.
시맨틱 함수 지원을 위해 Function 레파지토리를 구분 작성한다.
[ 명세 ]
- llm 연동 ai 애플리케이션에 추가적으로 개발해야 하는 기능 파악 시, llm을 보완하는 수준의 기능인지, 사용자와의 chat 과정에서 의도 파악이 필요한 것인 지를 구분해야 한다. chat 과정에서 의도 파악이 필요한 것일 경우, 의도 파악 후 어떻게 대응할 것인 지 명세 해야 한다.