안녕하세요! 좋은 강의 너무 감사드립니다. 강의를 복습 차원에서 다시 한번 듣고 있는데, 몇가지 개선을 해보려고 합니다. 그중에서 채팅 답변 속도를 조금 더 빠르게 해보려고 하는데(몇번 사용을 해보는데 답변 생성 시간이 긴 것 같은 생각이 드네요), 혹시 추천해주실 방안이 있을까요?
안녕하세요, 우선 좋은 강의 만들어주셔서 감사하다는 말씀 먼저 드립니다. 조그마한 회사에 재직 중인 신입 개발자입니다. AI를 분야를 다루는 것은 처음이라 백그라운드 지식이 전혀 없는 상태임을 양해 부탁드립니다. 현재 강의를 완강하지는 못했지만, 질문이 있습니다. 저 말고 다른 분도 질문을 올리신 거 같긴 한데, 제가 궁금한 것은 현재 외부에 공개되는 것에 민감한 자료에 대해 llm이 잘 답변하는 것을 목표인 프로젝트를 맡게 되었는데요, 민감한 정보이다 보니, 클라우드 서버를 사용하지 않고, 직접 서버를 구매할 예정이라고 들었습니다. openAI의 api와 같은 외부 api 사용도 어려울 것으로 생각 됩니다. (외부 api를 사용해 rag를 구성하는 것에 대해서 민감하게 생각하시는 거 같습니다) 그래서 저와 같은 상황일 때는 임베딩 부분이나 vectorDB 구성을 어떻게 하는 것이 좋을까요? llm 모델은 llama3를 활용하면 문제가 없을 거 같은데, 정말 중요한 임베딩과 vectorDB 구성에서 고민이 많습니다. vectorDB는 AWS를 활용하지 않는 Chroma를 이용한다고 하더라도, 임베딩을 어떤 것을 사용하면 좋을지 고민이 됩니다. 감사합니다.
안녕하세요 4.3 강의를 기준으로 chat.py , llm.py 코드를 완료하여 chat.py 실행 시 위와 같이 bad request 오류가 나오는 데 원인을 모르겠습니다. 코드 오류는 아닌거 같은데 원인을 알 수 있을까요??? upstage 사용 중이고 pinecone 설정도 4096으로 하였습니다.
안녕하세요 강의를 따라 하나씩 실습해보고 있습니다. 사내의 데이터를 이용하여 RAG를 구현하고 있는중입니다. 질문은 추후 사내에 적용시킬때 chatGPT모델을 사용한다면 관련 내용이 외부 GPT로 전이될 가능성이있을까요? 가지고 있는 DB에서 어떤 개인의 정보를 요구했을때 보안상의 이유로 제공을 해주지 않는다고 답변이 나옵니다. 해결할 수 있는 방법이 있을까요?
코드도 동일하고 retrieved_docs 의 내용이 k값에 따라 강사님과 다르다고 쳐도, ai_message = qa_chain({"query": query}) 에서 LLM의 답변이 {'query': '연봉 5천만원인 거주자의 소득세는 얼마인가요?', 'result': '해당 질문에 대한 정보는 주어진 문서에서 직접적으로 찾을 수 없습니다. 연봉 5천만원인 거주자의 소득세를 계산하려면 추가적인 세법 정보와 공제 항목 등을 고려해야 합니다. 정확한 소득세 금액은 세무 전문가나 관련 세무 계산기를 통해 확인하는 것이 좋습니다.'} 이렇게 나오는건 뭔가 잘못된건가요?
안녕하세요 강사님 답변에 마지막에 참고한 문서의 source를 남겨 신뢰도를 올리려 합니다. prompt를 다음과 같이 추가했습니다 1. 모든 답변에는 직접적으로 참조한 자료의 목록을 추가해야 합니다. 최종 답변에 관련이 없는 자료는 제외합니다. 2. 답을 모를 경우 답을 지어내지 말고 [정확한 답을 찾을 수 없지만, 다음 링크를 확인해 보시기 바랍니다] 라고 말한 뒤 자료 링크를 목록으로 추가합니다. 문제는 출처를 남길 때 AI가 참고한 자료를 남길 때도 있지만 AI가 존재하지 않는 source를 문서내의 링크나 내용과 조합해서 만들어내는 일종의 hallucination이 발생하는 것 입니다 ( 정확한 원인은 모르겠습니다 ) 따라서 prompt 말고 직접 data에서 pick(answer)를 하지 않고 content속 metadata : souce를 꺼내고자 하는데 강의에서의 stream으로 응답주기 전에 answer 하단 부에 [출처 : 1. aaa, 2. bbb] 하기 위해서는 chain을 수정해야 할 까요? 지금으로서는 ai_response = final_chain.pick("answer").stream( { "question": user_message }, config={ "configurable": {"session_id": "abc123"} } ) ai_resource = final_chain.pick("context").invoke( { "question": user_message }, config={ "configurable": {"session_id": "abc123"} } ) 이렇게 두번 호출해서 resource는 반복문을 통해서 떠내는 방식으로 구현해보았는데 절대 올바른 방법은 아닌 것 같아서요..
강의 시작하고 얼마 안돼서 오류가 발생하는 것을 확인할 수 있었습니다. 음... 일단 GPT랑 커뮤니티에서 찾아보고는 있는데, 아직 해결되지 않았습니다... 해당 문제로 인해서 에러가 발생하고 있습니다 ㅜ.ㅜ 추가로 현재 커널 충돌 발생하는 부분 첨부 드립니다. 다시 한번 추가 드립니다. 아래 출력문에서 강사님은 (metadata={'source': './tax.docx'}가 없이 page_content가 출력이 되시는데 제가 docx 부분에서 잘못 스플릿 한 건가요..?
from langchain.chains import RetrievalQA qa_chain = RetrievalQA.from_chain_type( llm, retriever=database.as_retriever(), chain_type_kwargs={"prompt": prompt} ) 이 예제 코드에서 create_retrieval_chain, Custom LCEL 을 사용해서 chain을 구성한 코드를 보고싶습니다.
코드가 똑같은데도 불구하고 database . a s_retriever 의 결과값이 다를 수 있을까요? a s_retriever 함수에 최소 k=5을 넣어야 제55조 항목이 검색됩니다. tax_with_markdown.docx 파일은 제공해주신 파일이고 혹시나 싶어서 pinecone index테이블도 삭제했다가 다시 생성해서 바로 찍은 결과입니다. 아래는 제 코드입니다. from langchain_community.document_loaders import Docx2txtLoader from langchain_text_splitters import RecursiveCharacterTextSplitter text_splitter = RecursiveCharacterTextSplitter( chunk_size=1500, # 각 텍스트 조각의 최대 크기 chunk_overlap=200, # 텍스트 조각 간의 중복 길이 ) # .docx 파일을 로드하고 텍스트를 분할. loader = Docx2txtLoader('./tax_with_markdown.docx') document_list = loader.load_and_split(text_splitter=text_splitter) document_list[52] from dotenv import load_dotenv from langchain_openai import OpenAIEmbeddings # 환경 변수를 로드합니다. load_dotenv() # OpenAI 임베딩 모델을 설정합니다. embedding = OpenAIEmbeddings(model='text-embedding-3-large') import os from pinecone import Pinecone from langchain_pinecone import PineconeVectorStore # Pinecone 인덱스 이름을 설정합니다. index_name = 'tax-markdown-index' # 환경 변수에서 Pinecone API 키를 가져옴 pinecone_api_key = os.environ.get("PINECONE_API_KEY") # Pinecone을 초기화 pc = Pinecone(api_key=pinecone_api_key) # from_documents()`를 사용하여 새 인덱스 생성 database = PineconeVectorStore.from_documents(document_list, embedding, index_name=index_name) query = '연봉 5천만원인 직장인의 소득세는?' retriever = database.as_retriever(search_kwargs={'k': 5}) retriever.invoke(query) 쿼리를 날린 결과를 찍어보면 5번째에서 제55조가 나옵니다. 아래는 결과값 일부입니다. [Document(metadata={'source': './tax_with_markdown.docx'}, page_content='나. 그 밖의 배당소득에 대해서는 100분의 14\n\n3. Document(metadata={'source': './tax_with_markdown.docx'}, page_content='차. 외국정부(외국의 지방자치단체와 연방국가인 외국의 지방정부 Document(metadata={'source': './tax_with_markdown.docx'}, page_content='1. 「공익신탁법」에 따른 공익신탁의 이익\n\n2. Document(metadata={'source': './tax_with_markdown.docx'}, page_content='저. 대통령령으로 정하는 복리후생적 성질의 급여\n\n4
오늘 라이브 강의 잘 들었습니다! 고맙습니다. LangSmith에서 rag-answer-vs-reference로 평가하는데 각 항목의 점수가 0,1로만 나와서 아쉽네요. 더 세분화된(예: 5단계) 점수로 평가하려면 어떻게 바꿔야 할지 궁금합니다. 그리고 실제로 사용하실 때 몇 단계 평가를 많이 쓰시나요?
저는 R.A.G를 통한 LLM 챗봇을 개발을 하기위해 본 강의를 수강하기 시작했는데 너무 유읙합니다. 이럴 경우에도 embedding을 해서 R.A.G를 통해 retrieve가 가능한지 여쭤보고 싶어요. 데이터 크롤링 (컬럼 중에 리뷰데이터)의 데이터를 전처리해서 바로 Embedding을 통해 vector database에 넣어서 RAG를 활용할 수 있나요? 결과물에 대한 시나리오는 User가 챗봇에게 피부관련 사진 또는 문제에 대해서 고민을 입력하면 특정 논문 (강사님 강의에서 tax 파일과 같은 의미)을 기반으로 답변을 주게 되며 동시에 특정 쇼핑몰의 화장품의 리뷰들을 요약해주며 해당 제품을 추천하는 형태의 서비스입니다. 지금 생각으로는 데이터크롤링을 통해 긁어온 모든 자료들을 embedding해서 RAG할 수 있을 것 같은데 그것에 가능한지 궁금합니다.
안녕하세요 강사님 먼저 훌륭한 강의 공유해주셔서 너무 감사합니다 저는 지금 사내 위키를 크롤링해서 그 내용을 학습하고 이에 대한 내용을 GPT에게 질문했을 때 답변하는 챗봇을 개발하고 있습니다. 가이드 문서에는 이미지 파일을 통한 예시와 함께 작성된 가이드 문서가 많은데 이를 어떻게 학습시키거나 이용자에게 뿌려줄 수 있을지 궁금합니다 첨부된 GPT답변을 보시면 예제 스크린샷이라고 나오지만 제가 문제로 예상하는것은 위키가 로그인 된 사용자만 열람이 가능하기 때문에 이미지 링크 파일 또한 로그인되지 않은 상태에서는 접근이 불가능하기 때문입니다. 혹시 답변에 도움이 될까 싶어 제가 구현한 단계를 마지막으로 질문 마치겠습니다 크롤링(selenium)을 통해 wiki를 탐색하며 .txt파일로 긁어옵니다 표 같은경우 강사님 조언대로 table -> markdown code태그는 ```code``` 태그로 감싼다 image데이터의 경우 src에서 파일 링크를 추출해서 text로 변환 (ex https://cdn.inflearn.com/public/files/courses/324145/9b8f6df3-8278-446f-b0da-394371126807/inflearn_python_07.png) DirectoryLoader로 파일들을 embedding해서 벡터화 강의 따라가며 나머지 동일하게 구현
안녕하세요! 강의를 듣고 docx를 가지고 RAG 설정하는 걸 배우고나서 JSON파일을 가지고 RAG을 설정해보려고 하는데요, 이렇게 json을 로드하면 한글이 잘 출력이 됩니다. 하지만, langchain의 JSONLoader를 이용해서 load and split을 하려고 하면 해당 부분이 인코딩 되어 출력됩니다. 공식문서에서 해결방법을 찾지 못했는데, 혹시 강사님께서 해당 문제를 해결하는 방법에 대해서 알고 있으실까요?