LLM 8

LLM Tool을 만들다 식겁한 이야기

Tool을 만들면서 정말 등골이 서늘했었을때가 한 번 있었다.그 일을 기념(?)하기 위해...그리고 나같은 바보가 더 이상 등장하지 않았으면 좋겠다는 마음에서 포스팅한다. Tool Calling중 오류가 났을때, LLM에게 전달되는 메세지에 굳이 정확한 오류를 전달할 필요 없다. 사진은 내가 f"{e!s}" 같은 방법으로 Exception 메세지를 출력하려고 하다 디코드에러를 만나서 LLM에게 전달된 메세지내용이다. 내용이 Word도 아니라서 엄청나게 많은 토큰이 한 순간에 소비되었고, 단 한번의 Tool Calling으로 $44를 날려버리게 되었다... 정확한 오류는 Logger로 따로 로깅하고, LLM에게는 "실패했다", "파일이 없다" 정도로만 오류 메세지를 출력해야한다. 또한 FileTree나..

LLM이 자연스러운 슬랙 메세지를 출력하게 하는 소소한 팁

AI를 이용한 자동화 작업을 하면서 Slack 메세지를 통합해본 경험이 있는 분들이라면 한번쯤 이쁜 출력에 대해 고민해봤을 것이다. 구조화된 출력을 하게하고 직접 포맷팅하는 방법이 가장 마음에 들겠지만, 구조화된 출력을 위해 낭비되는 토큰들이 아깝거나, 사내공유 Slack 메세지처럼 딱히 정확한 출력을 원하지 않을때 내가 사용하는 방법이있다. LLM에게는 마크다운으로 작성하라고하고, 그걸 Slack 메세지 포맷으로 바꾸는 방법이다.처음부터 LLM에게 Slack 메세지 포맷으로 해달라고하면 메세지 포맷이 지켜지지 않기가 일쑤다. (특히, Google Gemini 2.0 Flash는 **를 엄청나게 쓴다.) 마크다운 문법은 모든 LLM이 거의 완벽하게 구사하기때문에 일관된 결과를 출력할 수 있다.https:..

반쪽짜리 Contextual Retrieval로 RAG 강화 해보기

2024년 9월 20일, Anthropic은 Contextual Retrieval이라는 개념을 제시했다. Contextual Retrieval은 기존의 RAG의 검색 성공률을 향상시키기 위한 방법으로, Contextual Embeddings와 Contextual BM25의 두가지 하위 기술을 사용한다. Anthropic에 따르면 이 방법을 이용할 경우 실패한 검색 수를 49%까지 줄일 수 있으며, ReRanking과 함께 사용하면 67%까지 줄일 수 있다고한다. 최근에는 RAG에 이어 CAG(Cache-Augmented Generation)도 등장했다. CAG는 더 길어진 LLM의 Context Window를 충분히 활용하여, 검색 증강하려는 문서의 전체 내용이 Context Window에 들어갈 수 있..

사내 AI Agent 구축기

이건 정말 Agent를 만들어야하는데...사원들의 온보딩을 위해 회사업무에 필요한 질문에 대한 답변들을 제공해주는 챗봇을 개발하게 되었다. 노션도, 슬랙도 통합해야하고 사용자의 다양한 질문에 대답할 수 있어야했다. 꼼짝없이 Agent를 만들어야할 순간이 왔다. 이때까지도 번역을 위한 작은 RAG앱만 만들어본터라, Agent를 개발하는 것은 좀 막막했다. 심지어 시작은 신입 “개발자”들을 위한 챗봇이었다. 기본적인 회사 문서들 외에 코드베이스도 통합해야했다. 코드베이스 통합을 위해서 이리저리 찾아보다가 Codegen의 CodeAgent를 사용해봤다. CodeAgent를 사용하면서 어떻게 Agent를 개발해야하는지에 대한 많은 힌트를 얻었다. 내가 개발한 Agent도 CodeAgent와 크게 다르지않다. 그..

