묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결한 번에 끝내는 AI 에이전트 개발 올인원 (w. CrewAI, LangGraph, Google ADK)
섹션6장 .chroma/esl_topics폴더에 관하여
안녕하세요.좋은 강의 항상 감사드립니다.한 가지 문의드리고 싶습니다.섹션 6의 28강에서 RAG 실행 부분을 실습하던 중,제 로컬 환경에서는 코드가 에러 없이 정상적으로 실행되었지만.chroma/esl_topics 폴더가 생성되지 않는 현상이 발생했습니다.코드 상으로는 os.makedirs(PERSIST_DIR, exist_ok=True) 구문이 있으므로폴더가 자동으로 생성될 것으로 예상했는데, 실제로는 생성되지 않는 것 같습니다.혹시 해당 폴더가 생성되는 정확한 경로를 알려주실 수 있을까요?또는 Windows 환경에서는 위 코드로 폴더가 생성되지 않는 경우가 있는지도 궁금합니다.확인 부탁드립니다.감사합니다. import os from typing import Type, Optional from crewai.tools import BaseTool from pydantic import BaseModel, Field from env import OPENAI_API_KEY from langchain_community.vectorstores import Chroma from langchain_openai import OpenAIEmbeddings, ChatOpenAI from langchain_community.document_loaders import PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.chains import RetrievalQA os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY PDF_FILENAME = os.path.join("knowledge", "29ESLConversationTopic.pdf") PERSIST_DIR = os.path.join(".chroma", "esl_topics") def qa(question): os.makedirs(PERSIST_DIR, exist_ok=True) embeddings = OpenAIEmbeddings() try: has_index = bool(os.listdir(PERSIST_DIR)) except FileNotFoundError: has_index = False if has_index: vectordb = Chroma(persist_directory=PERSIST_DIR, embedding_function=embeddings) else: loader = PyPDFLoader(PDF_FILENAME) docs = loader.load() splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=100) chunks = splitter.split_documents(docs) vectordb = Chroma.from_documents(chunks, embeddings, persist_directory=PERSIST_DIR) retriever = vectordb.as_retriever(search_kwargs={"k": 3}) llm = ChatOpenAI(model="gpt-4o-mini",temperature=0.3) return RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever).run(question) class RAGToolInput(BaseModel): question: str = Field(description="질문") class RAGTool(BaseTool): name: str = "ESL_Chroma_RAG" description: str = "Retrieves from '29 ESL Conversation Topics' PDF via ChromaDB and answers questions." args_schema: Type[BaseModel] = RAGToolInput def _run(self, question: str): try: return qa(question) except Exception as e: return str(e) rag_tool = RAGTool()
-
해결됨React start with Next.js
[Todo삭제와 수정처리1] selectTodo 함수에서 filter 대신 find 메서드를 사용하면 안될까요?
function selectTodo(id) { const targetTodo = arr.find(todo => todo.id === id); if (targetTodo) { setCurrent(targetTodo); } else { setCurrent(null); } } 또는 selectTodo 함수의 파라미터를 선택한 todo 객체 자체를 넘기는 것으로 처리했을 때 차이가 있을 까요?function selectTodo(todo) { setCurrent(todo) }
-
미해결graphRAG - Neo4J로 구현하는 지식 그래프 기반 RAG 시스템 (feat. LangChain)
id(actor) 와 관련한 질문입니다
이 명령은 actor.id 를 생성하는 명령인지. 아니면 gactor.get("id") 인지 궁금합니다.
-
미해결제미니의 개발실무 - 커머스 백엔드 기본편
목록 조회에서 개념(도메인)객체를 반환할 때
현재 코드상으로 목록조회에서도 개념객체를 활용하는 것으로 확인했습니다! 하지만 한 개념 객체가 여러 개념 객체를 포함하는 경우가 있는 상태에서 페이지네이션 같이 모든 개념객체의 필드를 채워줄 필요가 없는 경우도 있을 거 같습니다. 이때, 필요한 컬럼만 추출한 데이터를 담는 별도 dto용 객체를 만든다개념 객체의 일부를 채운 값을 Page에 반환한다 실무에선 둘 중 어느 방식을 적용하는지 궁금합니다! 제 생각에는 개념(도메인) 객체는 항상 완전한 상태로 있어야 하므로 별도 프로젝션 dto용 객체를 만들어서 서비스단에서는 도메인 객체가 아닌 해당 dto 객체를 내려주는 것이 낫지 않을까 생각합니다. 또한 사용하지 않는 필드를 완전한 객체 상태로 만들어주기위해 불필요하게 많은 추가 쿼리가 발생할 수 있어서 이런 경우는 별도 값(dto)객체를 쓰는 게 나을 거 같은데 실무에서는 어떻게 하는지 궁금합니다!
-
미해결피그마 시작하기
30번 강의질문
30.7-상품확대 인터렉션 만들기에서요컴포넌트까지는 다 만들었는데요,마지막에 이미지에 붙여넣기 할때 어떤식으로 하는건지 강의 봐서는 잘 획갈려서요이미지를 4개 배치했고, 이미지가 각각 있는데 그걸 그룹화해서 넣어야 하는건지 어떤건지...잘.....
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
전처리 방법
작업형 3의 문제## 심장마비 확률이 높은사람? - 성별, 나이, 혈압, 콜레스테롤, 공복혈당, 최대 심박수 등의 컬럼이 있음 - 평가: ROC-AUC, 정확도(Accuracy), F1 을 구하시오 - target : output (1:심장마비 확률 높음, 0:심장마비 확률 낮음) - csv파일 생성 : 수험번호.csv (예시 아래 참조) ~~~ 위와 같은 문제가 실제 시험 환경에서 문제 양식과 비슷한가요? 저렇게 문제가 나오면 전처리를 어떻게 해야 하는지... 궁금합니다. 만약, 시험 환경 문제가 저렇게 나온다면..결측치 제거를 그냥 컬럼을 보고 아무 컬럼이나 제거를 해도 되는지. 그게 채점 규정에 맞을지. 그리고 결측치 제거시, fillna()를 쓰는데 아무 값이나 넣어도 되는지. fillna(method='bfill') 이런걸 써도 되는지. 이상치 제거도 그냥 이것도 임의로 뭔가 이상치 인거 같다 싶으면 제거 하는건지..이게 채점 규정에 맞을지... 애매 한거 같은데요. ============그리고 혹시나 시험 유형이 저렇게 안나온다면,문제를 좀 더 명확하게 서술 해주셔야 할 거 같아요
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
원핫인코딩 후 컬럼 개수 불일
학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!질문과 관련된 영상 위치를 알려주면 더 빠르게 답변할 수 있어요먼저 유사한 질문이 있었는지 검색해보세요 print(train.info()) print(test.info()) print(train.isnull().sum()) print(test.isnull().sum()) print(train.head()) print(test.head()) target = train['총가스사용량'].pop # import sklearn # print(sklearn.__all__) print(train.shape, test.shape) train = pd.get_dummies(train) test = pd.get_dummies(test) print(train.shape, test.shape)상기 처럼 코딩 후,컬럼값이 26, 25로 불일치하게 나와요. 왜일까요...(3196, 6) (1476, 5) (3196, 26) (1476, 25)그래서 그 이후 값들도 에러가 떠요 from sklearn.model_selection import train_test_split X_tr, X_val, y_tr, y_val = train_test_split(train, target, test_size=0.2, random_state = 0)--------------------------------------------------------------------------- TypeError Traceback (most recent call last) /tmp/ipython-input-3028840780.py in <cell line: 0>() 1 from sklearn.model_selection import train_test_split 2 ----> 3 X_tr, X_val, y_tr, y_val = train_test_split(train, target, test_size=0.2, random_state = 0) 4 frames/usr/local/lib/python3.12/dist-packages/sklearn/utils/validation.py in _num_samples(x) 397 if hasattr(x, "shape") and x.shape is not None: 398 if len(x.shape) == 0: --> 399 raise TypeError( 400 "Input should have at least 1 dimension i.e. satisfy " 401 f"`len(x.shape) > 0`, got scalar `{x!r}` instead." TypeError: Input should have at least 1 dimension i.e. satisfy `len(x.shape) > 0`, got scalar `array(<bound method Series.pop of 0 9077.8 1 10105.5 2 8603.6 3 11076.8 4 10781.4 ... 3191 12294.7 3192 10410.7 3193 10473.8 3194 9657.9 3195 9961.5 Name: 총가스사용량, Length: 3196, dtype: float64>, dtype=object)` instead.
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
작업형2 모의문제2
안녕하세요 혹시 문제에서는 전처리시에 열을 삭제하고, cols = ['name', 'host_name', 'last_review', 'host_id']열을 삭제하고, 값이 비어 있는거 train['reviews_per_month'] = train['reviews_per_month'].fillna(0) test['reviews_per_month'] = test['reviews_per_month'].fillna(0) 이렇게 채우는게 문제에서 지시 사항이 없었는데, 작업을 해도 되는건가요?명확한 지시 사항이 있어야 하는게 아닌가 싶어서 여쭤봅니다.시험 환경에서 저렇게 데이터를 삭제하거나 이상치를 처리 하는거 결측치 처리를 임의로 해도 되는지 궁금합니다.
-
미해결비전공자도 이해할 수 있는 CI/CD 입문·실전
섹션 4, 5와 6, 7은 유사한가요?
현재 스프링부트 프로젝트의 인프라와 CI/CD를 공부하고 있습니다섹션 4, 5와 6, 7이 프레임워크 (스프링부트 / Nest.js)의 차이만 있는것으로 보이는데6, 7 섹션을 우선 넘어가도 괜찮은지 궁금합니다
-
해결됨DOM에서 픽셀까지, 브라우저 렌더링과 CRP 완전 정복 - [DOM 완전 정복 Part 3]
지금 이 화면에서 뭘로 fps를 알 수 있나요?
지금 이 화면에서 뭘로 fps를 알 수 있나요?
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
작업형2-모의문제 1번 검증 데이터 분리
from sklearn.model_selection import train_test_splitX_tr, X_val, y_tr, y_val = train_test_split( train.drop('Attrition_Flag', axis=1), train['Attrition_Flag'], test_size=0.2, random_state=2022 )선생님, 데이터 분리 작성할 떄, train.drop('Attrition_Flag', axis=1) 이 부분이 이해가 가지 않아요.Attrition_Flag 컬럼은 pop함수로 따로 빼놓는거로 알고 있는데, 여기서 왜 drop으로 삭제를 하고, 뒤에 train['Attrition_Flag']를 다시 넣는건지 모르겠어요.. + 데이터 분리 전에, 먼저 target에 Attrition_Flag를 따로 분리시켜놓고 split함수를 작성해도 되나요?
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
17강 포인터 조작과 출제패턴 / 10:00 / 이중포인터 출력 관련 문의
안녕하세요.영상 10:00쯤(정확히는 10:39)에 printf(*(*ptr_b+1)); 부분 설명해 주실 때 *ptr_b+1은 ptr_b주소에서 char크기만큼 증가시키는거라고 설명해 주셨습니다.그런데 이전 영상에서는 출력할때 포인터변수명 앞에 *(별표)를 붙이면 주소가 아닌 값을 가져오는거라고 설명해 주셨는데, 여기서는 왜 값이 아닌 주소를 불러오는건지 문의드립니다.
-
미해결(2025) 일주일만에 합격하는 정보처리기사 실기
17강 포인터 조작과 출제패턴 / 08:40 / 메모리주소 관련 문의
안녕하세요.영상에서 선언해 주신 str[], ptr_a, ptr_b 3개 변수의 메모리주소에 대해 문의드립니다.char str[] = "Hello";char *ptr_a = str; > 포인터변수 ptr_a의 메모리주소는 배열변수 str과 동일하다.char **ptr_b = &ptr_a; > 이중포인터변수 ptr_b의 메모리주소는 포인터변수 ptr_a의 메모리주소와 동일하다.이렇게 되면 str, &ptr_a, &ptr_b가 모두 동일한거 아닌가요?이중포인터에 대해 이해가 부족해서 질문이 생겼을수도 있을거 같긴 한데, 영상 보면서 그때그때 궁금한게 생기면 일시정지하고 질문을 남기고 있어서 혹시 뒤에 설명해 주시는 내용이더라도 양해 부탁드립니다.
-
미해결유니티와 C#으로 배우는 카타나제로스타일 게임만들기 (기본편)
이거 후속 강의는 없는 건가요? ㅠㅠ
이거 후속 강의는 없나요...? 플레이어랑 적 충돌까지는 배운게 있어서 공격하면 사라지게 할 수 있는데 보스 몬스터 구현하기가 어렵네요 ㅠ
-
미해결유니티와 C#으로 배우는 카타나제로스타일 게임만들기 (기본편)
이거 후속 강의는 없는 건가요? ㅠㅠ
이거 후속 강의는 없나요...? 플레이어랑 적 충돌까지는 배운게 있어서 공격하면 사라지게 할 수 있는데 보스 몬스터 구현하기가 어렵네요 ㅠ
-
미해결Next.js 15: Full-Stack Development
강의를 들을 때 타입스크립트 지식이 필요한가요?
안녕하세요 js, React만 배우고 바로 Next.js로 넘어왔는데 혹시 TypeScript도 필요한가요?
-
미해결웹에서 미디어를 다루는 방법 MediaStream API
오디오 Input -> Speaker 출력 Noise
안녕하세요.이번에 프로젝트를 진행 하고 있는데 해결되지 않는 부분이 있어서 질문을 드립니다.상황을 간단히 말씀드리면, 미팅룸 개설을 하고 참여한 인원중에 말을 하면 해당 음성을 다른 참여자의 스피커로 출력하는 방식입니다. (발화자 제외) 이때 Input Audio format은 16Khz, MONO, 32Float, 16,000 sample 로 지정되어 있습니다.(음성 출력 뿐만 아니라, STT 서버에 보내서 텍스트를 반환하는데 이때 STT 서버의 오디오 요청스펙 입니다.) 그리고 Gemini의 도움을 받아 아래와 같이 옵션을 설정하였지만, 실제로 스피커 출력시 매우심한 Noise가 발생합니다. (STT 서버의 응답 텍스트는 정상 동작) 저는 백엔드 개발자인데, 프론트단에서 해결 방법을 잘 모르겠어서, 강의를 결제하게 되었습니다. 혹시 조언을 해주실수 있을까요?아니면 강의에 몇강을 보면 관련 주제가 나오는지 알려주도 좋을거같습니다. 긴글 읽어주셔서 감사합니다. Input audio data 관련 코드audio: { echoCancellation: true, noiseSuppression: false, autoGainControl: false, } this.highPassFilter = this.audioContext.createBiquadFilter(); this.highPassFilter.type = 'highpass'; // [튜닝] 목소리 뭉개짐을 피하기 위해 60Hz로 설정 this.highPassFilter.frequency.value = 60; // 2. Compressor (안전장치/Limiter 역할 튜닝) this.compressor = this.audioContext.createDynamicsCompressor(); // [튜닝] -6dB를 넘어가는 "정말 큰 기계음"만 잡는 '안전장치'로 사용 this.compressor.threshold.value = -6; this.compressor.knee.value = 30; // [튜닝] 2:1로 최소한만 압축 this.compressor.ratio.value = 2; // [튜닝] 순간적인 피크를 빠르게(3ms) 잡음 this.compressor.attack.value = 0.003; this.compressor.release.value = 0.25; // 3. GainNode (전체 볼륨 증폭) this.gainNode = this.audioContext.createGain(); // [튜닝] 압축을 거의 안 하므로 1.1배로 소폭만 증폭 this.gainNode.gain.value = 1.1; // --- 7. 노드 체인 연결 --- this.audioSource.connect(this.highPassFilter); // 1. (마이크) -> 저주파 험 제거 this.highPassFilter.connect(this.compressor); // 2. -> "정말 큰 소리"만 방지 this.compressor.connect(this.gainNode); // 3. -> 전체 볼륨 소폭 증폭 this.gainNode.connect(this.resamplerNode); // 4. -> VAD 및 리샘플링 this.resamplerNode.connect(this.audioContext.destination); // (워크렛 실행용)스피커 출력 관련 코드// --- [수정] 오디오 출력(Playback) 로직 (심리스 스케줄링) --- private handleIncomingAudio(audioData: ArrayBuffer): void { if (audioData.byteLength === 0 || !this.playbackAudioContext) return; if (this.playbackAudioContext.state === 'suspended') { this.playbackAudioContext.resume().catch((err) => { console.error('Playback AudioContext 재개 실패:', err); }); } this.audioQueue.push(audioData); // [수정] 재생 루프가 멈춰있을 때(!this.isPlaying)만 새로 시작 if (!this.isPlaying) { this.isPlaying = true; // 현재 시간을 기준으로 스케줄링을 다시 시작합니다. this.nextChunkTime = this.playbackAudioContext.currentTime; this.playNextChunk(); } } private playNextChunk(): void { if (this.audioQueue.length === 0) { this.isPlaying = false; // 큐가 비면 재생 중지 return; } if (!this.playbackAudioContext || this.playbackAudioContext.state === 'closed') { this.isPlaying = false; this.audioQueue = []; return; } const audioData = this.audioQueue.shift()!; try { const float32Data = new Float32Array(audioData); const audioBuffer = this.playbackAudioContext.createBuffer( PLAYBACK_CHANNELS, float32Data.length, this.playbackAudioContext.sampleRate ); audioBuffer.copyToChannel(float32Data, 0); const source = this.playbackAudioContext.createBufferSource(); source.buffer = audioBuffer; source.connect(this.playbackAudioContext.destination); // --- [수정] 심리스 스케줄링 로직 --- // 1. 랙(Lag)으로 인해 예약 시간이 이미 지났는지 확인 const currentTime = this.playbackAudioContext.currentTime; if (this.nextChunkTime < currentTime) { // 지연이 발생했으면, 갭(Gap)이 생기지 않도록 현재 시간으로 리셋 this.nextChunkTime = currentTime; } // 2. 계산된 nextChunkTime에 재생을 '예약'합니다. (갭 제거) source.start(this.nextChunkTime); // 3. 다음 청크가 시작될 시간을 미리 계산합니다. this.nextChunkTime += audioBuffer.duration; // 4. [수정] onended에서 다음 청크를 비동기적으로 호출합니다. (버그 수정) source.onended = () => { // 큐에 다음 데이터가 있으면, 딜레이 없이 바로 다음 청크를 스케줄링합니다. if (this.audioQueue.length > 0) { this.playNextChunk(); } else { this.isPlaying = false; // 큐가 비었으면 재생 종료 } }; // 5. [삭제] 즉각적인 재귀 호출을 삭제합니다. (이것이 버그였습니다) // if (this.audioQueue.length > 0) { // this.playNextChunk(); // } } catch (e) { console.error('오디오 청크 재생 중 오류:', e); this.isPlaying = false; // 오류 발생 시 재생 루프 중지 } }
-
미해결김영한의 실전 데이터베이스 - 기본편
join 문제 풀이2 문제1(self join) 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용] join 문제와 풀이2에서 문제 1번에 대한 질문입니다.풀이는 아래 쿼리 중 1번의 형태로 해주셨는데 저는 풀이 보기 전 혼자 풀었을 때 2번의 형태로 작성을 했는데...일단 동작은 둘 다 같은데 유지보수적인 면이라던지 의미적인 면이라던지 더 좋은 형태가 있는 지, 둘의 차이가 있는 지 궁금하여 질문 드립니다. 1번 쿼리SELECT m.employee_id, mname, m.manager_id, enameFROM employees eJOIN employees m ON e.employee_id = m.manager_idWHERE m.manager_id = 42번 쿼리SELECT e.employee_id, ename, e.manager_id, mnameFROM employees eJOIN employees m ON e.manager_id = m.employee_idWHERE e.manager_id = 4
-
해결됨FastAPI 완벽 가이드
어디가 필요없는 코드인지 알아내려면....
제가 아래의 사이트를 자체 서버를 만들어 구동을 해보았습니다. 물론 테스트 및 학습용으로....http://112.166.186.238/사용한 것들App서버: FastAPI로 백엔드 api와 간단한 프론트 엔드DB 서버: MySQLRedis 서버Nginx 서버Portainer.io를 이용해, Dockerfile로 이미지 생성하고 4개의 컨테이너를 만들어, 구동시켰습니다. 서버는 제가 쓰던 오래된 개인 PC(아마도 족히 15년가까이된 구닥다리 컴퓨터)에 우분투 22.04.5 LTS를 설치해서 서버 구동을 시켰습니다.제가 전공자는 아니고, 완전히 다른 직업군에 있는 사람이라... 몇년전에 장고, 플라스크로 웹어플리케이션 공부를 한적이 있는데 그때 웹프레임워크만 제외하고 똑같은 방식으로 서버구동을 시켜본 적이 있는데... 이번에 FastAPI로 한번 더 공부하면서 구축해보았습니다.아직, docker-compose.yml로 docker swarm 구축을 해보지는 못했구요... 그런데 여기까지 오면서 궁금해진것이 바로 직전에 질문하신 분처럼 nginx서버 설정을 하다보면, FastAPI코드에서 굳이 없어도 될 부분의 설정부분이 있을 것 같은데.... 그게 어떤것인지 궁금해지더라구요... 예를 들면,정적파일 처리를 nginx에서 처리하는 경우 app.mount()가 필요없을 것 같은데... 답변이 그렇게 되어 있어, 예상했던 데로 였습니다. app.mount()가 설정이 있어도 무방한 것인지 궁금합니다. 또한 저는 정적파일 css. js 파일들은 nginx에서 처리하지 않도록 했는데... 바뀔수가 있을 것 같아서... 여기서 궁금한것: 이렇게 해도 무방한 것인지 궁금합니다. (참고로,저는 static/media폴더 안에 user_images, user_videos폴더를 만들어 user가 업로드하는 파일들을 그 폴더안에 저장하게 로직을 작성했습니다. nginx에서 이 디렉토리를 찾아갈 수 있게 해 놓았고, volume mount를 해서 컨테이너가 삭제되더라도 사용자가 올린 실제 이미지들이 삭제되지 않게 했놨습니다. )MySQL서버와 Redis 서버를 찾아가는 FastAPI코드가 있고, yml파일로 컨테이너를 만드는 코드를 작성할 때, network로 서로를 연결하게 될텐데.... 이때 MySQL서버와 Redis 서버를 찾아가는 FastAPI코드가 없어야만 되는지, 아니면, 있더라도 상관이 없는 것인지... 그것도 궁금합니다.이 두가지 말고도 yml작성시에 들어가는 내용때문에 FastAPI코드에서 굳이 없어도 부분이 있는지 궁금합니다.감사합니다.
-
미해결
강의 재생이 안됩니다
일부강의만 재생이 되고 대부분 재생이 안됩니다.빠르게 해결해주시면 감사하겠습니다.고객센터 전화번호도 연결이 아예 안되어서 너무 불편합니다.