이 책은 <길벗>출판사로 부터 도서를 제공받고 작성한 리뷰입니다.

총평
- 책의 난이도 : ★★★☆☆
- 추천 별점 : ★★★★★
- 추천 독자 : AI 관련된 직군의 개발자 혹은 엔지니어
- 지은이 : 웨이멍 리 (박지은 번역)
- 출판사 : 길벗
AI 모델 계의 Github 허깅페이스를 통해서 우리가 AI 모델을 다운받고 사용하는 것에 대한 기본 책인 허깅페이스 인 액션을 길벗출판사의 도움으로 읽어볼 수 있게 되었다.
사실 이제 AI에 대한 책은 많고 내용도 알차게 잘 서술되어있다보니 굳이 이걸 리뷰에서 다룰 필요는 없는 것 같고.
챕터 7랭체인과 라마인덱스를 사용한 LLM기반 애플리케이션 구축에 대해서 실제로 실습 노트를 적어보고자 한다.
일단 LangChain이라 함은 대규모 언어 모델(LLM)을 활용해서 애플리케이션을 쉽게 만들 수 있도록 해주는 오픈소스 프레임 워크이다. 우리가 LLM을 통해서 개발하려면 빠질 수 없는 툴이다.
랭체인 설치는 간단하다.
pip install langchain
랭체인의 여러 구성요소 중 프롬프트를 템플릿화 하여 제공하는 promptTemplate를 만들보자.
단순한 질문/답변이 있는 템플릿이다.
from langchain import PromptTemplate
template = '''
Question: {question}
Answer:
'''
prompt = PromptTemplate(
template = template,
input_variables = ['question']
)
prompt
흠 책에서는 1.3.11버전을 통해서 검증했다고 되어있는데 저는 에러가 나서 아래와 같이 바꿔서 하니까 되더군요. 위에 코드는 0.대의 오류라고하네요?
from langchain_core.prompts import PromptTemplate
template = '''
Question: {question}
Answer:
'''
prompt = PromptTemplate(
template = template,
input_variables = ['question']
)
prompt
우리는 LLM에게 질문을 던지고 답변을 받는 애플리케이션을 만든다고 보면된다.
다음은 LLM을 선택해야하므로 허깅페이스에서 호스팅하는 LLM부터 시작해보자.
허깅 페이스에 회원가입을 한뒤 해당 경로에서 읽기 토큰 생성을 진행하자.
https://huggingface.co/settings/tokens
Hugging Face – The AI community building the future.
We’re on a journey to advance and democratize artificial intelligence through open source and open science.
huggingface.co
이와 같이 허깅페이스 토큰을 지정한 뒤 허깅페이스의 LLM 활용을 위한 langchain-huggingface를 설치한다.
import os
os.environ['HUGGINGFACEHUB_API_TOKEN'] = ''
!pip install langchain-huggingface
책에서는 zephyr-7b-alpha 모델을 사용해서 그대로 했습니다. 실습을 중간중간 따로 하다보니 그런건지 모르겠는데
이 모델을 단순히 호출하면 안되고, repo_id로 지정하고, provider를 featherless-ai로 지정해야 가능했다.
이는 api 호출방식의 변화 특히 endpoint_url이 deprecated 되는 이슈가 있어서 그런것 같다.
LLM 체인을 이제 생성해 볼텐데 프롬프트 템플릿과 모델(LLM)을 결합해 체인을 만들어 LLM에 대해 쿼리를 실행할 수 있다.
실제로 한번 모델을 호출해서 응답을 받아보자.
from langchain_huggingface import HuggingFaceEndpoint, ChatHuggingFace
from langchain_core.output_parsers import StrOutputParser
hub_llm = HuggingFaceEndpoint(
repo_id="HuggingFaceH4/zephyr-7b-beta",
provider="featherless-ai",
max_new_tokens=256,
)
chat = ChatHuggingFace(llm=hub_llm)
llm_chain = prompt | chat | StrOutputParser()
print(llm_chain.invoke({"question": "Who is Elon Musk?"}))

응답을 잘 받는것을 확인할 수 있다.

다만 이와 같이 다음 질문을 넘기게되면 메모리가 없기 때문에 he라는 대상을 알지 못한다.
이럴때 우리는 체인을 생성한다.
아래와 같이 history 변수에 기존에 응답을 담도록 하고 while 루프에 두면 해당 세션에서는 질문을 계속 누적해서 메모리에 둘 수 있다.
다만 이 해당 메모리 값이 response를 담기 때문에 저 수많은 단어들(즉 토큰)이 모두 축적되게 된다는 단점이 생긴다. (이는 사실 추후에 생각하도록하자)

