[8기 랭체인] 교수님 책 좀 설명해주세요


안녕하세요 신묘한힘입니다. GPT에 입문한지 얼마 안됐을 때, pdf를 올리면 분석해준다고 그래서 제가 가지고 있던 대학 교재 pdf를 올렸는데 분석이 안되는 것을 알았습니다.. 알고보니 스캔된 교재는 텍스트 인식을 할 때, OCR을 써야 한다고 하는군요.. 또 알아보니 OCR은 유료 서비스가 대다수였고, 무료툴도 있긴 하지만 이왕 하는 거 한번 만들어볼까 해서 시작하게 되었습니다…

조약한 코드들이지만 양해부탁드리며 여러 개선할 부분이라던지, 아이디어라던지 주시면 너무 감사드리겠습니다. 짧은 부트캠프 기간 동안 그래도 하나의 툴을 익힌 것 같아 기분이 좋습니다 ㅎㅎ. 그럼 👀 시작해보겠습니다



OCR의 개념

스캔된 이미지로부터 텍스트를 추출하는 방법이 OCR입니다.

과정을 물어보니, PIL 라이브러리와 Pytesseract를 추천하길래 그것을 사용해보려고 합니다.

OCR을 어떻게 적용하면 좋을지, 처리 과정을 물어보게 되었습니다.

😶‍🌫️ 아직은 뭐가 뭔지 잘 모르기에 일단 youtube 이런 곳을 뒤져서 pytesseract를 어떻게 사용하는지를 검색해보았습니다.

tesseract의 다운로드와 예제를 보시고 싶으시면 이 영상을 참고하시면 될 것 같습니다!

원래 아이디어는 PyPDF 라이브러리로 각각 페이지를 받아와서 OCR을 하는 것이었는데 이게 왜 안되는지 모르겠는데 .pages 데이터에서 이미지를 따로 추출해서 저장하는 과정에서 자꾸 에러가 나서 며칠 고민하다가 사뿐히 내려놓고 다른 방법을 마련했습니다!

그 방법은 그냥 각각의 페이지를 이미지 파일로 만들어버려서 저장하자..

완전 무식한 방법이지만, 가장 직관적인 방법이라 생각했기에, PDF 파일을 읽어서 각각의 페이지를 이미지로 만들어버리는 모듈을 불러왔습니다

pdf2image를 쓰려고 하면 poppler 이라는 것도 따로 다운로드를 받아서 poppler path에 경로를 넣어주셔야 합니다!

그러고 나서는 같은 workspace내에 save_folder라는 것을 새로 만들어서 거기 안에 .png파일들을 저장하려고 했습니다!

쓰인 pdf는 제 전공책인 전력전자.. 무려 500page의 텍스트북입니다

대충 요런 식으로 save_folder 밑에 저장이 되게 됩니다.

Image 준비는 끝났고, 이제 OCR을 하는 부분이 남았습니다. 의외로 되게 간단하게 뽑을 수 있었습니다. 지금은 Text만 뽑고 나중에는 그림까지 해보고 싶습니다 ㅠ……ㅠ

save_folder을 돌면서 모든 이미지 파일들을 돌면서 OCR을 돌리고, text에다가 그냥 다 우겨넣었습니다. 이것 땜에 좀 오래걸리나..(?) 시간을 줄일 수 있는 방법이 있을지 궁금합니다..

어찌 됐든 순수한 텍스트북으로 500 페이지 되는 전공책 글자를 다 불러오려니 시간이 엄청 걸리더군요.. (약 6시간..?) 시간을 줄일 수 있는 로직을 생각해봐야겠습니다.

lang = ‘eng’으로 설정했는데 한국어도 같이 인식하고 싶으시면 lang=’kor+eng’ 하시면 됩니다만 한국어는 삑사리가 좀 많이 납니다. 데이터도 추가로 다운로드 받아야 하구요.

