본문 바로가기

코딩

파이썬으로 Chat GPT에게 외부 정보 학습시키기

사진: Unsplash 의 Michael Dziedzic

 

Chat-GPT는 강력한 언어모델이지만 학습하지 못한 데이터에 대해서는 정확한 정보를 제공하지 못한다는 한계를 지니고 있습니다. 예를 들어 Chat-GPT에게 주호민에 대해 질문을 할 경우 누구인지 알지 못한다고 답변하는데, 우리는 이때 주호민에 대한 정보를 Chat-GPT에게 학습시켜 그에 대한 정보를 제공하게 할 수 있는지 궁금해집니다.

 

과연 가능할까요?

 

그림1. 주호민을 모르는 Chat-GPT (출처: 침착맨 유튜브)

 

정답은 Chat-GPT를 학습시킬 수는 없지만 원하는 정보를 추가로 제공하여 답변에 참고하게 만들 수 있다 입니다.

 

Chat-GPT는 이미 학습이 완료된 모델이기 때문에 사용자가 추가로 학습시킬 수는 없습니다. 하지만 우리가 원하는 정보를 질문과 함께 Chat-GPT에게 Prompt로 제공하여 그에 대한 답변을 유도할 수는 있는데요, 오늘 소개할 방법으로 주호민의 나무위키 페이지를 Chat-GPT에게 제공하여 답변하게 한 결과 그림2와 같이 향상된 답변을 얻을 수 있었습니다.

 

그림2. 주호민에 대해 답하는 Chat-GPT

인사담당자로서 Chat-GPT의 이런 기능을 보며 회사의 인사규정 또는 노동법에 대한 내용을 Chat-GPT에 연결하여 직원들의 질문에 답변해주는 챗봇을 만들 수 있을까 하는 생각을 가지게 되었는데요, 이 글을 보시는 이웃분들도 각자의 목적에 맞는 use case를 어렵지 않게 떠올리실 수 있을 것 같습니다.

 

그만큼 오늘 주제가 확장성이 넓고 많은 분들이 궁금해 하실만한 내용이라고 생각하여 포스트를 작성하게 되었는데, 이번 게시글에서는 고용노동부에서 공개하는 근로기준 분야 주요 법령(근로기준법 등) 질의회시집을 Chat-GPT에 연결하여 노동관계법령에 대한 다양한 질문에 답변할 수 있는 챗봇을 만드는 방법을 소개하겠습니다.

 


 

[요약]

오늘 소개드릴 내용을 요약해서 설명하자면 LLM (Large Language Model)을 활용한 개발 프레임워크인 Langchain을 이용하여 외부 텍스트 데이터를 인덱스로 저장하고, 사용자가 챗봇에게 명령어를 입력할때 유관 데이터를 검색하여 함께 포함하게 하는 방법입니다.

 

더 쉽게 예를 들어 설명하자면 예시2의 질문처럼 사용자의 프롬프트에 필요한 정보를 담아 질문하는 방법인데요, Chat-GPT에게 질문할 수 있는 글자수에 제한이 있기 때문에 챗봇이 참고하기를 원하는 외부 데이터를 조각내서 저장한 후 질문과 가장 유관한 조각(청크)을 검색해 프롬프트에 포함하는 방식으로 원하는 답변을 얻을 수 있습니다.

 

예시1.

Q. 너 주호민 알아?

A. 주호민이 누구인지는 제가 알지 못합니다.

 

예시2.

Q. 다음 문서를 참고하여 답변해줘 : {주호민 나무위키}

     너 주호민 알아?

A. 네, 주호민은 한국의 만화가이며, 인기 웹툰인 '신과 함께'의 작가로도 알려져 있습니다. 그 외에도 다양한 활동을 하고 있으며, 유튜브, 트위치 등에서 방송 활동도 하고 있습니다.

 

그림3. 과정 요약

 


 

여기서부터는 실제 코드와 함께 세부 과정을 살펴보겠습니다.

[코딩]

1. 준비물

예제를 위해 사용될 패키지는 다음과 같습니다.

  • langchain
  • openai
  • tiktoken
  • faiss-cpu
  • pypdf

또한 Chat-GPT API를 사용할 예정이기 때문에 OpenAI API Key 역시 필요합니다.
마지막으로 고용노동부에서 게시한 질의회시집 pdf 파일이 파이썬 스크립트와 같은 폴더에 저장되어있으면 됩니다.

 

2. PDF 파일 로드하기

import os
cwd = os.getcwd()

