- [LangChain] LangChain으로 HuggingFace Model Inference 하기2025년 01월 26일
- Cat_Code
- 작성자
- 2025.01.26.오후05:50
LangChain에서 다양한 모델과 LLM API를 연계해서 사용이 가능하다!!
OpenAI나 Claude, Gemma와 같이 유명 API를 활용한다면 손쉽게 LangChain에 연결을 할 수 있다.
그러나 해당 API의 경우 일정 금액의 과금이 필수적이다.
물론 최근들어 LLM API의 가격이 지속해서 내려가고 있는 추세이지만,
우리같이 한푼한푼이 아쉬운 사람들 위해서 무료로 LLM을 LangChain 사용할 수 있는 방법이 있다.
바로 HuggingFace를 활용하는 것이다.
HuggingFace Hub?
HuggingFace Hub는 머신러닝 분야에서 가장 큰 오픈 소스플랫폼중 하나로 90만개 이상의 모델, 20만개 이상의 데터셋 30만개 이상의 데모 앱을 호스팅하고 있는 플랫폼이다.
다양한 task와 분야의 모델들이 배포되어 있고, Meta, Google, Nvidia등 큰 회사들의 모델도 해당 플랫폼을 통해서 배포되고 있다.
또한 무료로 해당 모델의 가중치를 다운로드 받고 공유할 수 있다.
LangChain에서 HuggingFace Model Inference 하기
필수 라이브러리 설치
HuggingFace와 LangChain을 활용하려면 아래와 같은 라이브러리 설치가 필수적이다
pip install langchain pip install langchain_huggingface pip install huggingface_hub transformers datasets
lanchain_huggingface의 경우 huggingface model을 langchain에 쉽게 연결할 수 있는 라이브러리이다.
HuggingFace Token 발급하기
우선 아래 허깅페이스로 이동해서 가입을 해준다.
Hugging Face – The AI community building the future.
huggingface.co
이후 아래 URL로 이동하여서 토큰을 발급한다.
User access tokens
Collaborate on models, datasets and Spaces
huggingface.co
토큰 발급 후 토큰의 Key를 복사해둔다
(참고로 Key 의 경우 해당 창을 닫으면 다시 볼 수 없기 때문에 안전한 곳에 백업하는 것을 추천)
이제 Inference를 위한 준비는 모두 끝이 났다.
HuggingFace Model을 Inference하는 방법에는 크게 2가지가 있다.
1. HuggingFace Hub에 배포된 모델로 Inference 하는 방법 (해당 방법의 경우 API를 사용하는 것)
2. HuggingFace Hub에 모델을 Local에서 Inference 하는 방법 (로컬 머신에 충분한 GPU가 존재해야함)
HuggingFace Hub에 배포된 모델 추론 (Inference)
LLM 리더 보드 :
Open LLM Leaderboard - a Hugging Face Space by open-llm-leaderboard
huggingface.co
한글 LLM 리더 보드:
Open Ko-LLM Leaderboard - a Hugging Face Space by upstage
huggingface.co
위 URL은 전세계 LLM 리더보드와 한글 LLM 모델 리더보드이다.
필요에 따라서 모델을 검색하여 선택할 때 도움이 된다.
해당 URL에서 사용할 모델을 선택하고 모델 ID를 복사해두자
그리고 아래 코드에 repo_id 에 해당 ID를 입력해주면된다.
또한 위에서 복사해둔 token key는 HUGGINGFACEHUB_API_TOKEN에 등록해두면된다.
(참고로 llama 모델은 추가적인 인증을 받아야함 !!)
from langchain_core.prompts import PromptTemplate from langchain_core.output_parsers import StrOutputParser from langchain_huggingface import HuggingFaceEndpoint import os os.environ['HUGGINGFACEHUB_API_TOKEN'] = 'Your HuggingFace Hub Key' # huggingface hub model repo id repo_id = 'mistralai/Mistral-7B-Instruct-v0.2' # 질문 question = 'Who is great football player?' # 템플릿 template = """Question: {question} Anser: """ # 프롬프트 템플릿 생성 prompt = PromptTemplate(template=template, input_variabels=["question"]) # HuggingFace 모델 생성 llm = HuggingFaceEndpoint( repo_id=repo_id, task="text-generation", temperature = 0.5, max_new_tokens = 256 ) # Chain 생성 및 실행 chain = prompt | llm | StrOutputParser() print(chain.invoke({"question": question}))
주요 변수를 분석하면 아래와 같다
template : 프롬포트의 템플릿에 사용할 프롬포트 지정
prompt : template을 프롬포트 템플릿으로 사용
llm : 사용할 LLM 모델과 해당 모델의 파라미터 지정하여 인스턴스로 생성
chain : `prompt | llm | StrOutputParser()` 처럼 각 단계의 output을 연결주는 파이프라인을 하나의 인스턴스로 생성
해당 코드를 활용해보면 확실히 모델별로 배포 환경이 달라서 그런지 돌아오는 응답시간의 차이가 엄청나게 많이 난다.
또한 10GB 넘어 가는 모델의 경우 API를 제공해주지 않기 때문에 사용할 수 가 없다.
HuggingFace Hub의 모델을 Local에서 추론하기 (Inference)
달리지는 부분은 모델을 다운로드 받을 경로 지정과, HuggingFaceEndpoint 객체를 HuggingFacePipeline 객체로 변경해주기만 하면된다.
HF_HOME에 다운받을 경로를 지정해주면된다.
import os os.environ['HF_HOME'] = 'Your local dir to download model' from langchain_core.prompts import PromptTemplate from langchain_core.output_parsers import StrOutputParser from langchain_huggingface import HuggingFacePipeline # HuggingFace Model repo ID model_id = 'mistralai/Mistral-7B-Instruct-v0.2' # 질문 question = 'Who is great football player?' # 템플릿 template = """Question: {question} Anser: """ # 프롬프트 템플릿 생성 prompt = PromptTemplate(template=template, input_variables=["question"]) # HuggingFacePipeline 객체 생성 llm = HuggingFacePipeline.from_model_id( model_id = model_id, device=0, task="text-generation", model_kwargs={ "do_sample": True, "temperature": 0.1, "max_length" : 64 } ) # Chain 생성 및 실행 chain = prompt | llm | StrOutputParser() print(chain.invoke({"question": question}))
전체적인 구조는 비슷하지만 다른점은 HuggingFacePipeline 객체를 사용해서 LLM 인스턴스를 생성했다는 것이다.
단점?
하지만 해당 방법의 단점은 확실하다
우선 배포된 모델 API를 사용하는 것은 안정적이지 않다 HuggingFace Hub의 환경에 따라 큰 영향을 받고, 다른 유로 API 처럼 안정적이게 제공되지 않는다.
또한 큰 가중치의 모델의 경우 지원하지 않는다.
Local에서 해당 모델을 다운로드 받아서 안정성 있게 할 수 있지만. 이는 GPU 보유를 필수적으로 적으로 만들기 때문에 사실 다른 유로 API보다 지출이 크다 (ollama 같이 CPU로 inferenc할 수 있는 방법도 있다. 물론 LangChain과 연동이 된다)
따라서 안정적인 서비스에 LangChain과 LLM을 연결하고 싶다면 사실 유료 API를 사용하는 것이 더욱 효율적일 것 같다
(
사실 돈이 최고 이다)LangChain과 HuggingFace를 같이 사용하는 것은 코드 디버깅이나 LangChain 공부 정도에서만 활용하는 것이 좋을 것 같다.
'[ML] > LangChain🦜' 카테고리의 다른 글
[LangChain] LangChain 개발 환경 구축 (0) 2025.01.24 다음글이전글이전 글이 없습니다.댓글