이 방식을 직접 지원하는 클래스가 있는데 RunnableWithMessageHistory 클래스가 바로 그것이다.
/opt/anaconda3/lib/python3.12/site-packages/IPython/core/interactiveshell.py:3577: LangChainDeprecationWarning: RunnableWithMessageHistory is deprecated. Use LangGraph's built-in persistence instead. exec(code_obj, self.user_global_ns, self.user_ns)
근데 보니까 이것도 deprecated 되는것 같네요?
난 아래 코드로 호출확인을 해보았다.
특히 2번째 PromptTemplate를 import할때 langchain_core.prompts 를 넣어줘야 가능했다.
import os
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_huggingface import HuggingFaceEndpoint
from langchain_core.runnables.history import RunnableWithMessageHistory
os.environ['HUGGINGFACEHUB_API_TOKEN'] = ''
template = '''
Question: {question}
Answer:
'''
prompt = PromptTemplate(
template = template,
input_variables = ['question']
)
hub_llm = HuggingFaceEndpoint(
endpoint_url="https://api-inference.huggingface.co/models/HuggingFaceH4/zephyr-7b-alpha",
temperature = 1
)
class SessionHistory:
def __init__(self):
self.messages = []
def add_messages(self, messages):
self.messages.extend(messages)
def get_messages(self):
return self.messages
session_history = SessionHistory()
def get_session_history():
return session_history
llm_chain = RunnableWithMessageHistory(
prompt | chat | StrOutputParser(),
get_session_history = get_session_history
)
while True:
# get the user input
user_question = input("Ask a question (type 'exit' to stop): ")
# exit condition
if user_question.lower() == "quit":
print("Ending conversation.")
break
# prepare the input data
input_data = {"question": user_question}
response = llm_chain.invoke(input_data)
session_history.add_messages([
{"role": "user", "content": user_question},
{"role": "assistant", "content": response}
])
# display the response
print(f"AI: {response}")

다음은 이제 허깅페이스 모델이 아니라 openai와 같은 상용 api를 사용하는 경우이다.
openai 모델 활용시에도 openai_api_key를 등록하고 langchain_openai에서 클래스를 임포트 해서 사용하면된다.
from langchain_openai import ChatOpenAI
import os
os.environ["OPENAI_API_KEY"] = "sk-123"
llm = ChatOpenAI(model="gpt-4o-mini")

자 여기 까지 실습을 잘 했다면, 다음 단계는 RAG 기법을 통해서 우리 데이터를 직접 임베딩 해서 사용하는 방법을 책에서 소개하고 있다. 책에서 제공한 코드는 영어 전용 모델이라서 한국어가 가능한 다른 모델을 찾아서 사용하는 것을 추천한다.
이상으로 실습은 여기까지로 마치고, 내 로컬모델을 활용해 애플리케이션을 개발해보고 싶은 사람이라면 적극 추천한다.
참고로 책이 1년전 출판된 책이다보니 AI 발전상 1달만 있어도 변화가 있는듯하다. 그래서 옆에 gpt혹은 claude를 두고 같이 학습하는걸 권한다.
책에 대한 코드는 아래 깃헙에서 확인할 수 있다.
https://github.com/weimenglee/HuggingFaceInAction
GitHub - weimenglee/HuggingFaceInAction: Source Code for Hugging Face In Action (Manning)
Source Code for Hugging Face In Action (Manning). Contribute to weimenglee/HuggingFaceInAction development by creating an account on GitHub.
github.com
'도서리뷰 > IT 도서' 카테고리의 다른 글
| [한빛미디어] <끌림의 설계> 리뷰 - UX에 대한 철학적 고찰 (0) | 2026.09.26 |
|---|---|
| 길벗 <좋은 코드리뷰 나쁜 코드리뷰> 리뷰 - 코드리뷰는 커뮤니케이션의 연장선 (0) | 2026.08.29 |
| (길벗) <현장에서 픽하는 AI 서비스 기획을 위한 필수 지식> 리뷰 - 내 서비스에 어떻게 AI를 도입할까에 대한 해결책! (0) | 2026.08.25 |
| 길벗 <처음 만드는 AI 에이전트 서비스> 리뷰 - 에이전트 서비스를 만들면서 직접 배우자! (0) | 2026.08.11 |
| 한빛미디어 <주니어 AI 엔지니어가 반드시 알아야 할 실무 지식> 리뷰 - 모델이 더 좋아지더라도 오류가 더 많아지는 것에 관하여 (0) | 2026.08.09 |