내가 사용하기 위한 LangChain 정리

ms_de10·2024년 8월 12일
0

이번 프로젝트에서 프롬프트에 기능 구현하면서 LLM 모델을 더욱 효과적으로 사용하는 방법이 있는지 찾아보다가 알게된 Langchain에 대해 간략하게 정리하고 한다.

랭체인은 LLM을 기반으로 한 애플리케이션을 개발하기 위한 프레임워크이며 언어 모델을 api 통해 호출하는 것 뿐만 아니라 외부 데이터를 인식하거나 타 시스템과의 상호작용하는 애플리케이션을 개발하고자 하는 요구에 나온 오픈소스이다

LangChain의 등장

LLM은 일반적인 상황에서 프롬프트에 응답하는데 탁월하지만, 훈련한 적이 없는 특정 영역에서는 성능이 떨어진다. 예를 들어 LLM은 추정치를 제공하여 컴퓨터 비용에 대한 답변을 제공하지만 회사에 판매하는 특정 컴퓨터 모델의 가격을 표시할 수는 없다.

프롬프트는 사용자 또는 시스템에서 제공하는 입력으로, LLM에게 특정 작업을 수행하도록 요청하는 지시문입니다. 프롬프트는 질문, 명령, 문장 시작 부분 등 다양한 형태를 취할 수 있으며, LLM의 응답을 유도하는 데 중요한 역할을 합니다.

즉 LLM은 최신의 정보를 가져오기가 힘들고 특정 영역에 대한 정보가 없을때는 성능이 떨어지는 LLM에 대한 단점으로 뽑힌 상황이다. 이러한 상황에서 특정한 상황에 애플리케이션을 만들 수 있게 도움을 주는것이Langchain이다.

언어 모델의 용도 변경

LangChain을 사용하면 재훈련이나 미세 조정 없이 LLM을 분야별 애플리케이션에 맞게 재활용할 수 있다.
예를 들어 LangChain을 사용하여 저장된 내부 문서에서 데이터를 읽고, 이를 챗봇 같은 대화형 애플리케이션으로 구축할 수 있다. 프롬프트를 표시하는 동안 언어 모델에 새 정보를 적용하는 검색 증강 생성(RAG) 워크플로어를 만들 수 있다.

알아할 개념으로는 체인, 출력 파서, RAG, Agent 등 더욱이 많지만 내가 사용한 기능한에서만 정리하고자 한다.

Chain(체인) 이란?

체인은 langchain에서 다양한 ai 구성 요스를 유지하여 컨텍스트 인식 응답을 제공하는 기본 원칙이다. 체인은 사용자의 쿼리부터 모델의 출력에 이르기까지, 일련의 자동화된 작업이다. 예를 들면 대화형 AI, 자동 문서 생성, 데이터 분석 및 요약 등 다양한 용도로 활용될 수 있습니다.

RAG 란 무엇인가?

RAG(Retrieval-Augmented Generation) 란 기존의 LLM에서 검색 기능을 추가하여, 주어진 질문이나 문제에 대해 더 정확하고 풍부한 정보를 기반으로 답변을 생성하게 해주는 기능이다.
이 파이프라인은 크게 데이터 로드, 텍스트 분할, 인덱싱, 검색, 생성의 다섯 단계로 구성된다.

진행한 프로젝트에서 최신 주식 데이터가 필요하기에 검색 기능(Retriever)을 사용하여 기능을 구현했다.


// ai report
export async function agentChat(id: string) {
const search = new TavilySearchResults({
maxResults: 1,
});

  

const retriever = await search.invoke(`최근 ${id} 주식`);

  

const tools = [search,stockAnalysisTool];
const prompt = await pull<ChatPromptTemplate>("hwchase17/openai-functions-agent");

  

// 1. 모델 초기화

const llm = new ChatOllama({

baseUrl: "http://localhost:11434",
model: "llama3",
temperature: 0.3,
topP: 0.3,
stop: ["\n\n\n\n\n"],
repeatLastN: 2,
numBatch: 16,
lowVram: true,

});

  

// 2. 도구 정의

const stockAnalysisTool = new DynamicStructuredTool({
name: "stock_analysis",
description: "주식에 대한 상세한 분석 데이터를 제공합니다.",
schema: z.object({
stockName: z.string().describe(id),
}),

func: async () => {

try {
'주식 데이터에 대한 전처리 과정을 작성하면 된다.'

} catch (error) {
console.error("Error fetching stock data:", error);
return JSON.stringify({ error: "Failed to fetch stock data" });

}
},
});

  

const agent = await createOpenAIFunctionsAgent({

llm,
tools,
prompt,

});

  

// 3. Agent 초기화

const executor = new AgentExecutor({
agent,
tools,
maxIterations: 1,

});

  

// 4. Agent 실행

const result = await executor.invoke({
input: `여기서는 사용자가 원하는 프롬프트를 입력하는 곳이다.`,
});

const cleanOutput = result.output

.replace(/^Here is a 4-line analyst report in Korean:\s*/, "")
.replace(/^.*본문:\s*/, "")
.trim();

  

return cleanOutput;
}

즉 Agent를 사용하여 RAG 기능을 구체적으로 구현하는 것이다. Agent는 이 LLM 모델만으로 사용자가 원하는 값이 나오기 까지 적절한지 판단하여 추가적인 기능(tools)이 필요하면 RAG 기능중 하나를 사용하여 사용자가 원하는 대답이 나오게 효율적으로 판단하여 값을 생성한다.

위 사진은 agent 과정을 나타내는 것이다.

Agent는 대규모 언어 모델(LLM)을 기반으로 하며, 사용자의 질문이나 요청을 이해하고 처리하는 지능형 시스템이다. 즉 쉽게 생각하면 LLM이 내부나 외부도구가 필요한지 판단하는 것이다.

이러한 langchain을 이용하여 효율적이고 향상된 llm 모델의 답변을 얻을 수 있을뿐만 아니라 특정 분야에 대한 답변도 받을 수 있기에 더욱이 효율적인 시스템이라고 생각하고 있어서 이번 프로젝트에서 사용하게 됐다.

p.s 물론 아직 고칠부분이 많이 있긴하지만...

랭체인에 대한 설명
랭체인 사용법
랭체인 공식사이트

0개의 댓글

관련 채용 정보