인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

bom20065님의 프로필 이미지
bom20065

작성한 질문수

RAG를 활용한 LLM Application 개발 (feat. LangChain)

보안 및 오픈소스 활용

해결된 질문

작성

·

201

0

안녕하세요, 우선 좋은 강의 만들어주셔서 감사하다는 말씀 먼저 드립니다.

 

조그마한 회사에 재직 중인 신입 개발자입니다.

AI를 분야를 다루는 것은 처음이라 백그라운드 지식이 전혀 없는 상태임을 양해 부탁드립니다.

 

현재 강의를 완강하지는 못했지만, 질문이 있습니다.

저 말고 다른 분도 질문을 올리신 거 같긴 한데, 제가 궁금한 것은

현재 외부에 공개되는 것에 민감한 자료에 대해 llm이 잘 답변하는 것을 목표인 프로젝트를 맡게 되었는데요,

민감한 정보이다 보니, 클라우드 서버를 사용하지 않고, 직접 서버를 구매할 예정이라고 들었습니다.

 

openAI의 api와 같은 외부 api 사용도 어려울 것으로 생각 됩니다. (외부 api를 사용해 rag를 구성하는 것에 대해서 민감하게 생각하시는 거 같습니다)

 

그래서 저와 같은 상황일 때는 임베딩 부분이나 vectorDB 구성을 어떻게 하는 것이 좋을까요? llm 모델은 llama3를 활용하면 문제가 없을 거 같은데, 정말 중요한 임베딩과 vectorDB 구성에서 고민이 많습니다. vectorDB는 AWS를 활용하지 않는 Chroma를 이용한다고 하더라도, 임베딩을 어떤 것을 사용하면 좋을지 고민이 됩니다.

 

감사합니다.

답변 1

0

강병진님의 프로필 이미지
강병진
지식공유자

임베딩은 오픈소스로 공개된 것들중에 괜찮은걸 발견하지 못했씁니다. ㅠㅠ 저는 회사에서는 upstage embedding 사용하고 있어요. 강의에서도 말씀드리지만 한국어 임베딩은 상용화 모델중에 최강입니다. 정말 따라올 모델이 없는 것 같아요.

 

업스테이지 약관상에는 데이터를 보관하거나 저장하지 않는다고 되어있어서 한번 문의해보시면 좋을것같습니다.

 

https://developers.upstage.ai/docs/apis/embeddings

bom20065님의 프로필 이미지
bom20065
질문자

from dotenv import load_dotenv
from langchain_community.chat_models import ChatOllama
from langchain_community.document_loaders import Docx2txtLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_chroma import Chroma
from langchain import hub
from langchain.chains import RetrievalQA

load_dotenv()

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1500,
    chunk_overlap=200,
)

loader = Docx2txtLoader('./tax.docx')
document_list = loader.load_and_split(text_splitter=text_splitter)

embedding = HuggingFaceEmbeddings(model_name='jhgan/ko-sroberta-multitask')

# 데이터를 처음 저장할 때
# database = Chroma.from_documents(documents=document_list, embedding=embedding, collection_name='chroma-tax', persist_directory="./chroma")

# 이미 저장된 데이터를 사용할 때
database = Chroma(collection_name='chroma-tax', persist_directory="./chroma", embedding_function=embedding)

# query = '연봉 5천만원인 직장인의 소득세는 얼마인가요?'
query = '연봉 5천만원인 직장인의 소득세는 얼마인가요?, 한국어로 답해주세요.'
# query = '총 급여액이 5000만원인 거주자의 소드, 한국어로 대답해주세요.'

# `k` 값을 조절해서 얼마나 많은 데이터를 불러올지 결정
retrieved_docs = database.similarity_search(query, k=3)

print(retrieved_docs)

llm = ChatOllama(model="llama3")

prompt = hub.pull("rlm/rag-prompt")

qa_chain = RetrievalQA.from_chain_type(
    llm,
    retriever=database.as_retriever(),
    chain_type_kwargs={"prompt": prompt}
)

ai_message = qa_chain.invoke({"query": query})

print(ai_message)

현재로서는 외부 api 사용이 어려워서, hub만 api키를 발급 받아서 위와 같은 소스코드를 작성했습니다.

아래와 같은 결과를 확인할 수 있었는데요,

 


C:\Users\dev\anaconda3\envs\llmrag-test\lib\site-packages\transformers\tokenization_utils_base.py:1601: FutureWarning: clean_up_tokenization_spaces was not set. It will be set to True by default. This behavior will be depracted in transformers v4.45, and will be then set to False by default. For more details check this issue: https://github.com/huggingface/transformers/issues/31884

