본문 바로가기
딥러닝 머신러닝 데이터 분석/Langchain & LLM

[LangChain] LLM 여러대를 하나의 프로젝트에 운용해 보자

by SteadyForDeep 2024. 4. 4.
반응형

이전 글 참고

2024.03.28 - [딥러닝 머신러닝 데이터 분석/Langchain & LLM] - [LangChain] 맛집 찾아주는 LLM을 만들어 보자.

 

[LangChain] 맛집 찾아주는 LLM을 만들어 보자.

아래의 글에 선행 내용이 있다. 2024.03.24 - [딥러닝 머신러닝 데이터 분석/Langchain & LLM] - [Langchain coding bot] 랭체인을 이용해서 코딩을 해 보자 - 1 [Langchain coding bot] 랭체인을 이용해서 코딩을 해 보

davi06000.tistory.com

 

코드는 깃헙 참고

https://github.com/hyun06000/langchain-matzip-multi

 

GitHub - hyun06000/langchain-matzip-multi

Contribute to hyun06000/langchain-matzip-multi development by creating an account on GitHub.

github.com

 

이전 글을 작성하면서 단지 도구 속에 녹아 있는 LLM 이 아니라

실재 전문가 한명 분의 역할을 하는 LLM을 여러대 두고 서로 소통하게 한다면

성능이 더 나아지지 않을까 하는 생각이 들었다.

 

// 전략

 

전략은 이렇다.

각각의 LLM에 대해서 독립된 엔드포인트를 가진 서버를 열어준다.

그리고 각 LLM은 http를 통해 소통할 수 있는 네트워크를 가진다.

 

전체 프로젝트를 아우르는 수퍼바이저가 하나 있고

그 수퍼바이저의 진행에 따라 각 질문의 대답을 생성해 주는 전문가 LLM을 배치한다.

 

 

 

// 메모리

우선은 전문가 LLM을 만들기 위해서 해당 분야에 대한 지속적인 대화를 이어나갈 필요가 있다.

지도면 지도, 블로그면 블로그, 이런 식으로 해당 분야에서 만큼은 다른 프롬프트의 간섭 없이

프로젝트 전체의 컨텍스트를 모두 가지고 있어야 한다.

 

그러기 위해서 메모리를 사용해 보자.

위의 코드는 가장 간단한 형태의 FastAPI와 메모리를 이용해서 대화를 쌓아가는 방식이다.

API가 호출될때마다 새로 메모리를 만들지 않도록 전역변수로 생성해 주었다.

 

hi 1 에 대해서 AI 가 답변한 시나리오다.

hi 5 까지 넣었을 때 결과인데 코드에서 k값을 4로 주었기 때문에 최근 4개의 대화만을 저장하는 것을 알 수 있다.

 

이제 LLM 을 추가해서 간단한 대화를 나누면서 문맥을 이어서 사고할 수 있는지 알아보자.

 

애플에 관해 물어봤다.

 

{
  "ai_answer": "{
  	'prompt': 'tell me about apple in a short sentence.',
  	'chat_history': '',
  	'text': ' Apple is a multinational technology company known 
    		for its popular products such as the iPhone, iPad, and Mac computers.'
   }"
}

대답으로 애플 회사를 알려줬다.

 

다짜고짜 달콤하다고 해보자.

 

{
  "ai_answer": "{
  	'prompt': 'As I know, It is very sweet.',
    'chat_history': 
    	'Human: tell me about apple in a short sentence.
         AI:  Apple is a multinational technology company known 
        		for its popular products such as the iPhone, iPad, and Mac computers.',
    'text': ' Yes, apples are known for their sweetness 
    			and are often used in desserts and snacks.
                They are also a good source of vitamins and nutrients.'
   }"
}

애플이라는 것을 정확하게 기억하고 있다가 과일의 특징을 나열해 주었다.

 

이제 이 기능을 잘 활용해서 전문가  LLM을 하나 만들자.

 

//전문가 LLM

내가 자주 사용하는 CoT를 위한 프롬프트의 가장 끝단이다.

여기서 이전의 대화를 알려주는 인디케이터를 하나 두고  chat_history라는 플레이스홀더를 하나 추가했다.

 

그리고 메모리를 생성하면서 chat history 라는 메모리 키를 주면 해당 메모리를 같은 이름의 플레이스홀더에 붙여넣게 된다.

 

API콜이 들어올때마다 메모리가 초기화되는 것을 방지하기 위해서

LLM과 메모리, 에이전트 등의 설정은 모두 함수 밖의 전역변수로 지정해 두었다.

나중에는 Builder 를 따로 설계해서 조금더 안전하고 가독성 있게 코드를 짤 수 있을 것이다.

 

//블로그 검색 전문가LLM

이 부분은 블로그 검색 전문 LLM을 선언하는 부분이다.

CoT를 이용해서 원하는 결과를 얻을 때까지 블로그를 검색하도록 하였고 결과값을 반환하여 수퍼바이져에게 전달하게 된다.

결과값은 블로그를 돌아다니면서 얻게된 정보들을 취합하여 요약한 문장이다.

 

//지도 전문가 LLM

장소를 검색하는 기능 역시 CoT 를 이용한 검색을 진행한다.

구글 플레이스 API를 활용하여 별점과 별점에 참여한 사람의 수 그리고 주소 등의 정보를 얻어온다.

그리고 API의 결과인 JSON형태를 그대로 전달하는 것이 아니라

스스로 판별하고 중요한 정보만을 요약해서 수퍼바이저에게 전달하게 된다.

 

//번역 전문가 LLM

이번에는 따로 CoT를 쓰지 않고 번역만을 위한 LLM을 배치했다.

이 LLM은 질문이 여러번 들어올 수록 이전의 컨텍스트를 활용해 더 매끄러운 문장을 번역해 낼 수 있다.

마지막에 인디케이터를 주고 끝냄으로 필요없는 수식구문을 제거하도록 하였다.

 

 

//수퍼바이저

수퍼바이저는 각각의 전문가  LLM을 이용하는 에이전트로 CoT를 통해서 적절한 타이밍에 전문가를 이용하도록 하였다.

 

블로그 전문가와 소통하는 예시인데 간단하게 엔드포인트로 프롬프트를 전달하는 리퀘스트를 날리게 된다.

 

 

// 실행

각각의 서버를 포트번호에 맞춰서 열어준다.

그리고 수퍼바이저를 실행하도록 했다.

 

 

 

 

왼쪽 위가 수퍼바이저 나머지는 전문가 LLM을 배치한 화면이다.

LLM이 다른 LLM과 소통하면서 정보를 취득해 나가는 과정을 볼 수 있다.

반응형

댓글