랭체인 1-1. 프롬프트와 LLM을 사용한 체인 구성
chain_compositino.py
사실, 가장 어려운 과제였어요. 처음 하다보니, 환경구축하는 것에서부터, 거의 헬로월드에 해당하는 예제들 다 뒤져가면서 이해하는 과정을 겪고 나서야 작성할 수 있었습니다. :)
import os
# 1차 과제 - 1번
# 1. 사용자 입력을 받아 프롬프트에 추가하고, 모델로 전달하여 원시 모델 출력을 반환하는 체인을 만드는 방법을 배웁니다.
# 2. 먼저, 필요한 라이브러리를 설치하고, 프롬프트 템플릿과 LLM을 결합하여 기본 체인을 구성합니다.
# 3. 그 다음, 출력 포맷을 변환하기 위해 출력 파서를 추가하고, 입력을 단순화하기 위한 구성 요소를 추가하는 방법을 배웁니다.
# 2. 먼저, 필요한 라이브러리를 설치하고
from dotenv import load_dotenv
from langchain_community.llms import OpenAI
from langchain_openai import ChatOpenAI
# from langchain_community.chat_models import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
load_dotenv()
# 1. 사용자 입력을 받아 프롬프트에 추가하고
# 기본 구성요소 가져오기
prompt = input()
# 입력을 단순화하기 위한 구성 요소를 추가하는 방법을 배웁니다.
prompt_template = PromptTemplate.from_template(prompt)
llm = ChatOpenAI()
# 출력 포맷을 변환하기 위해 출력 파서를 추가하고
output = StrOutputParser()
# 프롬프트 템플릿과 LLM을 결합하여 기본 체인을 구성합니다.
# LLM 체인 구성
llm_chain = prompt_template | llm | output
result = llm_chain.invoke({})
print (result)결과
jihongkim@MacBook-Pro TestProject % python3 /Users/jihongkim/Desktop/PythonWorkspace/TestProject/chain_composition.py
곰에 관한 농담을 해줘.
어떤 동물이 가장 좋은 댄서일까요? 곰! 왜냐하면 그들은 항상 곰을 잡고 춤을 출거든요!랭체인 1-2. 여러 체인을 연결하여 복잡한 질문에 답하기
multi_chain_query.py
하고나니 참 쉬운 예제인데, 처음 하다보니 기본적인 것에서 많이 헤맸습니다.
필요한 모듈을 찾아내는게 참 일이네요 :)
import os
# 1차 과제 - 2번
# 1. 첫 번째 체인은 특정 인물이 태어난 도시를 찾습니다. ex) “what is the city Barack Obama is from?”
# 2. 두 번째 체인은 해당 도시가 속한 국가를 찾는데 이때 입력받은 언어로 답해야합니다. ex) “what country is the city Seoul in? respond in french”
from dotenv import load_dotenv
from langchain_community.llms import OpenAI
from langchain_openai import ChatOpenAI
# from langchain_community.chat_models import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
load_dotenv()
prompt_1 = PromptTemplate.from_template(
"""
what is the city {name} is from?
"""
)
prompt_2 = PromptTemplate.from_template(
"""
what country is the city {city} in? respond in {language}. say full sentence
"""
)
llm = ChatOpenAI()
# 출력 포맷을 변환하기 위해 출력 파서를 추가하고
output = StrOutputParser()
# 프롬프트 템플릿과 LLM을 결합하여 기본 체인을 구성합니다.
# LLM 체인 구성
# 모델과 아웃풋 파서는 콤포넌트니까 두개를 만들 필요는 없겠지?
chain_1 = prompt_1 | llm | output
chain_2 = prompt_2 | llm | output
name = input("who is the person? : ")
language = input("what language? : ")
city = chain_1.invoke({"name":name})
result = chain_2.invoke({"city":city, "name": name, "language":language})
print(result)결과
jihongkim@MacBook-Pro TestProject % python3 /Users/jihongkim/Desktop/PythonWorkspace/TestProject/multi_chain_query.py
who is the person? : Soon-Shin Lee
what language? : Korean
순신 리가 서울, 대한민국에서 왔습니다.랭체인 1-3. 분기 및 병합을 활용한 체인 구성
branching_merging.py
조금 헤맸습니다. 질문 내용만으로 파악하긴 힘들어서 랭체인 관련 튜토리얼 예제들을 열심히 검색해서 의도를 알아내어 해결했습니다.
import os
# 1차 과제 - 3번
# 1. 하나의 입력을 받아 여러 컴포넌트에서 동시에 처리하고, 이후 다른 컴포넌트에서 결과를 합쳐 최종 응답을 생성하는 체인을 만드는 방법을 배웁니다.
# 이를 통해 복잡한 계산 그래프를 구성하고, 다양한 관점에서 문제를 분석할 수 있습니다.
# 2. 먼저, 주제에 대한 논쟁을 생성하는 컴포넌트를 구성합니다. 그 다음, 이 논쟁의 긍정적 측면과 부정적 측면을 나누어 평가하는 분기를 만듭니다.
# 마지막으로, 이러한 분석을 바탕으로 종합적인 응답을 생성하는 컴포넌트를 추가합니다.
# 3. 이 과정을 통해, 복잡한 문제에 대해 다각도로 분석하고, 여러 분석 결과를 종합하여 의사결정을 내리는 과정을 학습할 수 있습니다.
from dotenv import load_dotenv
from langchain_community.llms import OpenAI
from langchain_openai import ChatOpenAI
# from langchain_community.chat_models import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnableParallel
load_dotenv()
# 먼저, 주제에 대한 논쟁을 생성하는 컴포넌트를 구성합니다
# 여기에서, 논쟁에 대한 핵심 논점만 뽑아달라고 합니다.
prompt_issue = PromptTemplate.from_template(
"""
What is the debate about the {subject}? please tell me the topic
"""
)
# 이 논쟁의 긍정적 측면과 부정적 측면을 나누어 평가하는 분기를 만듭니다.
# 앞서 뽑은 핵심 쟁점을 바탕으로 긍정/부정 측면을 평가
prompt_positive = PromptTemplate.from_template(
"""
Tell me about the positive aspects of {issue} topic
"""
)
prompt_negative = PromptTemplate.from_template(
"""
Tell me about the negative aspects of {issue} topic
"""
)
prompt_result = PromptTemplate.from_template(
"""
Write a comprehensive conclusion about {subject} based on the positive and negative aspects.
positive aspects : {positive_aspects}
negative aspects : {negative_aspects}
Just write in Korean
"""
)
llm = ChatOpenAI()
output = StrOutputParser()
chain_issue = prompt_issue | llm | output
chain_positive = prompt_positive | llm | output
chain_negative = prompt_negative | llm | output
chain_result = prompt_result | llm | output
# 인풋 수신
subject = input()
issue = chain_issue.invoke({"subject":subject})
parallel = RunnableParallel(positive=chain_positive, negative=chain_negative)
parallel_result = parallel.invoke({"subject": subject, "issue": issue})
positive_aspects = parallel_result["positive"]
negative_aspects = parallel_result["negative"]
result = chain_result.invoke({"subject":subject, "issue":issue, "positive_aspects":positive_aspects, "negative_aspects":negative_aspects})
print (result)결과
jihongkim@MacBook-Pro TestProject % python3 /Users/jihongkim/Desktop/PythonWorkspace/TestProject/branching_merging.py
스크럼
스크럼에 대한 논란은 긍정적인 측면과 부정적인 측면이 모두 존재합니다.
긍정적인 측면: 스크럼의 지지자들은 이를 통해 팀이 더 효율적이고 효과적으로 작업할 수 있어 생산성이 향상되고 프로젝트 결과물이 빠르게 전달될 수 있다고 주장합니다. 또한 팀원 간의 협업, 커뮤니케이션, 협력을 강조하는 스크럼은 더 융합적이고 생산적인 작업 환경을 조성할 수 있습니다. 스크럼은 유연하고 변화에 반응할 수 있는 구조로 설계되어 있어 프로젝트 요구사항과 우선순위의 변화에 신속하게 대응할 수 있습니다. 또한 스크럼은 팀원들의 자기 조직화를 촉진하고 작업에 대한 책임감을 가질 수 있도록 돕는다고 주장되며, 이는 동기부여와 만족도를 높일 수 있습니다. 스크럼은 주기적인 반성, 피드백, 조정을 통해 지속적인 개선 문화를 장려하므로 시간이 흐를수록 프로젝트 결과물이 더 나아질 수 있습니다.
부정적인 측면: 스크럼에 대한 비판적인 측면으로는 엄격한 규칙과 절차가 창의성과 유연성을 제한할 수 있다는 의견이 있습니다. 또한 스크럼을 시행하기 위해서는 팀원들이 프레임워크의 실천과 회의에 집중하는 데 많은 시간과 노력을 투자해야 한다는 점이 부담으로 여겨질 수 있습니다. 모든 프로젝트와 팀이 스크럼의 원리에 적합하지 않을 수 있으며, 특히 기술적이거나 연구 중심의 프로젝트에서는 프레임워크의 이점을 충분히 누리기 어려울 수 있다는 주장도 있습니다. 스크럼을 통해 생산성과 협업이 향상된다는 주장에 대해 실제로 어떤 구체적인 이점이 제공되는지 의문을 제기하는 비판도 있습니다. 또한 스크럼을 효과적으로 사용하기 위해서는 훈련, 경험, 그리고 조직 내에서의 문화적 변화가 필요하며, 이러한 전환이 어려움을 겪는 팀도 있을 수 있습니다.
전체적으로 스크럼에 대한 논란은 해당 프레임워크의 잠재적인 이점을 고려하면서도 프로젝트와 팀의 고유한 요구사항과 도전에 대해 신중히 고려해야 한다는 것을 강조합니다. 특정 맥락에서 스크럼의 효과를 평가하기 위해 사용할 수 있는 잠재적인 이점과 단점을 신중히 평가하여 그 효과에 대한 정보를 얻는 것이 중요합니다.랭체인 1-4. 체인에 메모리 추가하기
add_memory_to_chain.py
내용은 어렵지 않았는데, 출제 의도를 파악하는데에 시간이 조금 걸렸네요 :)
어쨌든 해냈슴다~
import os
# 1차 과제 - 4번
# 1. 어떻게 임의의 체인에 메모리를 추가하여 대화의 맥락을 유지할 수 있는지 배웁니다.
# 이 과정에서 메모리 클래스를 사용하고 수동으로 연결하는 방법을 실습합니다.
# 2. 첫 번째 단계로, 메모리에 사용자의 입력과 챗봇의 응답을 저장하는 방법을 배우고,
# 이를 통해 이전 대화의 맥락을 다음 대화에 활용하는 방법을 실습합니다.
# 3. 예를 들어, 사용자가 "hi im bob"이라고 입력했을 때, 이 정보를 메모리에 저장하고,
# 다음 대화에서 "whats my name"이라는 질문에 "Your name is Bob."라고 응답하는 과정을 통해 메모리의 사용 방법을 배웁니다.
from dotenv import load_dotenv
from langchain_community.llms import OpenAI
from langchain_openai import ChatOpenAI
# from langchain_community.chat_models import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
load_dotenv()
llm = ChatOpenAI()
memory = ConversationBufferMemory()
conversation = ConversationChain(
llm=llm,
memory=memory
)
# 첫번째 인풋 수신
user_input = input()
result = conversation.predict(input=user_input)
print (result)
# 두번째 인풋 수신
user_input = input()
result = conversation.predict(input=user_input)
print (result)결과
jihongkim@MacBook-Pro TestProject % python3 /Users/jihongkim/Desktop/PythonWorkspace/TestProject/add_memory_to_chain.py
hi im bob
Hello Bob! It's nice to meet you. How can I assist you today?
whats my name
Your name is Bob.랭체인 1-5. SQL 데이터베이스 쿼리하기
query_sql_db.py
여기부터 조금 난관이 있었는데요, SQLite과 랭체인을 활용해서 쿼리 결과를 얻어오고, 그 과정에서 질문에 답변을 가져오는 방법이 여러가지가 있더군요.
나오는 여러 방안들을 뒤져보면서 다양하게 해보다가 나름 가장 깔끔하게 나올 수 있는 방법을 찾았습니다. :) 하지만 아직 RunnablePassthrough 를 활용하는 방법 등이 익숙지 않네요.
한참 더 해봐야 알 것 같습니다.
import os
# 1차 과제 - 5번
# 1. 사용자의 질문에 답하기 위해 SQL 데이터베이스를 쿼리하는 방법을 배웁니다.
# 이 과정에서는 SQL 쿼리를 생성하여 데이터베이스에 질문을 하고, 결과를 얻어 자연어로 응답을 생성하는 전체 과정을 실습합니다.
# 2. 먼저, Chinook 샘플 데이터베이스를 사용하여 테이블 스키마를 가져오고, 이를 기반으로 SQL 쿼리를 작성합니다.
# 그 다음, 작성된 쿼리를 실행하여 결과를 얻고, 이 결과를 바탕으로 자연어 응답을 생성합니다.
# 3. 예를 들어, "How many employees are there?"라는 질문에 대해 SQL 쿼리를 생성하고,
# 실행 결과를 바탕으로 "There are 8 employees."라는 응답을 생성하는 방법을 배웁니다.
from dotenv import load_dotenv
from langchain_community.llms import OpenAI
from langchain_openai import ChatOpenAI
# from langchain_community.chat_models import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain.chains.sql_database.query import create_sql_query_chain
from langchain_community.tools import QuerySQLDataBaseTool
from langchain_community.utilities import SQLDatabase
from langchain_core.runnables import RunnablePassthrough
load_dotenv()
llm = ChatOpenAI()
# 출력 포맷을 변환하기 위해 출력 파서를 추가하고
output = StrOutputParser()
db = SQLDatabase.from_uri("sqlite:///Chinook.db")
user_query = QuerySQLDataBaseTool(db=db)
sql_chain = create_sql_query_chain(llm=llm, db=db) | user_query
# result = sql_chain.invoke({"question":question})
# print (result)
prompt = PromptTemplate.from_template(
"""
Answer the question by reading at the response from DB
Question : {question}
Response from DB : {sql_result}
"""
)
chain = RunnablePassthrough.assign(sql_result=sql_chain) | prompt | llm | output
question = input()
result = chain.invoke({"question":question})
print (result)
결과
jihongkim@MacBook-Pro TestProject % python3 /Users/jihongkim/Desktop/PythonWorkspace/TestProject/query_sql_db.py
How many employees are there?
There are 8 employees.#11기랭체인