귀찮기도 하지만, 전공책은 영어니까 아무래도. ㅎㅎㅎ

  • 하다보니 문제가 있었던게 일단 OCR을 돌리고 나서 text를 보게 되면 사실 되게 엉망입니다. 어떤건 띄어쓰기가 되어있고, 어떤건 아니고, 괜찮긴 한데 뭔가 이상합니다.. 그래서 GPT에게 도움을 쳤습니다.

  • 1. tesseract 조정 , 2. 공백 조절 , 3. 자연어 처리 도구 사용, 4. 정규식 사용

    제가 가장 끌렸던 것은 자연어 처리 도구를 사용하는 것 이었습니다.. 편하게 살고 싶었습니다


  • 그렇기에 한번더 pip install spacy를 합니다.

  • 하지만 여기서 하나 더 하자면, spacy 모델을 로드 할 때, 언어를 지정 해줘야 합니다. 그렇기에 다운로드 하실 때, 같이 깔아주세요 :

  • python -m spacy download en_core_web_sm

— 이렇게 후처리를 한 corrected_text를 출력해보면…

 Save and compile your completed \n VHDL code . \n\n 22 \n copyright © 2005 Delmar Thomson Learning \n Digital ’ Design with ....

요런식으로 잘 나오는 것을 확인해볼 수 있답니다. ??? : 오 된다


Text → Embedding → Vectorstore

  • Raw text도 준비가 되어있겠다, 드디어 나만의 작은 교수님을 만들 수 있게 되었습니다.교수님 그러게 잘 가르쳐주셨어야죠.. 안 그럼 이런 짓은 하지 않았을 거에요.

  • 작은 교수님이 될 수 있게 text들을 잘라주겠습니다.

    • 아무래도 지금 text들은 긴 가래떡과 같습니다. 먹으려고 하면 얼마 못 먹고 목 맥힐 것 같으니 먹기 좋은 크기로 잘라주겠습니다.

먹기 좋은 크기로 자른 가래떡들은 냉장고에 넣어서 언제든 꺼내 먹을 수 있게 하겠습니다.

FAISS라는 Vectorstore을 사용해주겠습니다. 나만의 작은 교수님이 제 이상한 질문도 잘 이해하실 수 있게 Similarity Search에 특화된 vector DB입니다.

잠시 RecursiveCharacterTextSplitter에 대해서 설명을 하자면, 큰 단위 (문단) 에서 작은 단위(단어) 순으로 size를 체크합니다. 만약 한 문단이 설정된 chunk_size보다 작으면 문단 단위로 chunk를 해버립니다. 만약 첫 번째 문단이 600 단어고, 두 번째 문단이 500 단어라면, 첫 번째 문단 < chunk_size 이니, 두 번째 문단을 보는데 첫번째 문단 + 두 번째 문단 > chunk_size기 때문에 첫번째 문단과 두번째 문단은 다른 chunk로 들어가는 겁니다.

그래서 생성된 first_chunk_size = 600 , second_chunk_size는 세번째 문단과 또 비교해서 두번째 문단 + 세번째 문단이 chunk size와 계속 비교해서 생성이 되는 것입니다..

말로 하려니 어렵네요. 설명 영상 첨부해두겠습니당.

[RecursiveCharacterTextSplitter]

작은 교수님 설명이 교과서를 그대로 베낀 것처럼 정확하네요! (사실 맞음)

교수님께 한 마디 했다가 답변 폭격을 맞아서 정신이 어지러우니 감히 요약해서 말해달라고 부탁드려보겠습니다.

The forward converter is suitable for low to medium power levels up to 500 W, but has high voltage stress for the transistor and requires an extra filter inductor. The push-pull converter is used for medium to high power requirements up to 1000 W, but also has high voltage stress for the transistors and potential core saturation issues.

이런이런 역시 길긴하지만 그래도 교수님이 나름 배려를 해주신 것 같습니다.

이 정도로 만족하기에는 뭔가 부족한 느낌이 납니다. 그저 텍스트북을 그저 읽어주는 따분한 교수님인 것 같습니다.