[LangChain] LLM Workflow : 병렬처리 구현

실행하려는 체인들이 각각 독립적일때, 메모리를 더 사용해서 수행시간을 단축시키기 위해 체인을 병렬처리할 수 있다. RunnableParallel을 이용해 체인을 병렬처리해보았다. RunnableParallel역시 다른 Runnable~시리즈처럼 Runnable 표준 인터페이스를 상속한다. 구현코드제공된 주제에 따라 간단한 설명과, 시를 써달라는 요청을 했다.from langchain_ollama.llms import OllamaLLMmodel = OllamaLLM( model="gemma2:2b")from langchain_core.prompts import PromptTemplateprompt1 = PromptTemplate.from_template( """ {topic}에 대해서 1줄..

[LangChain] LLM Workflow : Chaining 구현

LLM을 이용한 애플리케이션을 만들때, 가장 단순한 구조는 사용자의 입력을 받아 LLM이 질문에 대해 응답을 생성하고, 출력하는 Input - LLM - Output으로 이루어진 체인이다. 작업 요구 사항에 따라 여러 단계의 과정이 추가되어야하거나, 혹은 하나의 LLM에서 나온 응답을 다음 LLM이 받아서 처리하는 연속적인 처리 구조로 만들어야할 수 있다. 이러한 체이닝 구조의 워크플로우를 LangChain을 이용해 구현해보았다. LangChain에서 실행가능한 모든 것들은 Runnable이다. 이 Runnable은 LCEL이라는 LangChain에서 사용하는 도메인 랭귀지를 이용해 선언적으로 사용할 수 있다. | 연산자를 이용해 이전단계의 출력을 다음단계로 보내는 식이다.chain = (prompt |..

Langchain으로 간단한 RAG 구현하기

Langchain으로 소설 "난쟁이가 쏘아올린 작은 공" PDF 문서에 대한 답변을 제공해 줄 수 있는 간단한 RAG 애플리케이션을 구현했다. (코드에 대한 설명은 Gist 주석으로 대신한다.) 아직 잘 모르는 상태로 무작정 다이브했으니, 간단하게 개념을 정리하겠다. LLM이 답변을 지어내는 것을 방지하고, 커스텀한 컨텍스트 제공을 위해 LLM을 이용한 챗봇에는 검색증강생성(RAG)라는 기술을 사용한다. RAG 애플리케이션은 일반적으로 두 구성요소로 이루어진다. 1. 인덱싱(Indexing) - 소스에서 데이터를 수집하고 인덱싱하는 과정2. 검색과 생성(Retrieval and generation) - 유저에게 쿼리를 받아서 인덱스에서 관련 데이터를 찾아 모델에게 전달하는 실질적인 RAG 체인이다. 인..

LLM의 뜻과 한계 (할루시네이션, 지식단절현상)

Large Language Model - 방대한 양의 데이터로 사전 학습된 초대형 딥 러닝 모델. 트랜스포머 모델이라고 하는 일종의 신경망을 기반으로 한다. 트랜스포머 모델트랜스포머 모델은 문장 속 단어와 같은 순차 데이터 내의 관계를 추적해 맥락과 의미를 학습하는 신경망 예측할 수 없는 쿼리에 대해 대응 할 수 있고, 구조화되지 않은 질문이나 프롬프트에도 답변할 수 있다. 하지만 LLM은 수집하는 데이터만큼만 신뢰할 수 있는 정보를 제공하므로, 정확한 답변을 내놓을 수 없을때면 가짜 정보를 생성한다. 이를 "할루시네이션(Hallucination)"이라고 한다. 대표적으로 유명한 "세종대왕 맥북 던짐사건"짤이 있다. AI 모델은 확률을 사용하여 어떤 단어나 시각적 요소가 나타날지 '예측'하는데하므로 일부..