LLM실습(3): RAG를 활용한 챗봇

Ohback·2025년 3월 13일

[ RAG를 활용한 챗봇 만들기 ]

이번 RAG 실습으로 선택한 주제는 Greedy Algorithm 이다. 코테스터디의 이번주 진도가 그리디 알고리즘이라 스터디원들과 함께 사용해보면 재밌을 것 같았다. 챗봇은 그리디 알고리즘에 대한 설명과 문제 풀이, 문제 추천 등이 가능하도록 구현했다.

실습 과정으로는 우선 아래와 같이 ChatGPT를 이용해 백준 그리디 알고리즘 관련 문제 100개를 json 파일로 만들었다.

    {
        "problem_id": 11047,
        "title": "동전 0",
        "description": "N종류의 동전을 이용해 K원을 최소한의 개수로 만들기",
        "input": "10 4200\n1\n5\n10\n50\n100\n500\n1000\n5000\n10000\n50000",
        "output": "6",
        "solution": "큰 단위의 동전부터 차례로 사용하여 K원을 최소한의 동전 개수로 만들 수 있습니다.",
        "code": "n, k = map(int, input().split())\ncoins = [int(input()) for _ in range(n)]\ncount = 0\nfor coin in reversed(coins):\n    count += k // coin\n    k %= coin\nprint(count)",
        "complexity": "O(N)"
      }

LLM은 ChatOpenAI()를 통해 gpt-4o 모델을 사용하여 응답이 가능하도록 하였고 유사 문제 검색, 챗봇 기능 함수를 만들어 응답을 출력하도록 하였다. 아래는 LLM 모델이 외부 데이터셋(백준 그리디 알고리즘 문제 데이터)을 참고하여 답변한 내용이다.

# 질문1
user_question = "그리디 알고리즘 심화 문제 3개만 추천해줘"
print(chatbot(user_question))

# 응답1
🔹 그리디 알고리즘 개념 설명 중...
🔹 GPT-4o 응답:

그리디 알고리즘의 심화 문제를 찾고 계시군요. 다음은 그리디 알고리즘을 활용하여 해결할 수 있는 심화 문제 3개입니다:

1. **백준 13975- 파일 합치기 3**
   - 이 문제는 여러 개의 파일을 최소 비용으로 합치는 문제입니다. 그리디 알고리즘을 사용하여 우선순위 큐를 활용해 해결할 수 있습니다.

2. **백준 1202- 보석 도둑**
   - 이 문제는 보석과 가방이 주어졌을 때, 가방에 담을 수 있는 보석의 최대 가치를 구하는 문제입니다. 그리디 알고리즘을 사용하여 보석의 가치와 가방의 무게 제한을 고려해 해결할 수 있습니다.

3. **백준 2873- 롤러코스터**
   - 이 문제는 롤러코스터가 지나갈 수 있는 경로를 찾는 문제로, 그리디 알고리즘을 사용하여 최적의 경로를 탐색하는 문제입니다.

이 문제들은 그리디 알고리즘의 다양한 응용을 요구하며, 심화된 사고를 필요로 합니다. 각 문제를 풀면서 그리디 알고리즘의 다양한 전략을 연습해보세요.
# 질문2
user_question = "백준 걸그룹 마스터 준석이 문제 풀이해줘"
print(chatbot(user_question))

# 응답2
🔹 문제 설명: 주어진 걸그룹 정보와 퀴즈를 사용하여 걸그룹 멤버 또는 걸그룹 이름을 출력하는 문제
🔹 풀이: 딕셔너리를 사용하여 걸그룹 정보를 저장하고, 퀴즈에 따라 걸그룹 멤버 또는 걸그룹 이름을 출력합니다.
🔹 코드 예제:
n, m = map(int, input().split())
groups = {}
members = {}
for _ in range(n):
    group = input()
    count = int(input())
    for _ in range(count):
        member = input()
        groups[member] = group
        members[group] = members.get(group, []) + [member]
for _ in range(m):
    quiz = input()
    type = int(input())
    if type == 0:
        print('\n'.join(sorted(members[quiz])))
    else:
        print(groups[quiz])
        
🔹 추천 문제:
- 병든 나이트 (백준 1783)
- 꿀 따기 (백준 21758)

현재 나의 상황과 관련된 주제로 실습을 해보니 코드를 짜고 실행하는 과정이 굉장히 흥미로웠다. 여유 시간이 될 때, 그리디 알고리즘 외에 다양한 알고리즘을 데이터셋에 추가하고 Serp API를 사용해서 검색이 가능하도록 업데이트 해봐야겠다!

profile
기록은 기억을 지배한다.

0개의 댓글