from langchain_ollama import ChatOllama
from langchain_core.prompts import SystemMessagePromptTemplate, HumanMessagePromptTemplate, ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
base_url = "http://localhost:11434"
model = 'llama3'
llm = ChatOllama(base_url=base_url, model=model)
# 시스템 메시지 (역할 정의)
system = SystemMessagePromptTemplate.from_template(
"""당신은 사용자 질문에 제공된 문맥을 바탕으로 답변하는 친절한 AI 어시스턴트입니다."""
)
# 사용자 프롬프트 (문맥과 질문 기반 응답)
prompt = """아래 문맥을 기반으로만 사용자 질문에 답변하세요. 문맥에 없는 정보는 "잘 모르겠습니다"라고 답하세요.
### 문맥:
{context}
### 질문:
{question}
### 답변:"""
prompt = HumanMessagePromptTemplate.from_template(prompt) # 사용자 질문에 대한 응답 생성
message = [system, prompt] # 시스템 메시지와 사용자 프롬프트를 결합
template = ChatPromptTemplate.from_messages(message) # 전체 프롬프트 템플릿 생성
chain = template | llm | StrOutputParser() # 프롬프트 체인 생성
def ask_llm(context, question):
return chain.invoke({'context': context, 'question': question})
def ask_llm_stream(context, question):
"""LLM에 스트리밍 모드로 질문하고 토큰 단위로 출력"""
for chunk in chain.stream({'context': context, 'question': question}):
# chunk가 문자열이면 그대로, dict나 객체면 적절히 변환
print(chunk, end="", flush=True)