warnings.warn(

retrieved_docs Start ==========================================

[Document(metadata={'source': './tax.docx'}, page_content='제55조(세율) ①거주자의 종합소득에 대한 소득세는 해당 연도의 종합소득과세표준에 다음의 세율을 적용하여 계산한 금액(이하 “종합소득산출세액”이라 한다)을 그 세액으로 한다. <개정 2014. 1. 1., 2016. 12. 20., 2017. 12. 19., 2020. 12. 29., 2022. 12. 31.>\n\n| 종합소득 과세 표준 | 세율 |\n\n| --------------------- | ----------------------------------- |\n\n| 1,400만원 초과 | 과세표준의 6퍼센트 |\n\n| 1,400만원 초과 5,000만원 이하 | 84만원 + 1,400만원을 초과하는 금액의 24퍼센트 |\n\n| 5,000만원 초과 8,800만원 이하 | 624만원 + (5,000만원을 초과하는 금액의 24퍼센트) |\n\n| 8,800만원 초과 1억5천만원 이하 | 1,536만원 + (8,800만원을 초과하는 금액의 35퍼센트) |\n\n| 1억5천만원 초과 3억원 이하 | 3,706만원 + (1억5천만원을 초과하는 금액의 38퍼센트) |\n\n| 3억원 초과 5억원 이하 | 9,406만원 + (3억원을 초과하는 금액의 40퍼센트) |\n\n| 5억원 초과 10억원 이하 | 1억7,406만원 + (5억원을 초과하는 금액의 42퍼센트) |\n\n| 10억원 초과 | 3억8,406만원 + (10억원을 초과하는 금액의 45퍼센트) |\n\n\n\n② 거주자의 퇴직소득에 대한 소득세는 다음 각 호의 순서에 따라 계산한 금액(이하 “퇴직소득 산출세액”이라 한다)으로 한다.<개정 2013. 1. 1., 2014. 12. 23.>\n\n1. 해당 과세기간의 퇴직소득과세표준에 제1항의 세율을 적용하여 계산한 금액\n\n2. 제1호의 금액을 12로 나눈 금액에 근속연수를 곱한 금액\n\n3. 삭제<2014. 12. 23.>\n\n[전문개정 2009. 12. 31.]\n\n\n\n제2관 세액공제 <개정 2009. 12. 31.>\n\n\n\n제56조(배당세액공제) ① 거주자의 종합소득금액에 제17조제3항 각 호 외의 부분 단서가 적용되는 배당소득금액이 합산되어 있는 경우에는 같은 항 각 호 외의 부분 단서에 따라 해당 과세기간의 총수입금액에 더한 금액에 해당하는 금액을 종합소득 산출세액에서 공제한다. <개정 2009. 12. 31.>\n\n② 제1항에 따른 공제를 “배당세액공제”라 한다.<개정 2009. 12. 31.>\n\n③ 삭제<2003. 12. 30.>\n\n④ 제1항을 적용할 때 배당세액공제의 대상이 되는 배당소득금액은 제14조제2항의 종합소득과세표준에 포함된 배당소득금액으로서 이자소득등의 종합과세기준금액을 초과하는 것으로 한다.<개정 2009. 12. 31.>\n\n⑤ 삭제<2006. 12. 30.>'), Document(metadata={'source': './tax.docx'}, page_content='② 제1항에서 규정한 국내원천소득을 실질적으로 귀속받는 자(그 대리인 또는 「국세기본법」 제82조에 따른 납세관리인을 포함한다)가 그 소득에 대하여 조세조약에 따른 비과세ㆍ면제 또는 제한세율에 관한 규정을 적용받으려는 경우에는 제1항에 따라 세액이 원천징수된 날이 속하는 달의 다음 달 11일부터 5년 이내에 대통령령으로 정하는 바에 따라 원천징수의무자의 납세지 관할 세무서장에게 경정을 청구할 수 있다. 다만, 「국세기본법」 제45조의2제2항 각 호의 어느 하나에 해당하는 사유가 발생하였을 때에는 본문에도 불구하고 그 사유가 발생한 것을 안 날부터 3개월 이내에 경정을 청구할 수 있다.<개정 2016. 12. 20., 2019. 12. 31., 2023. 12. 31.>\n\n③ 제2항에 따른 경정의 청구를 받은 세무서장은 그 청구를 받은 날부터 6개월 이내에 과세표준과 세액을 경정하거나 경정하여야 할 이유가 없다는 뜻을 그 청구를 한 자에게 알려야 한다.\n\n[전문개정 2009. 12. 31.]\n\n[제목개정 2018. 12. 31.]\n\n\n\n제156조의5(비거주 연예인 등의 용역 제공과 관련된 원천징수 절차 특례) ① 비거주자인 연예인 또는 운동가 등 대통령령으로 정하는 자(이하 이 조에서 “비거주 연예인등”이라 한다)가 국내에서 제공한 용역(제119조제6호ㆍ제7호 및 제12호를 포함한다. 이하 이 조에서 같다)과 관련하여 지급받는 보수 또는 대가에 대해서 조세조약에 따라 국내사업장이 없거나 국내사업장에 귀속되지 아니하는 등의 이유로 과세되지 아니하는 외국법인(이하 이 조에서 “비과세 외국연예등법인”이라 한다)에 비거주 연예인등이 국내에서 제공한 용역과 관련하여 보수 또는 대가를 지급하는 자는 조세조약에도 불구하고 그 지급하는 금액의 100분의 20의 금액을 원천징수하여 그 원천징수한 날이 속하는 달의 다음 달 10일까지 대통령령으로 정하는 바에 따라 원천징수 관할 세무서, 한국은행 또는 체신관서에 납부하여야 한다. <개정 2012. 1. 1., 2018. 12. 31.>\n\n② 제156조제1항에도 불구하고 비과세 외국연예등법인은 비거주 연예인등의 용역 제공과 관련하여 보수 또는 대가를 지급할 때 그 지급금액의 100분의 20의 금액을 지급받는 자의 국내원천소득에 대한 소득세로서 원천징수하여 그 원천징수한 날이 속하는 달의 다음 달 10일까지 대통령령으로 정하는 바에 따라 원천징수 관할 세무서, 한국은행 또는 체신관서에 납부하여야 한다. 이 경우 비거주 연예인등이 국내에서 제공한 용역과 관련하여 비과세 외국연예등법인에 대가를 지급하는 자가 제1항에 따라 원천징수하여 납부한 경우에는 그 납부한 금액의 범위에서 그 소득세를 납부한 것으로 본다.\n\n③ 제1항에 따라 원천징수하여 납부한 금액이 제2항에 따라 원천징수하여 납부한 금액보다 큰 경우 그 차액에 대하여 비과세 외국연예등법인은 대통령령으로 정하는 바에 따라 관할 세무서장에게 환급을 신청할 수 있다.\n\n[전문개정 2009. 12. 31.]'), Document(metadata={'source': './tax.docx'}, page_content='1. 「법인세법」 제67조에 따라 처분된 상여ㆍ배당 및 기타소득에 대한 원천징수세액\n\n2. 「국제조세조정에 관한 법률」 제13조 또는 제22조에 따라 처분된 배당소득에 대한 원천징수세액\n\n3. 제156의5제1항 및 제2항에 따른 원천징수세액\n\n[전문개정 2009. 12. 31.]\n\n\n\n제128조(원천징수세액의 납부) ① 원천징수의무자는 원천징수한 소득세를 그 징수일이 속하는 달(금융투자소득의 경우 해당 과세기간의 반기 중에 금융계좌가 해지된 경우에는 그 반기 종료일이 속하는 달)의 다음 달 10일까지 대통령령으로 정하는 바에 따라 원천징수 관할 세무서, 한국은행 또는 체신관서에 납부하여야 한다. <개정 2010. 12. 27., 2020. 12. 29., 2022. 12. 31.>\n\n② 상시고용인원 수 및 업종 등을 고려하여 대통령령으로 정하는 원천징수의무자(금융투자소득에 대한 원천징수의무자는 제외한다)는 제1항에도 불구하고 다음 각 호의 원천징수세액 외의 원천징수세액을 그 징수일이 속하는 반기의 마지막 달의 다음 달 10일까지 납부할 수 있다.<개정 2010. 12. 27., 2020. 12. 29.>\n\n1. 「법인세법」 제67조에 따라 처분된 상여ㆍ배당 및 기타소득에 대한 원천징수세액\n\n2. 「국제조세조정에 관한 법률」 제13조 또는 제22조에 따라 처분된 배당소득에 대한 원천징수세액\n\n3. 제156의5제1항 및 제2항에 따른 원천징수세액\n\n[전문개정 2009. 12. 31.]\n\n[시행일: 2025. 1. 1.] 제128조제1항, 제128조제2항 각 호 외의 부분\n\n\n\n제128조의2(원천징수 납부지연가산세 특례) 원천징수의무자 또는 제156조 및 제156조의3부터 제156조의6까지의 규정에 따라 원천징수하여야 할 자가 국가ㆍ지방자치단체 또는 지방자치단체조합(이하 이 조에서 “국가등”이라 한다)인 경우로서 국가등으로부터 근로소득을 받는 사람이 제140조제1항에 따른 근로소득자 소득ㆍ세액 공제신고서를 사실과 다르게 기재하여 부당하게 소득공제 또는 세액공제를 받아 국가등이 원천징수하여야 할 세액을 정해진 기간에 납부하지 아니하거나 미달하게 납부한 경우에는 국가등은 징수하여야 할 세액에 「국세기본법」 제47조의5제1항에 따른 가산세액을 더한 금액을 그 근로소득자로부터 징수하여 납부하여야 한다. <개정 2014. 1. 1.>\n\n[본조신설 2012. 1. 1.]\n\n[제목개정 2020. 12. 29.]\n\n\n\n제129조(원천징수세율) ① 원천징수의무자가 제127조제1항 각 호에 따른 소득을 지급하여 소득세를 원천징수할 때 적용하는 세율(이하 “원천징수세율”이라 한다)은 다음 각 호의 구분에 따른다. <개정 2010. 12. 27., 2013. 1. 1., 2014. 1. 1., 2014. 12. 23., 2017. 12. 19., 2018. 12. 31., 2019. 12. 31., 2020. 12. 29.>\n\n1. 이자소득에 대해서는 다음에 규정하는 세율\n\n가. 삭제<2017. 12. 19.>')]

retrieved_docs End ==========================================

C:\Users\dev\anaconda3\envs\llmrag-test\lib\site-packages\langchain_core\_api\beta_decorator.py:87: LangChainBetaWarning: The function loads is in beta. It is actively being worked on, so the API may change.

warn_beta(

ai_message Start ==============================================

{'query': '연봉 5천만원인 직장인의 소득세는 얼마인가요?, 한국어로 답해주세요.', 'result': 'Based on the retrieved context, I can help answer your question.\n\nThe text appears to be discussing income tax in Korea, specifically the types of income that are subject to taxation. The relevant section is titled "필요경비 불산입" (Non-deductible business expenses) and lists 7 categories of income that do not qualify as necessary business expenses and therefore cannot be deducted from taxable income.\n\nIf you\'re asking about what types of income are considered non-deductible, I can help you with that. The answer is:\n\n1. 소득세 (Income tax) and 개인지방소득세 (Local income tax)\n2. 벌금ㆍ과료 (Fines or penalties) and 과태료 (Late payment fees)\n3. 「국세징수법」이나 그 밖에 조세에 관한 법률에 따른 가산금과 강제징수비 (Tax collection fees and penalty taxes)\n4. 조세에 관한 법률에 따른 징수의무의 불이행으로 인하여 납부하였거나 납부할 세액 (Taxes owed due to non-compliance with tax laws)\n5. 대통령령으로 정하는 가사(家事)의 경비와 이에 관련되는 경비 (Expenses related to household and personal matters, as defined by presidential decree)\n6. 각 과세기간에 계상한 감가상각자산의 감가상각비 (Depreciation of assets, calculated according to presidential decree)\n7. 제39조제3항 단서 및 같은 조 제4항 각 호에 따른 자산을 제외한 자산의 평가차손 (Capital losses, excluding assets that are exempt from taxation)\n\nLet me know if you have any further questions or if there\'s anything else I can help with!'}

ai_message End ==============================================

Process finished with exit code 0

이렇게 이상한 답변이 나오는 이유가 llama3 모델을 사용해서 그런걸까요?
표는 마크다운으로 잘 변경하였습니다. retrieved_docs 변수에는 마크다운으로 변경된 표 정보가 잘 나오는 것 같은데.. 모델이 전혀 답변을 못하는 거 같네요.. ㅠㅠ

강사님과 똑같이 진행하고 싶지만 쉽지 않은 상황이라... 한번 해보려고 하는데, 감을 못잡겠네요, 답변이 가능할까요?

온전한 한국어로 답변을 얻는 것 조차 안되는 상황입니다 ㅠ

강병진님의 프로필 이미지
강병진
지식공유자

Llama가 공식적으로 한국어를 지원하지 않습니다. Retrieval된 문서를 1로 제한해서 테스트 해보시고 그래도 답변이 좋지 못하면 llama는 포기하셔야 할 것 같아요 ㅠ. 한국어 오픈소스 모델은 아놀자에서 만든 이브이가 제일 성능이 좋은걸로 알려져 있습니다

 

https://huggingface.co/yanolja/EEVE-Korean-10.8B-v1.0

bom20065님의 프로필 이미지
bom20065
질문자

답변 감사합니다. 아무래도 포기해야할 거 같네요.. 이브이는 강사님 소스코드 방식으로는 작성하기 어려운 것 같은데 어떤 자료를 참고하면 좋을까요? 예제 소스코드라도 있으면 따라해보려고 합니다 ㅠ

강병진님의 프로필 이미지
강병진
지식공유자

langchain-hugging face 라이브러리가 있어요! 일단 공식문서 링크를 전달드립니다.

https://python.langchain.com/v0.2/docs/integrations/platforms/huggingface/

마이크가 고장나서 주문하고 배송을 기다리는 중에 있는데 마이크 도착하면 찍어서 올려드릴게요~

강병진님의 프로필 이미지
강병진
지식공유자

안녕하세요! 강의를 촬영하려고 테스트 해보니 너무 오래걸리네요... 이브이는 돌아가지도 않습니다ㅠㅠ 그런데 한국어 llm 랭킹이 바뀌었더라구요

https://huggingface.co/spaces/upstage/open-ko-llm-leaderboard

위에 있는 링크에서 랭킹을 한번 파악해보시고,

 

hugging face활용법 링크도 전달드립니다

https://huggingface.co/blog/langchain

 

마이크를 직구했는데 다음달 초에 온대요 ㅠㅠ 너무 늦어질까 싶어 링크먼저 전달드립니다!

bom20065님의 프로필 이미지
bom20065
질문자

강사님의 추가 강의 기다리고 있습니다.

 

질문 올라온 걸 보니, 저와 비슷한 상황에 처해 계신분들이 더 있으신 거 같네요.

강사님에 추가 강의가 오픈소스 활용에 큰 도움이 될 거 같습니다.

 

강의 준비해주셔서 감사드립니다!

강병진님의 프로필 이미지
강병진
지식공유자

5.3강에 HuggingFace 활용방법을 추가했습니다! 일단은 활용 방법을 먼저 보시면 좋을 것 같아서 Phi3을 활용하는 예제를 촬영했어요. 질문과 답변을 영어로 진행합니다.

 

한국어 모델 RAG pipeline도 촬영은 했는데 편집하다보니 이해하기 어려운 흐름인것같아서 내일이나 모레중에 다시 촬영하려고 합니다ㅠㅠ. 5.3강의 강의자료에 소스코드는 있으니 한번 확인해보세요!

큰 기대는 하지 않으시는게 좋습니다 ㅠㅠ 오픈소스 임베딩은 상용화 모델보다는 성능이 아쉽네요

bom20065님의 프로필 이미지
bom20065
질문자

성능은 어쩔 수 없는 거 같네요.. ㅠㅠ

성능이 조금 떨어지더라도 오픈소스로 진행을 해야할 거 같아서요.. 쉽지 않네요 ㅠ

추가 강의 제공해주셔서 감사 드립니다.

강병진님의 프로필 이미지
강병진
지식공유자

흠 오픈소스가... 사실 언어모델은 쓸만해도 임베딩이 문제일것같아요. RAG를 다 구성하셔야 하는거죠?

bom20065님의 프로필 이미지
bom20065
질문자

네 맞습니다,

강사님 강의에서도 임베딩이 중요한 걸 알 수 있었는데요.

llm rag 서비스를 구동할 장비를 구비할 계획을 가지고 있는 상황(데이터 외부 유출 원천 방지)에서 오픈소스만 이용하는 것이 목표입니다.

현재 이렇게는 구성하기가 힘들까요?

강병진님의 프로필 이미지
강병진
지식공유자

장비가 있다면 속도 측면에서는 나쁘지 않을것같은데. 임베딩은 일단 모델들을 시도해보셔야 할 것 같습니다. 제생각에는 각각의 chunk사이즈를 최대한 작게 가져가면서 테스트 해보시는게 좋을 것 같아요

강병진님의 프로필 이미지
강병진
지식공유자

안녕하세요~ RAG Pipeline을 5.4강으로 추가했습니다. 아마 20분정도? 뒤에 인코딩 끝나면 확인하실 수 있을 것 같아요! 코랩 링크를 달아두었으니 강의를 보지 않으셔도 코드만 보셔도 충분히 이해하실 수 있을 것 같습니다. 좋은 피드백 덕분에 강의가 더 풍성해지는 것 같아요. 감사합니다!

bom20065님의 프로필 이미지
bom20065
질문자

빠른 피드백에 감사드립니다.

많은 도움이 되었습니다!

새로운 강의도 기대하고 있겠습니다 ㅎ

감사합니다!

bom20065님의 프로필 이미지
bom20065

작성한 질문수

질문하기