오늘은 langchain의 특징을 살려 이전에 설치했던 Meta의 인공지능 언어 모델 llama 3.1의 부족한 부분을 보완하는 방법에 대해 이야기하려 합니다.
Llama 3.1의 한계를 LangChain으로 보완하기
1. Llama 3.1 8B의 한계
5기가 바이트도 안 되는 용량에 비해 뛰어난 성능이라 평가받는 llama 3.1, 최근 업데이트로 한글 능력도 어느 정도 인정할만하다는 평가를 받고는 있습니다. 하지만, 이러한 호평에서도 llama 3.1을 자주 사용하다 보면 우리는 쉽게 그 능력의 한계를 찾을 수 있기도 합니다.
아래 그림은 그 예중 하나인데요, llama에게 "오늘의 비트코인 추세에 대해 말해줘?" 요청했더니, 아래 그림과 같이 대답을 합니다.
라마 3.1의 대답을 옮겨 적어보면 아래와 같습니다.
However, I'm a large language model, I don't have real-time access to current market data. But I can suggest some
ways for you to find out the latest Bitcoin trend:
1. **CoinMarketCap**: This website provides up-to-date information on cryptocurrency prices, including Bitcoin.
2. **Google Finance**: You can search for "Bitcoin price" or "BTC/USD" to see the current market price and trends.
3. **CoinGecko**: Similar to CoinMarketCap, this platform offers real-ime data on cryptocurrency prices, including Bitcoin.
4. **News websites**: Websites like Coindesk, The Block, and CNBC often publish articles and updates on Bitcoin and other cryptocurrencies.
Please note that cryptocurrency markets can be highly volatile, so trends may change rapidly. If you're interested in investing or trading in Bitcoin, it's essential to stay informed about market conditions.
Would you like me to provide more information on how to find reliable sources for market data?
현재 라마 3.1는 실시간 마켓 데이터에는 접근할 수 없다고 하네요. 이러한 경우 LangChain이라는 프레임워크를 사용하면 기능을 보완해 줄 수 있습니다.
2. LangChain (랭체인)
LangChain은 언어 모델을 활용한 애플리케이션 개발을 위한 오픈소스 프레임워크입니다. 질문 답변, 챗봇, 텍스트 요약 등의 작업을 수행할 수 있는 AI 기반 애플리케이션을 구축하기 위한 도구와 구성 요소를 제공합니다.
LangChain의 주요 기능은 다음과 같습니다.
- 체이닝(Chaining): 체이닝은 말 그대로 여러 단계를 "사슬처럼 연결"하는 것입니다. 예를 들어, 먼저 AI가 사용자로부터 질문을 받습니다. 그런 다음 그 질문에 맞는 정보를 검색하고, 검색한 정보를 바탕으로 답변을 생성합니다. 마지막으로, 그 답변을 사용자에게 전달하는 일련의 과정이 체이닝입니다. LangChain은 이러한 여러 단계를 하나로 묶어 효율적으로 처리할 수 있게 해 줍니다.
- 프롬프트(Prompt): 프롬프트는 AI에게 무엇을 해야 할지 알려주는 "명령문" 같은 것입니다. 프롬프트가 명확하고 구체적일수록 AI는 더 정확한 답변을 줄 수 있습니다. LangChain은 이러한 프롬프트를 쉽게 관리하고 최적화할 수 있는 도구를 제공합니다.
- 메모리(Memory): 메모리는 AI가 대화를 계속할 때 이전에 나눈 대화 내용을 기억하게 하는 기능입니다. 예를 들어, 사용자가 이전에 말한 내용을 기억하고, 그 정보를 바탕으로 다음 대화를 이어갈 수 있습니다. LangChain을 사용하면 이 메모리 기능을 쉽게 추가할 수 있습니다.
- 에이전트(Agent): 에이전트는 사용자의 질문이나 명령에 따라 스스로 판단하고 작업을 수행할 수 있는 AI입니다. 예를 들어, 어떤 명령을 내렸을 때 그 명령을 수행하기 위해 필요한 도구를 알아서 사용하고, 그 결과를 알려주는 역할을 합니다. LangChain을 이용하면 이러한 AI 에이전트를 만들 수 있습니다.
- 데이터 통합(Data Integration): LangChain은 AI가 더 똑똑하게 작동하도록 도와줍니다. 예를 들어, 인터넷에서 실시간으로 정보를 검색하거나, 데이터베이스에 있는 자료를 참고할 수 있게 합니다. 이렇게 다양한 데이터 소스를 AI가 활용할 수 있게 해주는 것이 데이터 통합 기능입니다.
- 모델 통합(Model Integration): LangChain은 다양한 AI 모델(GPT-3, DALL-E 등)을 지원합니다. 이것은 여러 종류의 AI를 필요에 따라 쉽게 사용할 수 있다는 것을 의미합니다. 예를 들어, 텍스트 생성이 필요하면 GPT-3을 사용하고, 이미지를 생성해야 한다면 DALL-E 같은 모델을 쓸 수 있습니다.
결론적으로, LangChain은 AI 애플리케이션 개발을 훨씬 더 쉽게 해주는 도구입니다. 복잡한 과정을 자동화하고, 필요한 기능을 쉽게 통합할 수 있게 해 줘서, AI 개발에 대한 전문 지식이 없는 사람도 효과적인 AI 기반 애플리케이션을 만들 수 있도록 도와줍니다.
3. LangChain으로 Llama 3.1 능력 확장하기
자, 이제 앞서 설명한 랭체인의 장점 중 2번 프롬프트와 5번 데이터 통합 부분에 해당하는 특징을 직접 파이썬 코드로 구현하여 라마에 적용해 보겠습니다.
우선, 파이썬 랭체인 모듈을 설치합니다.
pip install langchain
이전 글 "Meta AI의 Llama3.1 다운로드 및 설치 방법 그리고 WebUI 1of2"에서 Ollama를 통해 Llama 3.1을 설치하고 실행했었습니다. 때문에 현재 환경은 Ollama와 연결해야만 llama 3.1와 통신할 수 있는 환경이라는 거죠.
ollama의 파이썬 관련 github 페이지를 보면, 아래와 같이 client를 어떻게 구성해야 하는지 자세하게 나옵니다. 이 외에도 여러 정보를 확인해 볼 수 있어요.
ollama와 통신하는 방법도 확인했으니, 이제 랭체인을 구성하도록 해 보겠습니다.
우선, 랭체인의 "LLM"이라는 추상 클래스를 상속받아 클래스를 정의합니다.
class TestLangCainLLM(LLM):
model: str
endpoint: str
def __init__(self, model: str, endpoint: str):
super().__init__(model=model, endpoint=endpoint)
__init__ 메서드를 정의합니다. 이는 이 클래스를 호출할 때 앞에서 확인한 ollama와 통신하기 위해 약속된 URL과 모델명을 넘겨주기 위해서 여기에 정의합니다. 추후 "TestLangChainLLM" 클래스를 다음과 같이 호출할 거예요.
llm = TestLangCainLLM (
model="llama3.1:8b",
endpoint="http://localhost:11434/api/generate"
)
상속받은 LLM 클래스에서 반드시 구현해야만 하는 메서드는 "__call" 메서드입니다. 이 메서드는 주어진 프롬프트에 대해 LLM을 호출하고 그 결과를 반환하는 역할을 합니다. 즉, 단순하게 말하면 이 메서드에서 ollama를 통해 llama 3.1과 통신하게 되는 것입니다.
때문에 이 메서드 안에서 라마에게 요청하고 응답을 받는 형식을 구현합니다. 아래 같이 "__call" 메서드를 구현하고 다른 필요한 부분들을 추가하여 "TestLangCainLLM" 클래스를 완성합니다.
여기까지가 랭체인을 사용하는 경우 라마와 어떻게 메시지를 주고받는지에 관련된 부분이라면 다음은 외부 데이터를 가져와서 라마에게 넘겨주고 응답받는 부분을 작성합니다.
우선, 외부 데이터를 가져와서 필요한 부분을 라마에게 원하는 대답을 얻기 위해 프롬프트 템플릿을 정의합니다. 이미 랭체인 모듈에서 제공하는 "PromptTemplate"를 이용해 다음과 같이 정의합니다.
final_prompt = PromptTemplate( input_variables=["query", "external_knowledge"],
template="Given the query: '{query}', and based on external knowledge:\n\n{external_knowledge}\n\nGenerate a comprehensive answer." )
"query"는 앞서 라마에게 요청했던 "오늘의 비트코인 추세에 대해 말해줘?"가 될 것이고, " external_knowledge" 부분이 외부에서 가져온 데이터를 직접 적용하거나, 필요한 부분을 추가로 가공하여 활용하게 될 것입니다.
저는 이번의 경우 아래와 같이 외부에서 가져온 데이터를 약간 가공하여 라마에게 전달해 주려합니다.
analysis_text = (
f"Today's Bitcoin opened at {start_price} KRW at 9:00 AM. "
f"The highest price so far is {max_price} KRW, and the lowest price is {min_price} KRW. "
f"As of {current_time}, the current price is {current_price} KRW, which is "
f"{'higher' if current_price > start_price else 'lower' if current_price < start_price else 'the same'} "
f"compared to the opening price."
)
이 " analysis_text" 부분을 나중에 라마의 대답과 비교해 보면 라마가 외부 데이터를 정확하게 인지했는지 확인할 수 있습니다.
이제 비트코인 데이터를 가져올 외부 통신을 연결하는 부분이 남았습니다. 저의 경우 야후나 파이썬에서 지원하는 오픈 데이터를 사용하지 않고 국내 코인 거래소인 업비트 거래소의 API를 활용했습니다. 업비트 API 관련 내용은 따로 주제로 정해서 정리할만한 내용이므로 이번 글에서는 제외합니다.
자, 이제 "query"를 다시 "Can you tell me today's Bitcoin trend?"와 같이 정의하고 라마가 외부 데이터를 받아 앞의 대답과 다르게 요청에 맞는 정확한 대답을 하는지 확인해 보겠습니다.
제 컴퓨터가 느리므로 실행 시간은 1분이 넘게 걸렸지만, 앞서 자신은 할 수 없으니 직접 알아보라는 대답 대신 아래와 같이 나름 의미 있는 대답을 잘해주었습니다.
라마의 대답 :
Based on the external knowledge provided, here's a comprehensive answer to the query "Can you tell me today's Bitcoin trend?":
"According to my knowledge as of 2024-08-28 12:57:00, today's Bitcoin trend appears to be slightly bullish. Here are the key points I've gathered:
* The opening price was 80947000.0 KRW at 9:00 AM.
* The highest price so far reached is 81416000.0 KRW.
* The lowest price reached is 80500000.0 KRW, which indicates a relatively stable price range throughout the day.
* As of my knowledge cutoff (2024-08-28 12:57:00), the current price is 81360000.0 KRW, which is higher compared to the opening price.
Overall, it seems that Bitcoin has maintained a steady upward trend today, with a moderate gain from its opening price. However, please note that this information may not reflect any further market movements or changes after my knowledge cutoff time."
Please keep in mind that this answer reflects only the information provided and is subject to change based on actual market developments.
오늘은 랭체인을 이용하여 라마 3.1의 기능을 향상해 봤습니다. 다음은 OpenAI의 챗GPT에 랭체인을 연동하는 방법도 생각해 볼만하겠습니다.