from os.path import isfile, join
files = [f for f in os.listdir(cwd) if isfile(join(cwd, f)) and f.endswith('.pdf')]
# 현재 디렉토리에 있는 모든 pdf파일의 이름을 리스트로 가져옵니다.

from langchain.document_loaders import PyPDFLoader
pages = []
for f in files:
    loader = PyPDFLoader(join(cwd, f))
    pages = loader.load_and_split()
# 모든 pdf파일을 로드하여 페이지별로 나누고 pages라는 변수명의 리스트로 저장합니다.
# 본 예시에서는 각 페이지별로 문서를 분리하였기때문에 청킹 과정을 생략하였으나
# 읽어온 문서가 하나의 거대한 텍스트 데이터(변수명 data)인 경우 다음과 같은 방법으로
# 청킹할 수 있습니다.
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
pages = text_splitter.split_documents(data)

 

3. 각 페이지별 텍스트에 대한 embedding 만들어 저장하기

from langchain.embeddings.openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings(openai_api_key = '개인의 openai api key')
# OpenAIEmbeddings를 활용해 각 페이지별 embedding을 생성합니다.

from langchain.vectorstores import FAISS
db = FAISS.from_documents(pages, embeddings)
생성된 정보를 db라는 변수명으로 저장합니다.

 

4. 사용자의 질문(query)과 유관한 페이지 찾기

query = "통상임금과 평균임금의 차이가 무엇인가요?"
# 위와 같이 챗봇에게 질문해보겠습니다.

retrieved_pages = db.similarity_search(query, k=4)
retrieved_contents = " ".join([p.page_content for p in retrieved_pages])
#db로부터 유사성 검색을 실시하여 retrieved_pages를 구하고 해당 페이지의 텍스트를 모두 가져옵니다.

 

5. 사용할 chat 모델을 정의하고 Prompt 설계하기

from langchain.chat_models import ChatOpenAI
chat = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.5)
#gpt-3.5-터보 모델을 사용하겠습니다. (gpt4는 아직 신청대기중이라 ㅠㅜ)


from langchain.prompts.chat import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)

system_template="""
You are a helpful assistant that that can answer questions about Korean labor laws 
based on the following document:{docs}
Only use the factual information from the document to answer the question.
If you feel like you don't have enough information to answer the question,
say "질문에 대한 답을 찾지 못했습니다.".
Your answers should be verbose and detailed.
"""
# 시스템 메시지 프롬프트를 만들기 위한 템플릿입니다. {docs} 자리에는 앞서 검색해서 찾은
# 페이지 컨텐츠가 들어가게 됩니다.
# 시스템 메시지 프롬프트는 챗봇에게 역할을 부여하고 규칙을 설명하는 등의 용도로 사용됩니다.
system_message_prompt = SystemMessagePromptTemplate.from_template(system_template)


human_template = "Answer the following question: {question}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
# 사람이 질문하는 내용을 담은 프롬프트입니다.

chat_prompt = ChatPromptTemplate.from_messages(
    [system_message_prompt, human_message_prompt]
)
# 시스템과 휴먼 메시지 프롬프트를 결합하여 챗 프롬프트를 만듭니다.

 

6. 챗봇 실행하기

from langchain.chains import LLMChain
chain = LLMChain(llm=chat, prompt=chat_prompt)

response = chain.run(question=query, docs=retrieved_contents)
response = response.replace("\n", "")

print(response)

 


 

[결과]

위 코드를 통해 챗봇의 답변을 출력한 결과는 다음과 같았습니다.

 

Q. 통상임금과 평균임금의 차이가 무엇인가요?

챗봇 : 통상임금과 평균임금은 다른 개념입니다. 통상임금이란 근로계약에서 정한 근로를 제공하면 확정적으로 지급되는 임금을 말합니다. 즉, 근로자가 정해진 근무시간에 일정한 금액을 받는 것을 의미합니다.반면에, 평균임금은 근로자의 통상적인 생활임금을 반영하기 위해 사용되는 개념입니다. 평균임금은 근로자가 퇴직한 날 이전 3개월 동안에 받은 임금의 총액을 그 기간의 총일수로 나눈 금액을 의미합니다. 평균임금은 퇴직금이나 보험금 등을 계산할 때 사용되는 개념입니다.따라서, 통상임금은 근로계약에서 정한 일정한 금액을 의미하고, 평균임금은 근로자의 통상적인 생활임금을 반영하는 개념입니다.

