AI 전문가 에이전트 개발을 위한 LLM 기반 구조화된 JSON 데이터 RAG 및 생성하기
BIM 칼럼니스트 강태욱의 이슈 & 토크
이번 호에서는 최근 챗GPT(ChatGPT)와 같은 AI 전문가 서비스 개발을 위한 LLM(Large Language Model, 대규모 언어 모델) 기술 중 하나인 LLM 기반 구조화된 형식의 데이터 생성하는 방법을 간략히 소개한다.
■ 강태욱
건설환경 공학을 전공하였고 소프트웨어 공학을 융합하여 세상이 돌아가는 원리를 분석하거나 성찰하기를 좋아한다. 건설과 소프트웨어 공학의 조화로운 융합을 추구하고 있다. 팟캐스트 방송을 통해 이와 관련된 작은 메시지를 만들어 나가고 있다. 현재 한국건설기술연구원에서 BIM/GIS/FM/BEMS/역설계 등과 관련해 연구를 하고 있으며, 연구위원으로 근무하고 있다.
페이스북 | www.facebook.com/laputa999
홈페이지 | https://dxbim.blogspot.com
팟캐스트 | http://www.facebook.com/groups/digestpodcast
LLM을 다양한 시스템과 연동해 사용하려면, LLM의 출력이 기계가 이해 가능한 JSON, SQL, Code 형태여야 한다. 이번 호에서는 JSON 입출력이 가능하도록 RAG(Retrieval-Augmented Generation, 검색 증강 생성)를 처리하는 방법을 개발한다.
이를 잘 이용하면, 건설, 건축 분야의 PDF 파일 등을 학습하고, 필요한 정보를 기계 처리 가능한 형식으로 출력해 계산 가능한 표, 수식 등의 형식으로 정보를 생성할 수 있다.
그림 1. LLM 기반 텍스트 입력 및 구조화된 JSON 형식 생성 절차 개념도
이번 호에서는 오픈AI(OpenAI) 챗GPT와 같이 API를 사용하려면 구독해야 하는 상용 모델 대신 라마, 미스트랄과 같은 오픈소스 모델을 사용한다. LLM 모델을 컴퓨터에 다운로드받고 구동하기 위해 올라마(Ollama)를 이용하고, LLM 프롬프트와 RAG 처리를 위해 랭체인(LangChain)을 사용한다.
개발 환경 준비
다음과 같이 개발 환경을 설치한다. 그리고 올라마(https://ollama.com) 도구를 설치하도록 한다.
pip install llama-cpp-python
pip install 'crewai[tools]'
pip install langchain
Text to JSON
라마 모델을 로딩하고 JSON 문법으로 출력하도록 GBNF(GGML BNF) 문법 정의를 이용해 JSON 출력을 생성한다. 다음 코드를 실행한다.
from llama_cpp.llama import Llama, LlamaGrammar
import httpx
grammar_text = httpx.get("https://raw.githubusercontent.com/ggerganov/llama.cpp/master/grammars/json_arr.gbnf").text
grammar = LlamaGrammar.from_string(grammar_text)
llm = Llama("llama-2-13b.Q8_0.gguf")
response = llm(
"JSON list of name strings of attractions in SF:",
grammar=grammar, max_tokens=-1
)
import json
print(json.dumps(json.loads(response['choices'][0]['text']), indent=4))
출력 결과는 다음과 같이 샌프란시스코에 있는 놀이 시설을 보여준다.
[
{
"address": {
"country": "US",
"locality": "San Francisco",
"postal_code": 94103,
"region": "CA",
"route": "Museum Way",
"street_number": 151
},
"geocode": {
"latitude": 37.782569,
"longitude": -122.406605
},
"name": "SFMOMA",
"phone": "(415) 357-4000",
"website": "http://www.sfmoma.org/"
}
]
이와 같이 LLM 출력을 컴퓨터 처리하기 용이한 구조로 생성할 수 있다.
참고로, 여기서 사용한 JSON 문법은 <그림 2>와 같이 정형 규칙 언어로 정의된 것을 사용한 것이다.
그림 2. json.gbnf(https://github.com/ggerganov/llama.cpp/tree/master/grammars)
■ 자세한 기사 내용은 PDF로 제공됩니다.
강태욱
작성일 : 2024-08-05
조회수 : 2341