그래서 비슷하게 교과서를 기반으로 하지만, 좀 더 대화하는 느낌을 살려보고 싶으니 Chatting chain을 만들어보겠습니다.

으음 나름 만족스러운 나만의 작은 교수님이 제법 형태를 갖췄네요.

한번 질문을 해보겠습니다.

교수님! AC 교류를 DC 직류로 변환시키고 싶으면 어떡해야하나요?

교수님 :

AC를 DC로 변환하려면 정류기 회로를 사용할 수 있습니다. 정류기에는 반파 정류기와 전파 정류기의 두 가지 유형이 있습니다. \반파 정류기의 경우 다이오드를 사용하여 AC 파형의 양의 절반만 통과하도록 하여 맥동하는 DC 출력을 생성할 수 있습니다. \전파 정류기의 경우 브리지 구성으로 배열된 4개의 다이오드로 구성된 브리지 정류기 회로를 사용할 수 있습니다. 이렇게 하면 AC 파형의 양극과 음극 절반이 모두 DC로 변환되어 출력이 더 부드러워집니다.\n\n정류된 DC 출력에는 여전히 약간의 리플이나 변동이 있을 수 있다는 점에 유의해야 합니다. 출력을 더욱 부드럽게 하려면 일반적으로 커패시터 및/또는 인덕터로 구성된 필터 회로를 사용하여 리플을 줄이고 보다 안정적인 DC 전압을 제공할 수 있습니다.\n\n이 도움이 되었기를 바랍니다! 추가 질문이 있으면 언제든지 알려주세요."

(DeepL로 번역한거에용)

음! 자세하게 대답해줘서 교수님 너무 감사한데 제가 사실 3줄 이상은 읽기 힘든데요… 요약좀 해주세요!

다시 물어보니 교수님께서 친절하게(?) 대답해주셨습니다.

{'input_document': "AC를 DC로 변환하려면 정류기 회로를 사용할 수 있습니다. 정류기에는 반파 정류기와 전파 정류기의 두 가지 유형이 있습니다. \반파 정류기의 경우 다이오드를 사용하여 AC 파형의 양의 절반만 통과하도록 하여 맥동하는 DC 출력을 생성할 수 있습니다. \전파 정류기의 경우 브리지 구성으로 배열된 4개의 다이오드로 구성된 브리지 정류기 회로를 사용할 수 있습니다. 이렇게 하면 AC 파형의 양극과 음극 절반이 모두 DC로 변환되어 출력이 더 부드러워집니다.\n\n정류된 DC 출력에는 여전히 약간의 리플이나 변동이 있을 수 있다는 점에 유의해야 합니다. 출력을 더욱 부드럽게 하려면 일반적으로 커패시터 및/또는 인덕터로 구성된 필터 회로를 사용하여 리플을 줄이고 보다 안정적인 DC 전압을 제공할 수 있습니다.\n\n이 도움이 되었기를 바랍니다! 추가 질문이 있으면 알려주세요.",

'output_text': '정류기 회로는 AC를 DC로 변환하는 데 사용됩니다. 정류기에는 반파 정류기와 전파 정류기의 두 가지 유형이 있습니다. 반파 정류기는 AC 파형의 양의 절반만 통과시키는 반면, 전파 정류기는 AC 파형의 양의 절반과 음의 절반을 모두 DC로 변환합니다. 그러나 정류된 DC 출력에는 여전히 약간의 리플이 있을 수 있으며, 이는 필터 회로를 사용하여 줄일 수 있습니다."}.


😘 이로써 3주간의 부트캠프 동안 Langchain을 이용해서 나만의 작은 교수님을 만들어보는 프로젝트를 해봤습니다.

좀 더 다양한 기능을 추가해서 나만의 큰 교수님을 만들어 보고 싶네요! 감사합니다 🐰

6
3개의 답글

👉 이 게시글도 읽어보세요