ReaderWriteLock 구현 연습 강의 잘 봤습니다. 강사님 환경에서는 10만번을 돌려도 락 구성이 잘 돌아가서 count가 0이 나옵니다. 제 환경에서는 Debug 모드, Release 모드 일 때 Debug: count 수가 꽤 자주 바뀝니다. Release: count 수가 0이 나올 확률이 Debug보다 약간 높습니다. 또한 컴퓨터를 리부팅 하고 돌려보면 10번중에 2번은 count의 수가 바뀝니다. 질문 CPU나 메모리 환경, 켜져있는 프로그램에 따라서 Lock 구현이 실패하는 경우가 있을까요? 제 환경입니다. AMD Ryzen 5 3600XT 6-Core Processor 메모리 32GB
안녕하세요, 팝업 활용 파트를 듣고 질문이 있어 남기게 되었습니다. 아직 앱개발을 처음 해보고 있어서 팝업 기능 개발에 대해 잘 몰라서 드리는 질문이기는 합니다. 팝업 기능은 미리 개발해두고 나중에 이벤트나 업데이트가 생기면 그 메세지를 담아 띄우게 될 텐데요, 그럼 팝업 기능을 사용하려면 무조건 서버개발이 필요한 것일까요? push 알림은 firebase 통해서 가능한 것으로 알고 있는데, 신규 기능내용을 담은 팝업이나 업데이트 유도 팝업을 띄우는 시점에 서버에서 뭔가를 작업해주어야 하는건지 궁금해서 여쭤봅니다.
public static void Print(this string text)로 메서드를 만들었을 때, 따로 Print 메서드에 인자를 전달하지 않더라도 name.Print();로 Myclass.Print(name);과 동일한 동작을 하는 것을 확인하였습니다. 그렇다면 this string text는 Print 앞에 있는 변수들 (강의에서의 코드 기준으로는 string name = "John")을 자체적으로 참조하고, John이라는 문자열을 Print 메서드 안의 text 변수로 가져오는 것이라고 이해하면 될까요?
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. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 강의 4:50 을 보고 질문드립니다. @ComponentScan을 작성하면 테스트 코드에 있는 @Configuration 도 스프링 빈으로 등록되는건가요?
이 아키텍처 기준으로 질문이 있습니다. client1번 -> LB -> 서버 -> 레디스 -> 서버 -> client2 이런 식으로 메세지를 주고 받는다고 하셨는데, 그렇다면 만약에 레디스 서버가 다운이 된다면 client2번은 메세지를 못 받게 되는건가요? 이런 경우는 어떻게 대비 해야 하나요? 레디스는 서버 한대에만 구성 해놓나요?
안녕하세요 2.6강의 32분즈음에 tangent vector가 tangent 평면에 놓여있다는 틀린말이다 라는 말을 하셨는데 탄젠트벡터는 그점에서 linear approximation된 벡터인데 왜 틀린말인지 이해가안갑니다.. 실제로 다른 서적을 봐도 틀렸다고 말하지 않는 것 같습니다.. 이유자세히 설명 부탁드립니다.
- 출장이 잦아서, 답변에 시간이 좀 걸릴 수도 있습니다. 양해 바랍니다. - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 좋은 강의 감사합니다. 3중 for loop 개선책 설명해주신 부분 이해가 가지 않아 질문드립니다. 말씀하신건 A도 B도 C도 캐쉬 친화적으로 이동 한다고 말씀하셨는데 A배열은 아래로 움직이지 않나요? 물론 matmul-host.cpp 보다는 캐쉬 미스 확률이 좋아지겠지만 A배열의 인덱스 이동은 캐쉬 친화적인거 같지 않은데 강의에서는 A도 옆으로 움직인다고 하셔서 헷갈려서 문의드립니다.
선생님 안녕하세요. 이제 막 GA4 강의를 시작한 수강생입니다. 실습을 하다가 궁금한 점이 있어서 문의드립니다. A아이디 태그매니저로 생성한 태그 코드를 C웹사이트에 심고 GA4에 연결했습니다. 그런데 B아이디 태그매니저를 사용하고 싶어서 B아이디로 생성한 태그 코드를 C웹사이트에 넣고 GA4에 연결했습니다. 그러면 A아이디로 생성한 태그는 더이상 C웹사이트에 연결이 돼있지 않은 건데요. A아이디 태그매니저에는 여전히 컨데이터 품질이 아주 좋다고 나오고, GA4 홈에서도 연결이 끊겼는지 알 수가 없어서요. 혹시 이 때 바로 태그 연결에 문제가 있음을 알 수 있는 방법은 없을까요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 강의에서 보여주신 것처럼 add라는 함수를 기반으로 다른 함수가 만들어지고, 그 함수를 기반으로 또 다른 함수가 만들어지고... 간단한 함수면 금방 찾겠지만, 복잡해지기 시작하면 디버깅이 굉장히 어려워질 것 같은데, 이런 경우는 어쩔 수 없는 것인지, 최대한 파일을 줄이고 독립적인 함수가 되도록 해야되는 것인지 궁금합니다.
바로 이전 강의에서는 순수 웹소켓에서는 토큰인증 구현안하고 기능만 돌아가도록 했음 최종강의 목표는 (stomp에서 고도화 하는 것이므로) 물론 할라면 할 수있음 예시): 쿼리 파라미터 방식으로 토큰을 포함한 WebSocket 연결 그리고 WebSocket 자체는 HTTP 헤더를 설정하는 기능을 제공하지 않기 때문에 순수 웹소켓에서는 헤더에 인증 토큰을 추가할 수 없음. ............................................................................ 이번강의에서는 토큰인증 구현할때 SockJS와 STOMP 같은 라이브러리를 사용하면 HTTP 헤더에 인증 정보를 포함시킬 수 있기에 헤더에 인증정보 포함 시켜 서버로 넘기는 식으로 구현 ! 그리고 뷰 메인에서 axios.interceptors.request.use( config => { const token= localStorage.getItem("token"); if(token){ config.headers['Authorization']= Bearer ${token} } return config; }, error => { return Promise.reject(error); } ) 이런 식으로 추가 하는 것은 HTTP 요청에 한에서 이므로 별도임 stomp의 connection 은 HTTP 엔드포인트긴하지만 HTTP 요청이 아닌 ws 요청임 따라서 뷰 메인에서 가로채서 요청에 인증 정보 넣지 않음 따라서 connec t할때 직접 헤더에 넣어야 함 .......................................................................................... 으로 이해했는데 맞을까요 ? 혹시 틀린 개념이나 빠진 부분이 있으면 알려주시면 감사하겠습니다!
앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
안녕하세요.. 활용앱53강을 보고있습니다.보통 xcode에서 프로젝트를 생성하면 일반적으로 ViewController 파일이 하나 존재하고, 그 파일이 일종의 앱실행을 담당하는 것으로 알고 있습니다. 그런데 53강에 프로젝트 화면을 보면, ViewController 파일은 없고, LoginViewController가 기존 다름 프로젝트의 ViewController 역할을 하는 것 같습니다. 그래서 이 것을 어떻게 했는지 궁금합니다. 단순히 ViewController 를 이름 변경해서 LoginViewController로 하는 것은 아닌 것 같아서요.. 혹시 스토리보드 화면의 ViewController 화면을 선택한 후에 우측의 Identifier Inspector 화면에서 클래스 명칭을 추가로 입력한 ViewConroller 클래스로 변경하면 되는 건가요?