챗봇의 답변이 마음에 드시나요? ㅎㅎ 위 답변은 연습문제 수준으로 간단하게 만들어본 챗봇의 답변이었는데요, 답변의 정확성을 높이기 위해서는 인덱스를 보다 정교하게 가다듬거나, 시스템/휴먼 메시지 프롬프트를 더 상세히 정의하는 방법 등을 고려해 볼 수 있을 것 같습니다.

 

참고로 Chat-GPT는 같은 질문에 대해 아래와 같이 답변하였습니다.

Chat-GPT : 통상임금과 평균임금은 노동자들이 받는 임금을 측정하는 데 사용되는 두 가지 다른 개념입니다.
통상임금은 일반적으로 사용되는 용어로, 특정 직업이나 산업에서 근로자들이 받는 임금의 일반적인 범위나 수준을 나타냅니다. 이는 해당 직업이나 산업에서 일하는 노동자들의 대다수가 받는 임금을 의미합니다. 예를 들어, "의료 분야에서 통상적으로 시간당 30달러의 임금을 받습니다"라는 말은 의료 분야의 대부분의 노동자들이 시간당 약 30달러의 임금을 받는다는 것을 의미합니다.
반면에 평균임금은 특정 시간 동안 일하는 모든 노동자들의 임금을 총합하여 평균을 구한 값입니다. 이는 전체 노동자들의 임금을 평균화하여 나타내는 것으로, 통상임금과는 다를 수 있습니다. 예를 들어, 한 산업의 일부 노동자들이 매우 높은 임금을 받는 반면 다른 노동자들이 낮은 임금을 받는 경우, 이 두 그룹의 임금을 모두 고려하여 평균임금을 계산하면 통상임금과는 차이가 있을 수 있습니다.
통상임금은 일반적인 임금의 범위를 나타내는 반면, 평균임금은 모든 노동자들의 임금을 평균화하여 나타내는 개념입니다. 따라서 이들은 다른 측면을 강조하며, 임금에 대한 다양한 관점을 이해하는 데 도움이 됩니다.

 

여러분은 챗봇의 답변에 대해 어떻게 생각하시는지, 제 포스트를 참고하여 챗봇을 만들어본 분들이 계시다면 어떤 데이터를 활용했는지, 그에 대한 챗봇의 답변은 어떠했는지 댓글로 들어볼 수 있으면 좋을 것 같습니다.

 

끝으로 같은 방법으로 얻은 챗봇의 다른 답변도 몇가지 소개해드리며 오늘의 포스트를 마치겠습니다.

 

감사합니다.

 


 

Q. 취업규칙을 변경하기 위한 절차를 설명해주세요.

챗봇 : 취업규칙을 변경하기 위해서는 「근로기준법」 제94조의 규정에 따라 근로자의 과반수로 조직된 노동조합의 동의를 받아야 합니다. 만일 노동조합이 없는 경우에는 근로자의 과반수의 의견을 들어야 합니다. 단, 불이익 변경의 경우에는 동의를 얻어야 합니다. 불이익 변경이란 변경된 취업규칙이 근로자가 종전에 가지고 있던 기득의 권리나 이익을 박탈하여 근로조건을 낮추거나 복무규율을 강화하는 것을 의미합니다. 따라서 취업규칙의 변경이 불이익 변경에 해당하는지 여부는 그 변경의 취지와 경위, 당해 사업장의 업무의 성질, 취업규칙 각 규정의 전체적인 체제 등 제반사정을 종합적으로 고려하여 판단하여야 합니다. 노동조합의 동의를 받은 후에는, 이사회와 별도로 출자자로 구성된 운영위원회에서 의결하여 취업규칙을 변경할 수 있습니다. 단, 단체협약으로 취업규칙의 작성 및 변경에 관하여 노동조합의 동의를 받아야 한다고 규정하고 있더라도 불이익 변경의 경우를 제외하고는 노동조합의 동의를 받지 않았다 하여 변경된 취업규칙의 효력을 부정할 수 없습니다.

Chat-GPT : 취업규칙을 변경하기 위한 절차는 국가 및 법률 체제에 따라 다를 수 있으며, 일반적으로 다음과 같은 단계를 따릅니다. 다만, 이는 일반적인 가이드라인이며 실제 절차는 국가 및 조직에 따라 상이할 수 있습니다. 또한, 직장 내 노동조합의 참여 등 추가 요건이 있을 수도 있습니다.

