2024년에는 LLM 기반 지원서가 부족하지 않습니다. Microsoft 및 Google과 같은 주요 기술 회사는 주력 ChatGPT 및 Gemini 모델의 더욱 강력한 버전을 추진하고 있으며 Anthropic과 같은 전문 업체는 추가 통합을 통해 경쟁 제품을 추진하고 있습니다. 응용 LLM 세계에서는 기업과 심지어 정부에서도 다양한 상황에 맞는 채팅 애플리케이션을 실험하고 있습니다.
LLM에 엄청난 기업가적 에너지가 쏟아졌음에도 불구하고 대부분의 주요 응용 프로그램은 사람이 읽을 수 있는 텍스트를 받아 반환하는 채팅과 같은 인터페이스에 중점을 두기 때문에 여전히 제한적입니다. 이는 이해할 수 있는 일입니다. 결국 LLM의 가장 흥미로운 발전 중 하나는 인간 언어를 이해하고 생성하여 대화형 사용자 인터페이스를 허용하는 능력입니다. 그러나 채팅 인터페이스는 LLM의 또 다른 매우 중요한 사용 사례, 즉 대규모 데이터 파이프라인의 중간 단계인 텍스트 처리를 간과합니다.
오늘은 이 사용 사례를 살펴보고 LLM이 자연어 생성기뿐만 아니라 데이터 파이프라인의 일부로 어떻게 유용할 수 있는지 살펴보겠습니다.
LLM을 데이터 파이프라인의 일부로 사용하려면 LLM의 출력 형식을 변경해야 합니다. 사람이 읽을 수 있는 단락을 생성하는 대신 모델이 컴퓨터가 읽을 수 있는 내용을 생성해야 합니다. 일반적으로 이는 JSON과 같은 데이터 형식의 구조화된 출력이나 Python 또는 SQL과 같은 프로그래밍 언어의 지침을 의미합니다. 이러한 출력 형식은 따옴표나 대괄호가 누락되면 전체 파이프라인이 중단될 수 있으므로 자연어보다 훨씬 덜 관대합니다. 따라서 우리는 이 사용 사례를 지원하기 위해 개발된 특수한 방법과 기능에 의존해야 합니다. 출력이 함수를 호출하거나 함수 호출에서 사용되는 경향이 있기 때문에 이러한 기능을 집합적으로 함수 호출이라고 합니다.
하지만 이러한 방법을 자세히 살펴보기 전에 먼저 함수 호출 기능이 처음에 개발된 이유를 좀 더 자세히 살펴보겠습니다.
외부 서비스에 연결
함수 호출의 독창적이고 가장 간단한 사용 사례는 외부 서비스에 연결하는 것입니다. OpenAI는 원래 GPT-4를 출시했을 때 사용자가 모델이 목표를 달성하기 위해 호출할 수 있는 Python 스타일 함수 세트를 모델에 제공할 수 있는 기능으로 API를 업데이트했습니다. 예를 들어 모델은 복잡한 증권의 가격을 계산하기 위해 외부 함수를 호출할 수 있다고 말할 수 있습니다. 이 정보를 사용하면 모델은 증권 가격 책정에 대한 전문 지식을 보유하지 않고도 이러한 증권으로 구성된 포트폴리오의 가치를 계산하는 코드를 작성할 수 있습니다.
Python 스타일 함수를 호출하는 것은 빙산의 일각일 뿐입니다. 시장에서 함수 호출의 중요성이 입증되자 OpenAI 및 기타 LLM 제공업체는 JSON 또는 SQL과 같은 다른 출력 형식을 지원하기 시작했습니다. 중요한 것은 이러한 모델이 다른 프로세스에서도 안정적으로 읽을 수 있는 기계 판독 가능한 출력을 출력한다는 것입니다.
기민한 독자라면 우리가 이전 기사에서 LLM을 사용하여 훈련 데이터 , SQL 또는 JSON을 생성하는 것과 유사한 작업을 수행했다는 것을 인식할 것입니다. 이 기사 에서는 프롬프트 엔지니어링 및 출력 확인을 사용하여 이를 수행했지만 이제 함수 호출이 널리 지원되는 기능이므로 이러한 모델 수준 기능을 사용하여 이 작업을 더 쉽게 수행할 수 있습니다.
LLM 연결
함수 호출은 다중 LLM 응용 프로그램에 대한 새로운 가능성을 창출했으며 곧 개발자는 LLM 연결을 실험하여 정교한 시스템을 만들었습니다. 이러한 시스템 중 일부는 독립적으로 웹을 검색하고, 새로운 데이터를 수집하고, 새로운 정보로 다른 LLM을 호출할 수 있는 에이전트 로 알려졌습니다. 이러한 파이프라인은 놀라운 수준의 자율성이 가능하고 매우 적은 입력으로 정교한 문제를 해결할 수 있습니다. 하지만 에이전트가 널리 채택되는 것을 방해하는 API 비용 및 행동 보호 장치와 같은 제한 사항은 여전히 존재합니다.
LLM을 입력 및 중간 처리로 사용
함수 호출 LLM의 또 다른 사용 사례는 입력 및 중간 데이터 처리입니다. LLM을 사용하면 구조화되지 않은 입력을 다운스트림 처리에 사용할 수 있는 구조화된 데이터로 구문 분석할 수 있습니다. 이러한 작업 중 다수는 "전통적인" NLP 기술로 분류되는 경향이 있지만 변환기 기반 모델의 유연한 특성은 특별히 훈련된 모델이 다른 NLP 기술보다 이러한 작업을 훨씬 더 잘 수행할 수 있음을 의미합니다. 결과적으로 많은 개발자는 데이터 파이프라인에서 이러한 특수 모델을 활용하려고 노력하고 있습니다.
이제 함수 호출의 배경이 되는 이론을 익혔으므로 오늘 구축할 애플리케이션을 살펴보겠습니다.
이전 기사 에서는 CB Insights 인기 뉴스레터에 대한 자연어 질문에 답변하기 위해 간단한 RAG 애플리케이션을 만들었습니다. 오늘 기사에서는 유사한 질문 답변 애플리케이션을 구축할 예정이지만, 내장 검색 및 GPT3.5에 의존하는 대신 엔터티 인식을 기본 인덱싱 방법으로 사용할 것입니다. 또한 DRAGON을 요약 엔진으로 사용하여 클라우드 서비스가 필요 없이 노트북에서 전체 애플리케이션을 실행할 수 있습니다.
엔터티 인식을 사용하는 이유는 무엇입니까?
구현에 대해 자세히 알아보기 전에 검색을 내장하는 대신 NER를 검색 기술로 사용하는 이점을 먼저 살펴보겠습니다. 프로덕션에서는 특정 상황의 요구에 따라 각 기술을 사용하려고 하지만 NER는 임베딩 검색에 의존하는 시스템에 비해 몇 가지 장점을 제공합니다.
디버깅 가능성: 엔터티 인식은 쉽게 확인할 수 있는 작업이므로 전체 파이프라인을 훨씬 더 쉽게 디버깅할 수 있습니다. 모델이 모든 엔터티를 올바르게 식별하는지 확인하기 쉽고, 이러한 엔터티를 기반으로 매칭 알고리즘을 구축하고 개선하는 것도 쉽습니다. 이에 비해 임베딩 알고리즘이 구절의 유사점과 차이점을 적절하게 식별하는지 확인하는 것이 훨씬 더 어렵습니다.
유연성: 인식과 필터링을 분리함으로써 임베딩 기반 검색 알고리즘보다 파이프라인을 훨씬 더 유연하게 만듭니다. 추가 메타데이터를 추가하고, 엔터티 유형에 따라 검색 알고리즘을 변경하고, NER 기반 검색 결과 위에 임베딩 알고리즘을 사용할 수도 있습니다. 이를 통해 기술 조합을 기반으로 훨씬 더 강력한 기능을 개발할 수 있습니다.
예를 들어, NER 기반 파이프라인은 엔터티 기반 검색을 사용하여 문서 집합의 범위를 좁힌 다음 임베딩 알고리즘을 사용하여 검색 공간 내에서 더 범위를 좁힐 수 있습니다. 이는 검색을 훨씬 더 빠르고 효율적으로 만드는 경향이 있습니다.
식별 능력: 가능한 수동 제어 수준으로 인해 NER 파이프라인은 특정 검색 및 검색 작업에 훨씬 더 적합합니다. 임베딩 검색은 훈련 데이터 내 구절의 근접성을 기반으로 하며, 이는 두 문서가 동일한 큰 문서에서 나올 확률을 계산합니다. 일부 사용 사례에서는 내장 검색으로 인해 중요한 문서가 누락될 수 있습니다.
이제 RAG 파이프라인 내에서 NER를 사용할 때의 이점을 이해했으므로 애플리케이션에서 사용 중인 특정 기술을 자세히 살펴보겠습니다.
LLM 엔터티 인식
엔터티 인식은 구조화되지 않은 언어 데이터에서 구조화된 데이터를 추출하기 위한 "전통적인" NLP 기술입니다. 추출된 데이터는 다운라인 처리에 사용되거나 분석 중인 구절에 대한 메타데이터로 사용될 수 있습니다.
역사적으로 이는 먼저 품사에 태그를 지정한 다음 식별된 고유 명사가 명명된 엔터티인지 확인하는 두 번째 단계를 수행하는 소규모의 특수 목적 기계 학습 알고리즘을 사용하여 수행되었습니다.
함수 호출 LLM을 사용하면 몇 가지 추가 이점과 함께 동일한 작업을 수행할 수 있습니다.
변환기 아키텍처는 작은 NLP 모델보다 언어 구조를 더 잘 이해할 수 있기 때문에 예를 들어 구절의 형식이 부적절할 경우 성능이 더 강력할 수 있습니다.
LLM은 최신 교육 데이터로 업데이트되므로 엔터티 인식 시스템은 다른 오픈 소스 엔터티 인식 모델보다 최신 상태를 유지할 가능성이 높습니다.
신속한 엔지니어링 기술을 사용하여 추가 데이터를 내장하고 추가 지침을 제공할 수 있으므로 기성 모델에서도 보다 유연한 동작이 가능합니다.
DRAGON 우리는 자연어 데이터를 요약하는 데 있어 인상적인 성능을 강조한 이전 기사에서 Dragon을 다루었습니다. 우리는 Dragon을 사용하여 분석의 마지막 단계를 수행할 것입니다. 여기서 선택한 엔터티와 관련된 모든 기사를 요약할 것입니다.
SLIM SLIM은 LLMWare 의 새로운 소형화, 로컬 실행 가능 모델 제품군입니다. 제가 LLMWare의 소형화 작업 팬이라는 사실은 비밀이 아닙니다. 이는 함수 호출을 전문으로 합니다. 이러한 모델은 기계에서 해석할 수 있는 출력을 생성하도록 특별히 미세 조정되었으므로 사용자는 외부 API에 의존하지 않고도 함수 호출 아키텍처의 최근 개발을 활용할 수 있습니다.
오늘 우리는 뉴스레터 기사에 대해 명명된 엔터티 인식을 수행하는 SLIMs-NER 모델을 사용할 것입니다. NER 외에도 감정 분석, SQL 생성 및 다단계 에이전트를 위한 SLIM 모델도 있습니다.
이제 기술을 이해했으니 애플리케이션을 구현해 보겠습니다.
먼저 CB Insights 기사를 다운로드해 보겠습니다. 종속성을 가져오겠습니다.
import requests from bs4 import BeautifulSoup import os import pandas as pd import json import re
이제 뉴스레터 아카이브를 다운로드하는 코드는 다음과 같습니다.
res = requests.get('https://www.cbinsights.com/newsletter/') soup = BeautifulSoup(res.text) article_links = [[i.text, i['href']] for i in soup.find_all('a') if 'campaign-archive' in i['href'] ] article_soups = [BeautifulSoup(requests.get(link).text) for title, link in article_links]
이제 뉴스레터 아카이브를 다운로드했으므로 JSON 형식으로 처리해 보겠습니다.
result_json = {} for soup_meta, soup_art in zip(article_links, article_soups): article_tables = [] cur_article = [] for table in soup_art.find_all('table'): if table.attrs.get('mc:variant') == 'Section_Divider': article_tables.append(get_deduped_article_tables(cur_article)) cur_article = [] else: cur_article.append(table.text) article_tables.append(get_deduped_article_tables(cur_article)) result_json[soup_meta[0]] = article_tables articles_with_meta = [] for name, tables in result_json.items(): print(name, pd.to_datetime(tables[0][1].strip())) articles_with_meta.append({ 'name': name, 'date': pd.to_datetime(tables[0][1].strip()).strftime('%Y-%m-%d'), 'tables': tables }) df = pd.DataFrame(articles_with_meta)
이제 우리는 이전 기사에서 있었던 것과 같은 장소에 있습니다. 그러나 임베딩을 생성하여 RAG 구성으로 바로 이동하는 대신 엔터티 인식 단계를 실행합니다.
먼저, 컴퓨터에서 로컬로 엔터티 인식을 수행할 수 있게 해주는 LLMWare의 새로운 모델 세트인 SLIM을 실행하기 위한 종속성을 가져와 보겠습니다.
from llmware.agents import LLMfx from llmware.parsers import WikiParser from collections import defaultdict # define a function for identifying all the named entities def run_ner(text): agent = LLMfx() agent.load_work(text) agent.load_tool("ner") named_entities = agent.ner() ner_dict= named_entities["llm_response"] return ner_dict
이제 모든 기사에 대해 명명된 엔터티 인식을 실행할 수 있습니다.
date_entities = defaultdict(dict) for _, row in df.iterrows(): for idx, t in enumerate(row['tables'][1:]): if 'Start Your Free Trial' in t: t = t[:t.index('Start Your Free Trial')] date_entities[row['date']][idx] = run_ner('\n'.join(t))
NER 파이프라인이 완료되는 데 몇 분 정도 걸릴 수 있지만 이것이 최첨단 소형 LLM을 사용하여 엔터티를 인식하는 데 필요한 전부입니다.
일부 테스트 항목을 인쇄하여 date_entities 사전을 확인할 수 있습니다. 예를 들어, 코드는 다음과 같습니다.
date_entities[list(date_entities.keys())[0]]
아래와 같은 출력이 생성되어야 합니다.
{0: {'people': ['Yahoo!'], 'place': [], 'company': ['Databricks', 'MosaicML'], 'misc': []}, 1: {'people': [], 'place': ['New York'], 'company': ['CB Insights'], 'misc': []}}
SLIM 모델에 의해 감지된 다양한 엔터티를 모두 보여줍니다.
이제 엔터티가 검색되었으므로 이 기술의 강력한 기능을 보여주는 질문 답변 워크플로를 구축해 보겠습니다. 이 예에서는 다음 테스트 질문을 사용합니다. OpenAI는 Microsoft의 AI 전략에서 어떤 역할을 합니까?
DRAGON을 실행하기 위해 적절한 패키지를 가져오는 것부터 시작해 보겠습니다.
from llmware.prompts import Prompt query = "What role does OpenAI play in Microsoft's AI strategy?" model_name = "llmware/dragon-llama-7b-gguf" prompter = Prompt().load_model(model_name)
이제 엔터티 인식을 사용하여 질문에 답하는 기능을 구축할 수 있습니다. NER 데이터를 활용하기 위해 다음 워크플로를 구현하려고 합니다.
코드 형식의 워크플로는 다음과 같습니다.
def answer_question_with_ner(query): ner_results = run_ner(query) # run NER on the user query search_entities = [] for ent_type, ent_list in ner_results.items(): search_entities.extend(ent_list) # create a list of entities to search for search_entities = list(set(search_entities)) # now perform a lookup for articles that mention the identified entities, using set arithmetic. articles = set(entity_to_place_map[search_entities[0]]) for se in search_entities: articles &= set(entity_to_place_map[se]) # now process the corpus into a prompt and feed it to the question-answering LLM. article_content = [] for article in articles: article_content.extend(df[df['date'] == article[0]].iloc[0]['tables'][article[1]+1]) response = prompter.prompt_main(query, context='\n'.join(article_content), prompt_name="default_with_context", temperature=0.3) return response # return the response.
첫 번째 코드 블록의 쿼리를 사용하여 함수를 실행하면 다음 결과가 표시됩니다.
Microsoft has poured billions of dollars into ChatGPT developer OpenAI. However, it's also placed a number of bets on other GenAI startups across computing, mapping, and gaming.
또한 응답 개체의 "증거" 섹션에서 실제로 Microsoft 및 OpenAI를 언급하는 CB Insights 아카이브의 두 기사가 검색되었으며 LLM의 답변이 증거를 직접 기반으로 한다는 것을 확인할 수 있습니다.
명시적인 엔터티 인식을 수행하기 때문에 검색 프로세스는 매우 투명하고 디버깅 가능합니다. 모델이 말뭉치에서 이러한 특정 정보를 검색한 이유에 대한 질문이 발생하는 경우 쿼리에 "Microsoft" 및 "OpenAI"가 언급되어 모델이 기사를 선택했음을 확인하기 위한 간단한 인쇄 문만 있으면 됩니다. 검색된 두 개의 뉴스레터 섹션은 두 엔터티를 모두 언급하는 유일한 섹션입니다.
또한 임베딩 기반 벡터 검색과 비교할 때 NER 조회 방법은 훨씬 더 정확한 답변을 제공합니다. 내 테스트에서 선택한 기사는 OpenAI의 ADA 알고리즘에 의해 순위가 매겨진 가장 관련성 높은 기사 10개에 포함되었지만, 당면한 질문에 가장 근접한 것으로 식별된 기사는 아니었습니다. 따라서 포함 검색을 사용하는 애플리케이션이 질문에 전혀 올바르게 대답하지 못할 수 있으며 디버깅 가능성이 부족하여 혼란만 가중시킬 수 있습니다.
이를 통해 우리는 NER 조회를 사용하여 질문 답변 애플리케이션을 구축하여 그 과정에서 파이프라인의 품질을 향상시켰습니다!
오늘 우리는 흥미롭고 새로운 LLM 기능인 함수 호출을 사용하여 애플리케이션을 구축했습니다. 소형화되고 로컬에서 실행 가능한 함수 호출 모델은 새로운 종류의 AI 애플리케이션을 여는 혁신적인 개발이며, 우리는 이러한 기술의 첫 번째 반복을 보고 있습니다. 앞으로 몇 달 안에 개발자들이 이러한 기술을 사용하여 어떤 애플리케이션을 개발하게 될지 지켜보는 것은 흥미로울 것입니다.
구현을 보고 싶은 AI 공간의 아이디어가 있거나 단순히 기술에 대해 이야기하고 싶다면 주저하지 말고 Github 또는 LinkedIn 에 문의하세요.
SLIM 및 DRAGON을 개발한 회사인 LLMWare에 대해 자세히 알아보려면 HugginFace 또는 Github 에서 찾을 수 있습니다.