랭체인은 말그대로 체이닝이 중요하다.
llm 을 여러번 돌려서 맥락을 연결하여 결과를 뽑는 것을 복습해 보자.
from langchain_ollama import ChatOllama
from modules.environment.loadenv import setLoadDotEnv
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableMap
# .env 파일에서 환경 변수를 로드
setLoadDotEnv()
# LLM
llm = ChatOllama(model="llama3.1:8b")
output_parser = StrOutputParser()
# 1번 프롬프트
prompt1 = ChatPromptTemplate.from_template(
"""
당신은 아주 훌륭한 천문학자 입니다.
사용자가 질문하는 내용에 대해서 천문학자의 관점으로 답변해 주세요.
답변은 간단하게 {result_length}자 이내로 작성해 주세요.
사용자의 질문: {question}
"""
)
# 1번 체인
chain1 = prompt1 | llm | output_parser
# 2번 프롬프트
prompt2 = ChatPromptTemplate.from_template(
"""
결과: {result} \n\n
이 결과를 확인하고 수정할 부분이 있으면 수정하여 알려 주세요.
가급적 원본을 유지하면서 수정하여 알려 주세요.
"""
)
# 2번 체인 - 3개 파라미터 전달 방식
chain2 = { "result": chain1 } | prompt2 | llm | output_parser
# 3번 프롬프트
prompt3 = ChatPromptTemplate.from_template(
"""
결과: {result} \n\n
이제 사용자의 수준에 따라서 결과를 수정하고 알맞은 길이로 맞출 것입니다.
사용자의 수준은 {grade} 이고, 답변의 길이는 {result_length}자 이내로 작성해 주세요.
"""
)
# 3번 체인
chain3 = (
RunnableMap({
"result": chain2,
"grade": lambda x: x["grade"],
"result_length": lambda x: x["result_length"]
})
| prompt3
| llm
| output_parser
)
result = chain3.invoke({
"question": "지구의 자전은 어떻게 하나요?",
"result_length": "100",
"grade": "초등학교 1학년"
})
print(result)
꽤 만족스러운 결과가 나왔다.
지구는 태양을 향해 돌아가는 것이며, 그 시간은 24시간입니다. 지구가 태양을 향해 움직일 때, 태양에 가까워질수록 온도가 더 따뜻하게 됩니다.
지구의 자전은 속도도 빠르며, 하루에 약 1,674km를 이동합니다. 이 정도로 속도를 유지하고 있는 것입니다.
from langchain_ollama import ChatOllama
from modules.environment.loadenv import setLoadDotEnv
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnableMap
# .env 파일에서 환경 변수를 로드
setLoadDotEnv()
# LLM
llm = ChatOllama(model="llama3.1:8b")
output_parser = StrOutputParser()
# 1번 프롬프트
prompt1 = ChatPromptTemplate.from_template(
"""
당신은 아주 훌륭한 천문학자 입니다.
사용자가 질문하는 내용에 대해서 천문학자의 관점으로 답변해 주세요.
이 결과를 확인하고 수정할 부분이 있으면 수정하여 알려 주세요.
가급적 원본을 유지하면서 수정하여 알려 주세요.
이제 사용자의 수준에 따라서 결과를 수정하고 알맞은 길이로 맞출 것입니다.
사용자의 수준은 {grade} 이고, 답변의 길이는 {result_length}자 이내로 작성해 주세요.
질문 : {question}
"""
)
chain1 = prompt1 | llm | output_parser
result = chain1.invoke({
"question": "지구의 자전은 어떻게 하나요?",
"result_length": "100",
"grade": "초등학교 1학년"
})
print(result)
어느것이 좀더 정확한건지... 잘은 모르겠지만...
일단 개소리는 면했다.
당신이 묻는것은 지구가 회전하는 방법입니다.
지구는 동쪽에서 서쪽으로 움직이며 밤에는 별을 볼 수 있어요. 이렇게 지구를 돌리는 것을 '자전'이라고 해요.
예를 들어, 새벽에는 동쪽에서 태양을 볼 수 있고, 낮에는 북쪽에서 햇빛이 온다는 뜻입니다.
지구는 자기 시간대로도 움직이고, 그로인해 우리는 아침에 일어나서 저녁에 잠드는 이유 중 하나죠!
# print(result)
for chunk in result:
print(chunk, end="", flush=True)