조사 및 준비: 취업규칙을 변경하려는 이유와 변경 내용을 명확히 확인하고, 해당 규칙이 적용되는 법률, 규정, 정책을 조사합니다. 이를 통해 변경이 필요한 부분을 식별하고, 변경 내용에 대한 이해도를 높입니다.
계획 및 제안: 변경 내용을 포함하는 새로운 취업규칙을 작성하고, 관련 이해 관계자들과 협의하여 합의를 이끌어냅니다. 이는 조직 내의 다른 부서나 팀, 직원들, 노동조합 등과의 협업이 필요할 수 있습니다.
법적 검토: 변경된 취업규칙이 법적으로 타당하고 규정을 준수하는지 확인하기 위해 법률 상담을 받습니다. 법률 전문가 또는 규제 기관과 협력하여 규칙이 법적으로 허용되는지 확인합니다.
협상 및 합의: 변경된 취업규칙에 대해 직원들, 노동조합 또는 대표자들과 협상을 진행합니다. 이는 의견 교환, 협상, 대안 제안, 타협 등을 통해 합의를 이루는 과정을 포함합니다.
공지 및 시행: 변경된 취업규칙에 대한 공지를 전달하고, 시행일을 설정합니다. 이는 조직 내부 공지, 공고, 메일 등을 통해 전달될 수 있습니다. 또한, 변경 내용에 대한 설명회나 교육을 개최하여 직원들에게 이해와 준수를 도모합니다.
모니터링 및 평가: 변경된 취업규칙이 적절히 시행되고, 조직과 직원들에게 올바르게 적용되는지 모니터링하고 평가합니다. 필요한 경우 수정사항을 식별하고 보완하는 조치를 취합니다.

취업규칙을 변경하기 위한 절차는 복잡할 수 있으며, 법적인 요구사항과 관련 법령을 준수해야 합니다. 따라서, 취업규칙 변경을 고려하는 경우에는 법률 전문가와 협력하거나, 해당 국가 또는 지역의 관련 기관의 지침을 따르는 것이 중요합니다.

 

Q. 아르바이트로 1년 이상 근무했지만 회사에서 4대보험을 늦게 가입하여 4대보험 가입기간이 1년을 넘지 않는다는 이유로 퇴직금 지급을 거부당했습니다. 저는 퇴직금을 받을 수 없는건가요?

챗봇 : 근로자퇴직급여보장법 제8조 제1항에 따르면, 사용자는 계속근로기간 1년에 대하여 30일분 이상의 평균임금을 퇴직금으로 퇴직근로자에게 지급하여야 합니다. 다만, 계속근로기간이 1년 미만인 근로자, 4주간을 평균하여 1주간의 소정근로시간이 15시간 미만의 근로자는 법상 퇴직급여제도 설정 의무는 아닙니다.따라서, 귀하께서 상기 회사에서 1년 이상 계속 근무를 하였다면, 4대보험 가입기간과 상관없이 퇴직금을 받을 권리가 있습니다. 만약 귀하께서 퇴직금을 받지 못한 경우, 퇴직일로부터 14일 이내에 해당 퇴직금을 지급받지 못할 경우 사업장 관할 고용노동관서에 진정 등을 제기하여 권리구제를 받을 수 있습니다.

Chat-GPT : 퇴직금에 대한 정확한 판단은 국가 및 지역의 법률과 규정에 따라 다를 수 있습니다. 그러나 대부분의 국가에서는 퇴직금 지급과 관련된 기준을 설정하고 있으며, 이를 준수해야 합니다.
일반적으로 아르바이트로 근무한 경우, 퇴직금 지급과 관련된 규정은 정규직 근로자에 비해 보호 수준이 낮을 수 있습니다. 따라서, 아르바이트 근로자가 퇴직금을 받을 수 있는지 여부는 국가의 법률과 해당 조직의 정책에 따라 달라질 수 있습니다.
그러나 일반적으로 퇴직금은 근로자가 근속한 기간과 노동 법률에 따라 결정됩니다. 아르바이트로 근무한 경우, 근속 기간에 따라 퇴직금 지급 여부가 결정될 수 있습니다. 따라서, 퇴직금을 받을 수 있는지 여부는 아르바이트 근로 계약 및 근로법, 근로자 보호 법령 등을 검토하여 정확한 답변을 얻어야 합니다.
따라서, 상황에 따라 귀하의 국가 및 지역의 법률과 규정을 참조하거나 법률 전문가와 상담하여 귀하의 권리와 옵션을 명확히 알아보는 것이 가장 좋습니다. 그들은 귀하의 개별 상황에 대해 정확하고 전문적인 조언을 제공할 수 있습니다.

 

Q. 노동법에서 말하는 불법파견은 어떤 의미인가요? 불법파견 여부를 판단하는 기준과 처벌수위에 대해 설명해주세요.

