3.2.1 LangChain과 Chroma를 활용한 RAG 구성 + Upstage Embeddings.ipynb 파일을 .py로 변환하여 실행시켰는데, 결과가 제대로 나오지 않습니다. 한번인가 정확하게 나왔던것 같습니다. 무슨 문제 인지 궁금합니다. -------------------------------- %runfile /home/sjhappy/downloads/source_code/LLM/inflearn-lim-application/3_2_ 2.py --wdir /home/sjhappy/anaconda3/envs/LLM_EN/lib/python3.9/site-packages/langsmith/client.py:253: LangSmithMissingAPIKeyWarning: API key must be provided when using hosted LangSmith API warnings.warn( {'query': '연봉 3천만원인 직장인의 소득세는 얼마인가요?', 'result': '질문에서 제공된 정보로는 정확한 소득세를 계산할 수 없습니다. 소득세는 근로소득 외에 다른 소득, 세액공제 및 감면액 등에 따라 달라질 수 있습니다. 따라서, 더 자세한 정보를 제공해주시면 소득세를 계산해드릴 수 있습니다.'} ------------------ # coding: utf-8 # # 1. 패키지 설치 # In[1]: # # 2. Knowledge Base 구성을 위한 데이터 생성 # # - [RecursiveCharacterTextSplitter]( https://python.langchain.com/v0.2/docs/how_to/recursive_text_splitter/)를 활용한 데이터 chunking # - split 된 데이터 chunk를 Large Language Model(LLM)에게 전달하면 토큰 절약 가능 # - 비용 감소와 답변 생성시간 감소의 효과 # - LangChain에서 다양한 [TextSplitter]( https://python.langchain.com/v0.2/docs/how_to/#text-splitters)들을 제공 # - chunk_size 는 split 된 chunk의 최대 크기 # - chunk_overlap 은 앞 뒤로 나뉘어진 chunk들이 얼마나 겹쳐도 되는지 지정 # In[1]: from langchain_community.document_loaders import Docx2txtLoader from langchain_text_splitters import RecursiveCharacterTextSplitter text_splitter = RecursiveCharacterTextSplitter( chunk_size=1500, chunk_overlap=200, ) loader = Docx2txtLoader('./tax.docx') document_list = loader.load_and_split(text_splitter=text_splitter) # In[2]: from dotenv import load_dotenv from langchain_upstage import UpstageEmbeddings # 환경변수를 불러옴 load_dotenv() # OpenAI에서 제공하는 Embedding Model을 활용해서 chunk 를 vector화 embedding = UpstageEmbeddings(model="solar-embedding-1-large") # In[7]: from langchain_chroma import Chroma # 데이터를 처음 저장할 때 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) # # 3. 답변 생성을 위한 Retrieval # # - Chroma 에 저장한 데이터를 유사도 검색( similarity_search() )를 활용해서 가져옴 # In[8]: query = '연봉 3천만원인 직장인의 소득세는 얼마인가요?' # k 값을 조절해서 얼마나 많은 데이터를 불러올지 결정 retrieved_docs = database.similarity_search(query, k=4) # In[9]: retrieved_docs # # 4. Augmentation을 위한 Prompt 활용 # # - Retrieval된 데이터는 LangChain에서 제공하는 프롬프트( "rlm/rag-prompt" ) 사용 # In[10]: from langchain_upstage import ChatUpstage llm = ChatUpstage() # In[11]: from langchain import hub prompt = hub.pull("rlm/rag-prompt") # # 5. 답변 생성 # # - [RetrievalQA]( https://docs.smith.langchain.com/old/cookbook/hub-examples/retrieval-qa-chain)를 통해 LLM에 전달 # - RetrievalQA 는 [create_retrieval_chain]( https://python.langchain.com/v0.2/docs/how_to/qa_sources/#using-create_retrieval_chain)으로 대체됨 # - 실제 ChatBot 구현 시 create_retrieval_chain 으로 변경하는 과정을 볼 수 있음 # In[12]: from langchain.chains import RetrievalQA qa_chain = RetrievalQA.from_chain_type( llm, retriever= database.as _retriever(), chain_type_kwargs={"prompt": prompt} ) # In[13]: ai_message = qa_chain({"query": query}) # In[14]: # 강의에서는 위처럼 진행하지만 업데이트된 LangChain 문법은 .invoke() 활용을 권장 ai_message = qa_chain.invoke({"query": query}) # In[15]: print(ai_message) # In[ ]:
안녕하십니까? 좋은 강의 1회독 후, 계속 부족한 부분 수강하는 수강생입니다. 다시 공부하다가 제대로 이해하게 맞는지 궁금한게 있어 질문드렸습니다. ORM이라하면 Python 환경에서 외부 서버에 구동되고 있는 DB에 대해서 객체지향의 추상화와 상속의 개념을 적용하여 Python에서 외부 서버의 DB에 대해서 SQL 명령어를 수행할 수 있도록 도움을 준다라고 이해하면 좋을까요?
안녕하세요. driver.find_element(By.CSS_SELECTOR, "#id").click() 아이디 패스워드부분을 작성하실때는 #id 를 사용하시고 다른 버튼 및 선택 부분은 .class를 사용하시는데 차이가 있을까요? 개발자도구에서 ID 부분에서 ID도 있지만 class도 있어서요. ID가 명시되어 있다면 ID로 하면되고 그렇지 않다면 Class를 넣어서 사용하면 될까요?
안녕하세요. feature scaling 부분에 그래프 예시 (before, after) 에 표준정규화를 거치면 분포가 다 같아지는것처럼 그려졌는데 각각 다른 분포를 가진 데이터들이 전부 같은 분포로 바뀌게 되면 서로 다른 데이터의 의미자체를 잃어버리는것 아닌가요? 감사합니다.
기존에는 fastapi를 간략하게 이해하고, async def를 쓰면 비동기처리를 수행한다고 해서, 사용하였지만, 비동기처리가 안 되길래, 무슨 문제인지 몰랐는데, await를 추가해줘야 한다는 것을 알게 되었습니다. 그러면 강의에서는 네트워크 IO를 발생시키는 작업에 대해서는 await를 사용하신다고 하고, ORM 객체 명령어는 동기처리를 해도 된다고 하셨는데, commit이랑 DB에서 사용되는 CRUD가 주로 네트워크 IO를 발생시키는 작업이라고 이해해도 되는걸까요?
안녕하세요! 섹션3 2.8)페이지별 레이아웃 설정하기 강의에서 20분44초부터 시작하는 enterKey로 페이지 이동하는 부분에서 질문 있습니다 <form>태그 + e.preventDefault() 그리고 onSubmit을 사용하면 클릭+enterKey를 작동하게 할 수 있잖아요 혹시 강사님께서는 file같은 form을 진짜 제출하는게 아닐땐 form태그 사용하는걸 지양하시는 편인가요?? 혹시 그렇다면 이유도 물어봐도 될까요?? 감사합니다!!
파이썬 알고리즘 트레이딩 파트2: Interactive Brokers API를 활용한 실시간 알고리즘 트레이딩
안녕하세요. 추가 질문 드립니다. sp500 데이타 가져오는 부분에서 오류가 나서 그런지 그래프가 안그려지네요. 아마 강의 당시와 지금(2024.2)과 환경 차이가 있어서 그런지 잘 모르겠습니다. data_1d 값을 어떠한 예외 처리를 해야 하는지 문의 드립니다. 감사합니다.
혹시 useQuery에 작성하는 queryKey와 queryFn함수에 작상하는 next.tags의 queryKey는 무슨 상관관계가 있는 건가요 ? 둘의 값이 무조건 같아야 하는 줄 알았는데 useQuery엔 searchParams / queryFn함수엔 searchParams.q로 작성하셔서 여쭤봅니다. (next.tags엔 문자열만 가능한 점은 알고있습니다 ! )
커머셜이나 금융 얘기해주셨는데 전자는 권리 문제 후자는 보안문제때문에 강의에 사용된 openAI 모델은 사용하기 힘듭니다. 양쪽 문제를 해결할 수 있는게 로컬AI라고 생각하는데요. 현재는 LLAMA3이 나와있고, LLAMA4가 상반기에 출시된다고 들었는데 해당 70b~8b 모델 정도로 실무에 적용가능한 현실적인 강의도 있을 수 있는지 궁금합니다.