1차 과제

1주차 과제를 진행한곳 까지 결과물 공유합니다.

랭체인 1-1. 프롬프트와 LLM을 사용한 체인 구성


from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser

# OpenAI API 키 설정
import os

# 프롬프트 템플릿 정의
prompt = PromptTemplate(
    input_variables=["topic"],
    template="안녕 너는 대한민국에서 가장 유명한 개그맨이야. 20살 어른에게 {topic}에 관한 농담을 해줘"
)

json_parser = StrOutputParser()

llm=ChatOpenAI(model="gpt-3.5-turbo")

user_input = input("어떤 주제의 농담이야?: ")

# OpenAI 모델과 연결된 LLMChain 생성
llm_chain = prompt | llm | json_parser

# 질문 실행
response = llm_chain.invoke({"topic": user_input})
print(response)

랭체인 1-2. 여러 체인을 연결하여 복잡한 질문에 답하기


from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser

# OpenAI API 키 설정
import os

# 프롬프트 템플릿 정의
first_prompt = PromptTemplate(
    input_variables=["name"],
    template="what is the city {name} is from? only the city name, not the country the city" 
)

json_parser = StrOutputParser()

llm=ChatOpenAI(model="gpt-3.5-turbo")

user_input = input("who is the person?:")
language = input("what language?")

# OpenAI 모델과 연결된 LLMChain 생성
llm_chain = first_prompt | llm | json_parser

# 질문 실행
city = llm_chain.invoke({"name": user_input})

second_prompt = PromptTemplate(
    input_variables=["city","language"],
    template="what is the country {city} is from? respond in {language}"
)

llm_chain = second_prompt | llm | json_parser
country = llm_chain.invoke({"city": city, "language": language})

print(country)

랭체인 1-3. 분기 및 병합을 활용한 체인 구성

from operator import itemgetter

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.runnables import RunnablePassthrough

# OpenAI API 키 설정
import os

planner = (
    ChatPromptTemplate.from_template("Generate an argument about: {input}")
    | ChatOpenAI()
    | StrOutputParser()
    | {"base_response": RunnablePassthrough()}
)

arguments_for = (
    ChatPromptTemplate.from_template(
        "List the pros or positive aspects of {base_response}"
    )
    | ChatOpenAI()
    | StrOutputParser()
)
arguments_against = (
    ChatPromptTemplate.from_template(
        "List the cons or negative aspects of {base_response}"
    )
    | ChatOpenAI()
    | StrOutputParser()
)

final_responder = (
    ChatPromptTemplate.from_messages(
        [
            ("ai", "{original_response}"),
            ("human", "Pros:\n{results_1}\n\nCons:\n{results_2}"),
            ("system", "Generate a final response given the critique"),
        ]
    )
    | ChatOpenAI()
    | StrOutputParser()
)

chain = (
    planner
    | {
        "results_1": arguments_for,
        "results_2": arguments_against,
        "original_response": itemgetter("base_response"),
    }
    | final_responder
)

response = chain.invoke({"input": "scrum"})
print(response)

이 과제는 docs에 있는것을 거의 그대로 가져왔습니다.

과제1-2를 할 때는 invoke를 두 번 사용하였는데 위의 방식대로 하면 invoke 한 번에 실행할 수 있다는걸 알게 되었습니다.


랭체인 1-4. 체인에 메모리 추가하기



from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain.memory import ConversationBufferMemory
from langchain.chains import LLMChain


# OpenAI API 키 설정
import os

memory = ConversationBufferMemory(memory_key="chat_history")

user_input = input("사람: ")

template = """
    당신은 인간과 대화를 나누는 멋진 챗봇입니다.

    이전 대화: {chat_history}
    사람: {user_input}
"""

prompt = PromptTemplate(
    input_variables=["user_input", "chat_history"],
    template=template
)

llm = ChatOpenAI(model="gpt-3.5-turbo")

llm_chain = LLMChain(
    llm=llm,
    prompt=prompt,
    verbose=True,
    memory=memory,
)


while user_input != "그만":
    response = llm_chain.predict(user_input= user_input)
    print(response)
    user_input = input("사람: ")

Memory 사용 방법에 대해서 검색해보았는데 rangchain 0.1 버전은 deprecated 될 예정이라고 해서 0.2 버전으로 보았는데 별도의 db를 활용하는 방식에 대해서만 안내가 되어 있었던것 같습니다. 그래서 일단 0.1 버전에 대한 docs를 보고 따라했습니다.

Memory를 사용하는게 결과적으로는 이전 대화의 모든 history를 다 보내주는 방식이라서 대화가 길어질수록 토큰이 많이 소모되는게 아닌가? 하는 생각이 들었습니다.


과제후기

과제 진행하면서 궁금했던 내용들(추가적으로 학습이 필요한 내용)

Chat model과 일반 model이 나뉘어져있는것 같은데 각각에 대한 차이점.

StringOutput 파서만 사용했는데 다른 아웃풋 파서는 언제 사용하는건지에 대한 확인 필요

진행 과정에 있었던 이슈

m 시리즈의 맥북에서 발생 할 수 있는 에러라고 한다.

(mach-o file, but is an incompatible architecture (have 'arm64', need 'x86_64')

위와 같은 에러로 파이썬 코드가 실행이 안되었다. GPT에게 물어본 결과 다음과 같이 파이썬 파일을 실행하면 된다고 해서 해결하였다.

arch -arm64 python3 main.py

후기

처음에 어떻게 시작해야 될 지 몰라서 막막했으나 GPT에게 많은 도움을 받았다. 단점은 Langchain 최신 라이브러리를 학습하지 않아서 인지 deprecated 된것들이 많았다.

사례글을 작성하면서 다른분들이 작성한 글들을 보았는데 지피터스에 있는 다른 글들을 참고하면서 과제를 진행했으면 더 쉽게 과제를 진행했을수 있었을텐데라는 아쉬움이 남는다.


#11기 랭체인

4

👉 이 게시글도 읽어보세요