챗봇 : 노동법에서 말하는 불법파견은 다음과 같은 경우를 의미합니다. 
1. 공중위생 및 공중도덕상 유해한 업무에 취업시키기 위해 근로자를 파견한 경우
2. 파견대상 업무 위반
3. 파견기간 위반
4. 무허가 파견
5. 영업정지 기간 중의 파견
6. 쟁의행위 대체근로를 위한 파견 등

"파견근로자 보호 등에 관한 법률"에 반하여 근로자 파견을 한 경우불법파견 여부를 판단하는 기준은 다음과 같습니다.
1. 파견근로자에 대한 지휘/명령을 사용사업주가 행사하는지 여부
2. 근로자파견을 업으로 행하는지 여부
3. 파견 대가의 지급이나 그 외 영리 목적이 있는지 여부
4. 파견을 하게 된 배경 및 목적, 파견근거 등을 종합적으로 검토

불법파견 시 처벌 수위는 다음과 같습니다.
1. 파견사업주에게 과징금 부과
2. 파견근로자에게 직접 고용처리 및 소송권 행사 지원
3. 파견근로자의 근로조건 개선 및 파견근로자 보호 등에 관한 법률 위반 사실을 고용노동부에 고발하여 처벌 등을 요구할 수 있음
4. 파견사업주에 대한 고용노동부의 업무정지 명령 등의 행정처분 가능

따라서, 불법파견은 근로자의 권익을 침해하는 행위이므로, 파견사업주는 근로자 파견 시 불법파견 여부를 철저히 판단하여야 하며, 불법파견 시에는 엄격한 처벌이 가해질 수 있음을 인지하여야 합니다.

Chat-GPT : 노동법에서의 "불법파견"은 파견법에 위반되거나 파견근로자의 권리를 침해하는 파견 형태를 말합니다. 불법파견은 일반적으로 근로자의 권익을 보호하고 공정한 노동환경을 조성하기 위해 규제되고 있습니다. 하지만 불법파견의 정의와 처벌 수위는 국가 및 지역에 따라 차이가 있을 수 있으므로, 이는 일반적인 가이드라인입니다.
불법파견 여부를 판단하는 기준은 국가와 법률에 따라 다를 수 있으나, 아래와 같은 요소들이 고려됩니다:
파견의 목적: 파견은 보통 일시적이고 한정된 기간의 업무를 위해 사용되어야 합니다. 따라서, 일정 기간을 초과하거나 지속적인 업무에 대해 파견을 이용하는 경우 불법파견으로 간주될 수 있습니다.파견근로자의 업무와 지배관계: 파견근로자가 파견기관 대신 수혜기관에서 업무를 수행하며, 그 업무를 지시하는 지배관계가 파견기관에 있어야 합니다. 만약 파견근로자가 수혜기관의 지시를 받거나 지배관계가 혼란스러운 경우 불법파견으로 간주될 수 있습니다.근로자의 권리 및 대우: 파견근로자는 파견근로자로서의 권리와 대우를 보장받아야 합니다. 예를 들어, 적절한 임금, 근로시간 및 휴가 제도, 안전 보호 등이 보장되어야 합니다. 파견근로자가 이러한 권리를 제대로 받지 못하거나 불공정한 대우를 받는 경우 불법파견으로 간주될 수 있습니다.
불법파견에 대한 처벌은 국가와 법률에 따라 다를 수 있습니다. 일반적으로는 다음과 같은 처벌 수위가 존재할 수 있습니다:
과태료: 파견법을 위반한 기업이나 기관에게 과태료가 부과될 수 있습니다. 과태료는 위반의 정도와 국가 및 법률에 따라 다를 수 있습니다.경고 또는 경고서 발행: 불법파견을 한 기관에게 경고가 발행될 수 있습니다. 경고는 불법파견을 중단하고 적법한 근로관계를 구축하도록 유도하는 목적을 가집니다.처벌적 손해배상: 불법파견으로 인해 근로자에게 손해가 발생한 경우, 해당 기관은 손해배상을 할 의무가 있을 수 있습니다. 이는 불법파견으로 인해 발생한 임금 미지급, 근로시간 위반, 근로환경 문제 등을 포함합니다.형사 처벌: 심각한 불법파견 사례인 경우, 법률에 따라 범죄로 간주될 수 있으며, 벌금이나 징역 등의 형사 처벌을 받을 수 있습니다.
하지만 불법파견에 대한 처벌과 절차는 국가 및 지역에 따라 다르므로, 귀하의 국가와 법률을 참조하거나 법률 전문가와 상담하여 정확한 정보를 얻는 것이 중요합니다.