[AI] Langchain 복습 - 2

늘 공부하는 괴짜·2025년 4월 5일
0

AI : Langchain (RAG)

목록 보기
12/38

랭체인은 말그대로 체이닝이 중요하다.
llm 을 여러번 돌려서 맥락을 연결하여 결과를 뽑는 것을 복습해 보자.

1. 실제 연습 코드

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)

1-1. 결과

꽤 만족스러운 결과가 나왔다.

지구는 태양을 향해 돌아가는 것이며, 그 시간은 24시간입니다. 지구가 태양을 향해 움직일 때, 태양에 가까워질수록 온도가 더 따뜻하게 됩니다.

지구의 자전은 속도도 빠르며, 하루에 약 1,674km를 이동합니다. 이 정도로 속도를 유지하고 있는 것입니다.

2. 그렇다면 질문을 모두 합쳐서 1번만 날리면?

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)

2-1. 결과

어느것이 좀더 정확한건지... 잘은 모르겠지만...
일단 개소리는 면했다.

당신이 묻는것은 지구가 회전하는 방법입니다.

지구는 동쪽에서 서쪽으로 움직이며 밤에는 별을 볼 수 있어요. 이렇게 지구를 돌리는 것을 '자전'이라고 해요.

예를 들어, 새벽에는 동쪽에서 태양을 볼 수 있고, 낮에는 북쪽에서 햇빛이 온다는 뜻입니다.

지구는 자기 시간대로도 움직이고, 그로인해 우리는 아침에 일어나서 저녁에 잠드는 이유 중 하나죠!

3. 동작하는 것을 실시간으로 보려면?

# print(result)

for chunk in result:
    print(chunk, end="", flush=True)
profile
인공지능이라는 옷을 입었습니다. 뭔가 멋지면서도 잘 맞습니다.

0개의 댓글