[00:00]
추론 모델을 사용하여
[00:02]
DeepSeek R1과 같은 모델로 RAG 파이프라인을 강화하는 방법을
[00:05]
이번 영상에서 살펴보겠습니다.
[00:07]
LangChain이나 LlamaIndex 같은 외부 프레임워크 없이
[00:10]
간단한 RAG 파이프라인을 구축할 예정입니다.
[00:12]
이 파이프라인은 추론 LLM으로 구동되는데,
[00:15]
이를 위해 오늘의 스폰서인
[00:18]
SambaNova Cloud를 활용하겠습니다.
[00:21]
자세한 내용은 뒤에서 다루겠습니다.
[00:23]
우리의 RAG 파이프라인은
[00:25]
두 가지 주요 구성 요소로 이루어집니다.
[00:27]
첫 번째는 지식 베이스 생성 단계이고,
[00:29]
두 번째는 생성 단계입니다.
[00:31]
지식 베이스 생성 과정에서는
[00:33]
여러 PDF 파일을 작은 청크로 나누고,
[00:36]
임베딩 모델을 사용하여
[00:38]
각 청크의 임베딩을 계산한 다음,
[00:40]
이를 벡터 저장소에 저장합니다.
[00:42]
생성 단계에서는
[00:45]
사용자의 질의를 받아
[00:47]
동일한 임베딩 모델로 질의를 임베딩하고,
[00:49]
관련된 청크들을 검색한 뒤,
[00:52]
이 관련 청크들과
[00:54]
원래 질의를 함께
[00:55]
추론 모델에 전달하여 최종 응답을 생성합니다.
[00:58]
일반적으로 검색된 청크들을
[01:01]
재순위화하는 단계가 추가되지만,
[01:04]
추론 모델을 사용하면
[01:06]
이 부분을 자동으로 처리할 수 있습니다.
[01:09]
이에 대한 예시는
[01:11]
나중에 보여드리겠습니다.
[01:14]
자, 이제 코드를 살펴보겠습니다.
[01:16]
두 개의 주요 파일이 있는데,
[01:18]
하나는 지식 베이스 생성을 위한 indexing.py이고,
[01:21]
다른 하나는 생성을 위한 retrieval.py입니다.
[01:23]
이 코드는 GitHub에서 확인할 수 있으며,
[01:25]
링크는 영상 설명란에 있습니다.
[01:27]
우선 데이터셋이 필요한데,
[01:30]
이번에는 서로 다른 주제의 세 논문을 사용합니다.
[01:32]
첫 번째는 X-ray 이미지를 통한
[01:35]
COVID-19 감지에 관한 논문이고,
[01:38]
두 번째는 상용 이어버드를 이용한
[01:40]
바이트 무게 추정에 관한 논문입니다.
[01:43]
이것은 웨어러블 센서를 사용해
[01:46]
씹는 동작을 감지하고
[01:49]
이를 통해 음식 섭취량을 추정하는 내용입니다.
[01:52]
세 번째 논문은 또 다른 웨어러블 센서에 관한 것으로,
[01:55]
마찬가지로 씹는 동작을 감지하고
[01:58]
신호 처리 기술을 통해
[01:59]
이를 분석하여
[02:00]
씹는 동작을 세그먼트화하는 방법을 다룹니다.
[02:03]
논문의 세부 내용은 중요하지 않으며,
[02:05]
이는 제가 대학원 시절에 수행했던
[02:08]
연구 작업의 일부입니다.
[02:10]
이제 코드를 자세히 살펴보겠습니다.
[02:13]
먼저 지식 베이스 생성을 위한
[02:15]
indexing.py부터 시작하겠습니다.
[02:18]
첫 번째 단계로
[02:19]
문서를 로드해야 합니다.
[02:22]
Data라는 폴더가 있는데,
[02:24]
이 폴더에서 각 PDF 파일을 읽어
[02:26]
각 페이지의 텍스트를 추출합니다.
[02:30]
메타데이터로는 파일 이름만 포함됩니다.
[02:33]
다음 단계는 문서를 청크로 나누는 것입니다.
[02:35]
여기서는 단순한 청킹 전략을 사용하여
[02:38]
500자 크기의 청크와
[02:41]
50자의 중첩을 사용합니다.
[02:43]
이는 매우 기본적인 청킹 전략이며,
[02:46]
의미 기반 청킹이나
[02:49]
재귀적 문자 텍스트 분할기 같은
[02:52]
다른 청킹 전략들도 있습니다.
[02:54]
이러한 다른 방법들도 살펴보시는 것을 추천드립니다.
[02:57]
이 예제에서는 기본적인 청킹 전략으로도
[03:00]
좋은 결과를 얻을 수 있다는 것을
[03:02]
보여드리고자 합니다.
[03:05]
간단한 청킹 전략으로도
[03:07]
추론 모델을 사용하는 경우
[03:10]
하지만 만약 여러분이
[03:11]
이 주제에 대해 더 심도 있게 알고 싶다면
[03:14]
제가 강력히 추천하는 'RAG Beyond Basics' 강좌를
[03:17]
확인해보시기 바랍니다.
[03:19]
이 강좌에서는 RAG 파이프라인의
[03:21]
다양한 컴포넌트의 고급 기술들을 다룹니다.
[03:24]
링크는 영상 설명란에 있을 거예요.
[03:26]
그다음으로 이 청크들의
[03:28]
임베딩을 계산하여 벡터 저장소에 넣습니다.
[03:30]
여기서도 여러분은
[03:32]
다양한 임베딩 모델 옵션을
[03:34]
선택할 수 있는데, 저는 허깅페이스에서
[03:36]
사용 가능한 오픈웨이트
[03:38]
임베딩 모델을 사용하고 있습니다.
[03:41]
외부 API를 사용해도 코드는 여전히 작동합니다.
[03:43]
여기서는 청크들을 받아서
[03:47]
모든 청크에 대한 임베딩을 계산하여 반환합니다.
[03:49]
다음으로 모든 것을 벡터 저장소에
[03:51]
넣어야 하는데,
[03:54]
이 경우 벡터 저장소로
[03:56]
FAISS를 선택했습니다. 이는 오픈소스 벡터 저장소입니다.
[04:00]
이를 Chroma DB나
[04:03]
Pinecone으로 대체할 수 있습니다. 전체적인
[04:05]
흐름을 보면,
[04:07]
먼저 문서를 가져와서 청크로 나누고
[04:09]
이 청크들은
[04:11]
임베딩 모델에 전달되어 임베딩이 생성되며
[04:13]
그다음 FAISS를 사용하여
[04:15]
인덱스를 생성합니다. 또한
[04:19]
임베딩을 NumPy 배열로 저장하고
[04:22]
원본 청크들을
[04:24]
JSON 파일로 저장합니다. JSON은
[04:27]
이런 식으로 생겼는데, 예를 들어 이건 하나의 청크입니다.
[04:31]
저장되는 메타데이터는
[04:33]
파일 이름과 청크의 텍스트뿐입니다.
[04:36]
이제 생성 부분에 대해 설명하겠습니다.
[04:38]
여기서는
[04:40]
쿼리와 관련된 청크들을 검색하고
[04:42]
추론 모델을 사용하여
[04:44]
최종 응답을 생성합니다.
[04:46]
검색 과정에서는
[04:48]
저장했던 임베딩이 필요하고,
[04:51]
JSON 파일에 저장된 청크들도 불러와야 합니다.
[04:54]
그리고 쿼리의 임베딩을
[04:55]
계산해야 하므로 원본 임베딩 모델도
[04:58]
불러와야 합니다.
[05:01]
사용자로부터 입력 쿼리를 받고
[05:04]
이 쿼리 RAG 시스템을 사용하여
[05:06]
최종 응답을 생성할 것입니다.
[05:08]
내부적으로는 사용자 쿼리를 받아
[05:11]
쿼리의 임베딩을 계산한 다음
[05:13]
그 임베딩을 사용하여 벡터 검색을 수행합니다.
[05:16]
이 경우에는
[05:19]
임베딩 모델이 사용자 쿼리와 가장 유사하다고 판단한
[05:22]
상위 20개의 청크를
[05:24]
검색하려고 합니다. 일반적으로는
[05:27]
50개나 100개처럼 더 많은 청크를
[05:29]
검색하고
[05:32]
중간에 랭킹 모델을 사용하여
[05:34]
사용자 쿼리와의 유사도를 기준으로
[05:37]
반환된 청크들을 다시 순위를 매깁니다.
[05:40]
하지만 우리는
[05:43]
추론 모델을 사용하고 있기 때문에
[05:45]
체인 오브 소트(Chain of Thought)
[05:47]
추론을 통해 어떤 청크가
[05:50]
사용자 쿼리와 더 관련이 있는지 판단할 수 있습니다.
[05:52]
이에 대한 예시는
[05:55]
나중에 보여드리겠습니다.
[05:59]
인덱스를 가져온 다음
[06:01]
해당 인덱스를 사용하여 관련 텍스트 청크들을 가져오고
[06:03]
이들을 하나의 텍스트로 합칩니다.
[06:06]
그런 다음 이 텍스트 블록과
[06:08]
사용자 쿼리를 함께 출력합니다.
[06:10]
이것이 컨텍스트로 사용될 것입니다.
[06:12]
LLM이 응답을 생성하기 위해서는
[06:15]
우리가 몇 가지 지시사항을
[06:16]
제공해야 합니다. 영상의 첫 부분에서
[06:19]
지시사항은 매우 간단할 것입니다.
[06:20]
증강된 프롬프트는 다음과 같습니다.
[06:22]
"제공된 컨텍스트를 바탕으로
[06:24]
다음 질문에 대한 답변을 제공해 주세요.
[06:26]
만약 컨텍스트에 답변이 없다면
[06:28]
다음과 같이 응답해 주세요: '죄송하지만
[06:31]
제공된 컨텍스트에는 귀하의 질문에 대한
[06:33]
정보가 포함되어 있지 않습니다'
[06:35]
그리고 컨텍스트와 함께
[06:37]
사용자의 원래 질문을 추가합니다. 이제 우리가 사용하고자 하는
[06:41]
LLM은 DeepSeek R1이지만, SambaNova 클라우드를 사용하고 있고
[06:44]
좋은 점은 OpenAI 파이썬 클라이언트를
[06:47]
사용하고 있다는 것입니다.
[06:49]
이는 모델 전환을 매우 쉽게 만들어 줍니다.
[06:53]
필요한 것은 단지
[06:55]
SambaNova API 기본 URL과
[06:57]
API 키를 제공하는 것뿐입니다.
[07:00]
클라이언트를 생성하면
[07:02]
사용자 쿼리가 포함된
[07:05]
증강된 프롬프트를 모델에 전달하여
[07:07]
최종 응답을 얻을 수 있습니다.
[07:10]
그렇다면 SambaNova는 무엇일까요?
[07:12]
이들은 GPU의 대안인 RDU의
[07:14]
제작자입니다.
[07:18]
이를 재구성 가능한 데이터
[07:20]
흐름 유닛이라고 부르는데
[07:21]
GPU의 대안으로 생각하면 되지만, GPU와는 달리
[07:25]
전체 DeepSeek R1 모델을 호스팅하고 있습니다.
[07:28]
축소된 버전이 아닌 전체 버전을 제공하며
[07:31]
실제로 그들은 가장 빠른
[07:33]
DeepSeek R1 추론 제공자 중 하나입니다.
[07:36]
초당 198 토큰까지 처리할 수 있는데
[07:38]
이는 정말 놀라운 속도이며
[07:41]
그들의 플랫폼에서 DeepSeek R1에
[07:43]
플레이그라운드와 API를 통해
[07:46]
접근할 수 있습니다.
[07:48]
여기 다양한 오픈웨이트 모델 목록이 있고
[07:50]
전체 DeepSeek R1이 맨 위에 있습니다.
[07:53]
이것을 선택하고 쿼리를 보내면
[07:55]
속도가 정말 놀랍습니다.
[07:58]
여기 생성되는 사고 과정과
[08:00]
최종 출력을 보여드리겠습니다.
[08:02]
거의 초당 160 토큰의 속도로 실행되는 것을 볼 수 있습니다.
[08:05]
다시 한 번 보시면,
[08:07]
꽤 상세한 추론 과정이 있고
[08:10]
최종 출력이 나옵니다.
[08:13]
무료로 가입하여
[08:15]
여기서 모델을 실험해볼 수 있고
[08:17]
관심이 있다면 API 접근을 위한
[08:20]
대기자 명단에 등록할 수도 있습니다.
[08:23]
모델명을 R1으로 지정해야 하며
[08:25]
가장 좋은 점은 여전히
[08:27]
OpenAI 파이썬 클라이언트를 사용한다는 것입니다.
[08:31]
API 키에 접근하면
[08:33]
새로운 API 키를 생성할 수 있고, 개발자는
[08:35]
무료로 시작할 수 있습니다.
[08:38]
제 구성은 이렇게 되어 있습니다.
[08:40]
API 키를 저장하는 ENV 파일이 있고
[08:43]
SambaNova 기본 URL과 모델명이 있습니다.
[08:47]
제가 다른 API 엔드포인트를 사용하고 있는 것을
[08:50]
보실 수 있는데, 이는 초기 접근 단계이기 때문입니다.
[08:53]
DeepSeek R1 모델이 정식으로 출시되면
[08:55]
일반 API 엔드포인트를
[08:58]
사용할 수 있게 될 것입니다.
[09:01]
이제 검색 코드를 실행해 보겠습니다.
[09:03]
이미 인덱스를 생성했기 때문에
[09:06]
검색 부분을 실행하기 위해
[09:08]
Python retrieval.py를 실행하겠습니다.
[09:12]
자, 이제 질문을 해볼 수 있습니다.
[09:14]
"음식 크기가 섭취에 미치는 영향은 무엇인가요?"
[09:17]
라고 매우 구체적인 질문을 해보겠습니다.
[09:21]
답을 찾을 수 있는지 보겠습니다.
[09:23]
자, 실제로 답을 찾을 수 있는지 확인해보겠습니다.
[09:26]
먼저 반환된 컨텍스트를 보여드리겠습니다.
[09:28]
여러 문서들이 있는데,
[09:30]
문자 기반 청킹 전략을 사용하고 있어서
[09:33]
일부 경우에는 단어가 중간에 잘리는 것을 볼 수 있습니다.
[09:36]
첫 번째 청크는
[09:38]
관련성이 있는데, 왜냐하면
[09:41]
섭취량 감소에 대한
[09:43]
저작 속도와 그 영향에 대해 다루고 있기 때문입니다.
[09:46]
하지만 다른 청크들도 있는데,
[09:49]
단순히 논문 참조인 것들도 있고,
[09:51]
다른 논문을 참조하는 것들도 있습니다.
[09:54]
일부 청크는 관련이 있지만
[09:56]
전혀 관련 없는 것들도 있죠.
[09:58]
논문들은 한입 크기에 대해서는 언급하지 않고
[10:00]
오히려 저작 속도나
[10:02]
한입당 씹는 횟수에 대해 이야기합니다.
[10:05]
DeepSeek R1의 내부 사고 과정을 살펴보겠습니다.
[10:07]
사용자가 한입 크기가 섭취량에 미치는 영향에 대해 물었으니
[10:10]
제공된 컨텍스트에서 관련 정보를 확인해야 한다고 합니다.
[10:13]
그리고 여러 문서를 검토하는데,
[10:14]
예를 들어 첫 번째 문서는
[10:17]
저작 속도를 줄이는 것이
[10:19]
에너지 섭취를 줄일 수 있다고 언급합니다.
[10:22]
또한 섭취 속도를
[10:24]
높이거나 낮추는 것이
[10:27]
에너지 섭취에 영향을 미친다는
[10:29]
연구들을 언급하고 있어 올바른 방향으로 가고 있습니다.
[10:32]
주목할 만한 점은
[10:35]
여러 문서를 참조하고 있다는 것입니다.
[10:36]
만약 랭커로서 프롬프트를 주면
[10:39]
추론 모델이 이를 수행할 수 있습니다.
[10:42]
이에 대한 예시를
[10:44]
나중에 보여드리겠습니다.
[10:47]
모델은 핵심 포인트로
[10:51]
한입당 씹는 횟수를 늘리는 것이
[10:53]
실질적으로 한입 크기를 줄이고
[10:55]
이는 에너지 섭취 감소로 이어진다고 봅니다.
[10:57]
정말 똑똑하게도,
[10:58]
컨텍스트가 직접적으로
[11:00]
한입 크기를 언급하지는 않지만
[11:03]
한입당 씹는 횟수와 관련이 있다는 것을 파악했습니다.
[11:05]
더 작은 모델은
[11:07]
이런 연관성을 완전히 놓칠 수 있죠.
[11:10]
이를 바탕으로 최종 응답을 도출합니다.
[11:14]
만약 질문을 '저작 속도가 섭취에 미치는 영향은 무엇인가'로 바꾸면
[11:17]
비슷한 과정을 거치지만
[11:19]
이번에는 직접적으로 저작 속도를 다루고 있어서
[11:22]
제공된 컨텍스트에서 직접 논의되지 않았다는 언급을 하지 않습니다.
[11:24]
이제 추론 모델을
[11:26]
재순위 모델로 사용할 수 있습니다.
[11:29]
방법은 다음과 같습니다.
[11:31]
원래 증강된 프롬프트에
[11:32]
답변하기 전에 각 문서를 분석하고
[11:35]
질문에 대한 답변이 포함되어 있는지
[11:37]
확인하라는 내용을 추가했습니다.
[11:39]
그리고 관련성에 따라
[11:42]
점수를 부여하도록 했습니다.
[11:44]
또한 가장 관련성 높은 문서를 먼저 나열하고
[11:47]
해당 문서들만을 기반으로
[11:49]
질문에 답하도록 했습니다.
[11:51]
동일한 질문을 했을 때
[11:54]
어떻게 되는지 살펴보겠습니다.
[11:56]
이 경우 사고 과정에서
[11:59]
각 문서를 개별적으로 검토하고
[12:01]
답변하기 전에
[12:04]
이 목록을 반환합니다.
[12:06]
첫 번째 문서는
[12:08]
사고 과정에서 각 문서를 개별적으로 검토하지만
[12:10]
마지막에는 이 목록을 반환합니다.
[12:13]
질문에 답하기 전에
[12:15]
문서 1이 10점을 받았는데,
[12:17]
이는 저작 속도를 줄이면
[12:19]
직접적으로 에너지 섭취가 줄어든다고
[12:21]
명시하고 있기 때문입니다.
[12:24]
문서에 따르면 에너지 섭취량이
[12:27]
두 번째 문서는 섭취 속도를 늦추면
[12:30]
에너지 섭취가 감소한다는 연구를 인용하고 있는데,
[12:33]
이는 제시된 맥락과 관련이 있는
[12:36]
연구입니다. 15번 문서는
[12:39]
한 입당 씹는 횟수를 늘리면
[12:41]
비만인과 정상인 모두에서
[12:43]
전체 에너지 섭취량이 감소한다고 강조합니다.
[12:46]
이 경우 제공된 20개의 문서 중
[12:48]
관련성을 기준으로 5개의 문서를
[12:51]
선택했으며, 관련성 점수도
[12:53]
함께 제공했습니다. 이것이 바로
[12:56]
전용 재순위화 모델이 수행할 작업입니다.
[12:59]
실제로 추론 모델을 직접 사용하여
[13:01]
순위화를 수행할 수 있으며, 이는
[13:04]
강력한 RAG 파이프라인의 중요한 단계입니다.
[13:08]
지금까지 추론 모델을 사용하여
[13:10]
RAG 파이프라인을 강화하는 방법에 대한
[13:12]
간단한 예시였습니다. 이 외에도
[13:14]
더 많은 것을 할 수 있습니다.
[13:16]
예를 들어, 에이전트 워크플로우를
[13:19]
운영하는 데 추론 모델을 사용할 수 있는데,
[13:21]
이는 더욱 중요합니다. 왜냐하면
[13:24]
강력한 에이전트 시스템을 구축할 때
[13:27]
추론과 평가 단계가
[13:28]
반드시 필요하기 때문입니다. 추론 모델은
[13:31]
비추론 모델에 비해 훨씬 더 많은
[13:34]
토큰을 생성하기 때문에
[13:36]
매우 빠른 추론 API 엔드포인트가 필요합니다.
[13:40]
이런 측면에서 SambaNova와 같은
[13:42]
제공업체를 확인해보시기 바랍니다.
[13:45]
여러분이 DeepSeek R1이나
[13:47]
다른 추론 모델로 구동되는
[13:50]
에이전트 시스템에 관심이 있다면 알려주세요.
[13:53]
또한 이 강력한 모델로
[13:55]
무엇을 만들 계획인지
[13:58]
아래 댓글 섹션에 남겨주세요.
[14:00]
이 영상이 도움이 되었길 바랍니다.
[14:01]
시청해 주셔서 감사합니다.
[14:04]
다음 영상에서 만나뵙겠습니다.