설 연휴 중에 관심을 끄는 공고를 찾았다! RAG 관련한 콘텐츠를 많이 만드는 곳인데 나도 한번 지원해보려고 이력서와 자소서를 쓰던 중... 문득 아이디어가 떠올랐다.
내 이력서와 자소서, 각종 문서들을 넣어주고
이걸 참조해서 대답하게 하는 챗봇을 만들어서 보여주면 어떨까?
특히나 내가 지원한 곳이 RAG를 하는 곳이였기 때문에, 겸사겸사 RAG에 대한 대략적인 이해도도 증명할 수 있겠다 싶었다. 챗봇은 streamlit을 이용해서 써볼 수 있게 하는 방식으로 데모 화면을 준비할 수 있으니, 담당자가 원한다면 챗봇에게 나에 대해 궁금한 것을 마음껏(?) 부담없이 질문하면서 나에 대한 정보를 파악할 수 있다.
단, 주어진 시간은 단 3일!!!
성능은 모르겠고, 일단 어떻게든 구현이나 해보자라는 마음에 시작했다. 일단 부트캠프에서 랭체인이나 RAG에 대해서 조금은 배웠기 때문에 바로 시작할 수 있었다.
1. 모듈 만들기
모듈은 크게 3개로 구성했다. 데이터와 페이지, 그리고 유틸리티이다.
데이터 폴더에는 이력서와 자기소개서, 이외에 내가 쓴 글들, 프로젝트를 하면서 썼던 포스팅 자료들...등등 자료를 넣어준다.
페이지 폴더는 스트림릿에 페이지에 보여질 페이지로 Home, Chat, Portfolio 페이지 3개로 나눴다. 여기서 chat 페이지로 들어가면 챗봇과 채팅을 할 수 있도록 만들고, portfolio 페이지에는 마크다운 형식으로 대략적인 프로젝트 경험을 요약해놓았다. home은 전체적인 페이지에 대한 설명을 써놓았다.
util 폴더에는 챗봇이 작동하게 할 부분이 들어간다.
전체적으로 파일을 실행시키는 것은 app.py이다. (전체 코드는 github 링크에)
2. RAG 구현하기
Chat with Me 페이지에 챗봇 인터페이스를 구현했다.
최초로 실행했을 때에 벡터스토어를 생성하고, 문서를 추가하면 따로 벡터스토어를 다시 만들어 저장할 수 있도록 함수를 짜줬다. 이 페이지에 들어가는 함수들은 rag_utils.py에 모두 담아놨다.
1) 벡터스토어를 생성 및 저장 함수 :
파일을 읽어와서 (주로 txt) 이를 청크 사이즈로 자른 뒤에 임베딩 모델로(공짜 모델 사용. text-embedding-3-large) 벡터화를 해준다. 그리고 벡터인덱스를 리턴.
2) 챗봇 체인 설정 함수:
벡터스토어가 로컬에 저장이 된 상태(또는 위에서 만든 벡터스토어 함수로 벡터인덱스 리턴한 것을 받아옴).
FAISS 벡터 데이터베이스 라이브러리를 사용했고, 리트리버는 베이스 리트리브를 처음에 사용했다가 나중에 gpt한테 질문에서 중요한 키워드를 3개 뽑으라고 해서, 그 키워드로 검색하여 문서를 뽑는 방식으로 변경. 답변을 만들어낼 llm은 gpt-4o-mini 사용.
프롬프트는 아래와 같이 만든 뒤에 랭체인을 걸어준다.
#rag_utils.py 일부
print("Setting up ChatOpenAI...")
chat = ChatOpenAI(
openai_api_key=api_key,
model="gpt-4o-mini",
temperature=0.7
)
# 프롬프트 템플릿 설정
template = """
너는 지금부터 내 페르소나를 가진 챗봇이야. 나는 AI 업계에서 일을 시작하기 위해 일자리를 찾고 있어.
질문을 하는 사람은 회사의 면접관이고, 항상 예의있으면서도 솔직하고, 정직하게, 자신감있게 대답해줘.
질문에 답을 하기 어려운 내용이라면 잘 모르겠다고 대답하고, 실제 면접에서 만나게 되면 다시 한번 꼭 물어봐달라고 말해줘.
대답할 때에는 아래 context를 참고해. context에는 내가 지금까지 했던 경험과 경력을 알려줄께.
###
{context}
###
{history}
user: {query}
답변:
"""
print("Setting up prompt and memory...")
prompt = ChatPromptTemplate.from_template(template)
memory = ConversationBufferWindowMemory(k=3, ai_prefix="job interview")
print("Creating chain...")
def merge_docs(retrieved_docs):
return "###\n\n".join([d.page_content for d in retrieved_docs])
chain = RunnableParallel({
'context': RunnableLambda(enhanced_retriever) | merge_docs,
'query': RunnablePassthrough(),
'history': RunnableLambda(memory.load_memory_variables) | itemgetter('history')
}) | {
'answer': prompt | chat | StrOutputParser(),
'context': itemgetter('context'),
'prompt': prompt
}
print("Chat chain setup completed successfully")
streamlit으로 확인하려면 터미널에 아래와 같이 입력한다.
streamlit run app.py
사용 예시 화면ㅋㅋㅋㅋㅋ 면접에서 자세히 논의하자고 하는 걸 보니 프롬프트가 잘 들어간 것 같다.
로컬 서버에서 보는 것 말고 외부 다른 사용자에게도 스트림릿 url을 주고 똑같이 사용할 수 있도록 해봤다.
처음에 streamlit cloud를 썼는데 파이썬 버전이 달라서 그런건지 라이브러리도 제대로 안되고 벡터스토어도 제대로 저장이 안되서 포기.대신 huggingface에서 스트림릿을 연결해서 데모 페이지를 만들었다. 허깅페이스에서 뉴스페이스를 생성한 뒤에 로컬 파일들을 올리면 실행시킬 수 있다! 생각보다 엄청 간단했고 잘 돌아가서 다행이다.
https://github.com/hannakhw/Interview_chatbot
GitHub - hannakhw/Interview_chatbot: Feel free to ask questions to the chatbot with my persona! It'll tell you my story using RA
Feel free to ask questions to the chatbot with my persona! It'll tell you my story using RAG technology. - hannakhw/Interview_chatbot
github.com
'공부방 > Upstage AI Lab 4기' 카테고리의 다른 글
패스트캠퍼스 Upstage AI Lab 부트캠프 4기 | 과정 종료 회고 (2) | 2025.02.14 |
---|---|
기업연계 프로젝트가 끝났다, 이제 부트캠프도 곧 끝! (0) | 2025.02.08 |
[기업연계] GPU 쿠다 세팅하기 (0) | 2025.02.01 |
[git] gitignore을 먼저 만들어두고 레파지토리에 연결 (0) | 2025.01.29 |
패스트캠퍼스 Upstage AI Lab 부트캠프 4기 | 기업 연계 프로젝트 (0) | 2025.01.21 |