[AI] Langchain 복습 - 3

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

AI : Langchain (RAG)

목록 보기
13/38
post-thumbnail

한땀한땀 질문해서 얻는것도 좋지만 한번에 여러개의 결과물을 얻고 싶다...
invoke 대신에 batch 를 사용하여 굴려보자.

같은 주제로 수준별 결과를 내어보았다.

1. 전체 코드

from langchain.prompts import ChatPromptTemplate
from langchain_community.chat_models import ChatOllama
from langchain.schema.output_parser import StrOutputParser
from langchain.schema.runnable import RunnableMap

# llm 과 파서 정의
model = ChatOllama(model="llama3.1:8b")
output_parser = StrOutputParser()

# 1-1. 프롬프트 정의
prompt1 = ChatPromptTemplate.from_template("옥스포드 사전에서 {topic}에 대해 간단히 설명해주세요.")

# 1-2. 체인 생성
chain = prompt1 | model | output_parser

# 2-1. 프롬프트 정의
prompt2 = ChatPromptTemplate.from_template("""결과 : {result} \n\n
                                           결과를 바탕으로 {level} 수준으로 다시 설명해주세요.
                                           """)

# 2-2. 체인 생성
chain2 = RunnableMap({"result": chain, "level": lambda x: x["level"]}) | prompt2 | model | output_parser

# 이부분에서 level 을 3개 두고 싶은데...
levels = ["초등학생", "중학생", "고등학생"]

# invoke 메서드가 아닌 batch 메서드 사용
results = chain2.batch([{"topic": "한국", "level": level} for level in levels])

for level, result in zip(levels, results):
    print(f"수준: {level}")
    print(result)
    print("--------------------------------")

1-1. 결과

뭔가 또 이상한 결과를 내긴 했는데 3가지 수준의 대답을 얻긴 했다.

수준: 초등학생
"한국"이라는 단어는 다른 이름인 '조선'이 포함되어 있습니다.

1) 한반도는 크게 북쪽과 남쪽으로 나뉘는데, '북한'(조선민주주의인민공화국)은 조선의 일부입니다. 한국(韓國)은 한반도의 남쪽 부분을 말합니다. 한국은 1948년부터 지금까지 독립된 국가가 되어 왔습니다.

2) '한국'이라는 이름으로 불리는 역사적 이름은 기원전 2333년에 시작해서 기원후 668년에 끝났습니다.
--------------------------------
수준: 중학생
한국은 동아시아의 북쪽에 위치한 국가입니다.

오크스포드 사전에 따르면, 한국은 다음과 같이 정의되어 있습니다.

1.  **국가 이름:** "조선"
2.  **위치:**
    *   한국은 동아시아에서 가장 큰 섬입니다.
    *   북쪽에는 러시아와 접합니다.
    *   서쪽에는 만해와 접하고, 남쪽에는 일본과 접합니다.
3.  **언어:** 한국어
4.  **수도:** 서울
5.  **인구:** 약 51만 명 (2021년 기준)
6.  **면적:** 약 10만 7천 km²

한국의 역사와 문화는 다음과 같습니다.

-   **고대 삼국시대:** 한국의 역사가 시작되었습니다.
-   고려시대: 중국과 교역관계를 맺었으며, 
-   조선시대: 만해와 접해있는 지역을 다스리기 위해 나라가 세웠습니다.

한국은 20세기 초부터 서구의 영향을 받아 현대화되기 시작했습니다.
--------------------------------
수준: 고등학생
그럼 아래와 같이 설명합니다.

한국은 한반도가 중국의 서쪽, 일본의 동쪽에 위치한 동아시아 국가입니다.
--------------------------------

2. stream 사용

stream 하는 단위만큼 실시간으로 결과물을 쭉 이어서 보여준다.

# 각 레벨별로 실행
for i, level in enumerate(levels):
    print(f"\n----- {level} 수준 설명 -----")
    # 스트리밍 결과 처리 (하나의 입력에 대해 스트리밍)
    for chunk in chain2.stream({"topic": "한국", "level": level}):
        print(chunk, end="")
    print("\n--------------------------------")
profile
인공지능이라는 옷을 입었습니다. 뭔가 멋지면서도 잘 맞습니다.

0개의 댓글