LlamaCpp + Langchain 이 된다... Langchain 기능을 뒤져보다가 llm 코너에서 발견!
https://python.langchain.com/docs/integrations/llms/llamacpp/
Ollama 도 되고... llama.cpp 도 되고... 허깅페이스도 되고... 다~ 된다.
% pyenv install 3.13.3
% pyenv local 3.13.3
% uv venv .venv
% source .venv/bin/activate
콜백 기능도 사용 가능한데 이게 반환을 Stream으로 해줘서 일반적인 함수는 적용이 안된다.
from langchain_community.llms import LlamaCpp
from langchain_core.callbacks import CallbackManager, BaseCallbackHandler
from langchain_core.prompts import PromptTemplate
# 1. 커스텀 콜백 핸들러 정의
# 모델이 새로운 토큰을 생성할 때마다 호출됨
class PrintCallbackHandler(BaseCallbackHandler):
def on_llm_new_token(self, token: str, **kwargs) -> None:
# 토큰 생성 시마다 실시간으로 출력
print(token, end='', flush=True)
# 2. CallbackManager 생성
# 핸들러를 리스트로 받아서 등록할 수 있음
callback_manager = CallbackManager([PrintCallbackHandler()])
# 3. LlamaCpp 모델 설정
# 로컬 모델 경로 지정, 콜백 매니저 연결
llm = LlamaCpp(
model_path="./models/EXAONE-3.5-2.4B-Instruct/EXAONE-3.5-2.4B-Instruct_Q8_0.gguf",
temperature=0.75,
max_tokens=2000,
top_p=1,
callback_manager=callback_manager,
verbose=True
)
# 4. 프롬프트 템플릿 정의
# {question} 자리에 입력을 넣어주는 형식
template = """
질문: {question}
답변:
"""
# 템플릿을 PromptTemplate 객체로 변환
prompt = PromptTemplate.from_template(template)
# 5. 프롬프트와 LLM을 파이프로 연결
# prompt의 결과가 llm 입력으로 전달됨
llm_chain = prompt | llm
# 6. 질문을 주고 결과 받기
result = llm_chain.invoke({"question": "안녕하세요. 제주도는 어떤 곳인가요?"})
# 7. 전체 결과 출력이 필요하면 아래 주석 해제
# print("\n\n=== 최종 결과 ===")
# print(result)
콜백을 설정하지 않으면 그냥 한번에 빡 나온다.