모두를 위한 대규모 언어 모델 LLM Part 5 - LangGraph로 나만의 AI 에이전트 만들기
안녕하세요 강사님, 강의 잘 듣고있습니다. 현재 Adaptive RAG 강의를 듣고있는데, 강의에서는 공식 문서에서 Adaptive RAG와 관련된 내용이 있어 그걸 예시로 들어주셨는데 확인해보니 해당 내용이 지금은 공식 문서에 없는 것 같습니다. Adaptive RAG 뿐만 아니라 강사님이 강의했던 내용중 지금은 공식 문서에 없는 내용들이 꽤 많은 것 같은데(Plan-and-Execute는 TodoListMiddleware로 연결되고 ReWOO, Reflection, Reflextion, STORM 등과 같은 내용은 공식 문서에 아예 없습니다..), 이런 내용들은 현재 시점에서는 잘 사용되지 않는 기술들이여서 그런걸까요? 그리고 예제에서 시스템 프롬프트를 항상 영어로 작성하시고 아래 한글로 번역된 내용을 주석으로 써주셨는데, 애초에 프롬프트를 한글로 작성하면 답변 품질에 차이가 많이날까요?
--------------------------------------------------------------------------- ConfigError Traceback (most recent call last) Cell In[13], line 1 ----> 1 from langchain_chroma import Chroma 3 database = Chroma.from_documents(documents=document_list, embedding=embedding) File ~/workspace/ai/rag-practice/lib/python3.14/site-packages/langchain_chroma/__init__.py:3 1 """LangChain integration for Chroma vector database.""" ----> 3 from langchain_chroma.vectorstores import Chroma 5 __all__ = [ 6 "Chroma", 7 ] File ~/workspace/ai/rag-practice/lib/python3.14/site-packages/langchain_chroma/vectorstores.py:18 12 from pathlib import Path 13 from typing import ( 14 TYPE_CHECKING, 15 Any, 16 ) ---> 18 import chromadb 19 import chromadb.config 20 import numpy as np File ~/workspace/ai/rag-practice/lib/python3.14/site-packages/chromadb/__init__.py:3 1 from typing import Dict, Optional, Union 2 import logging ----> 3 from chromadb.api.client import Client as ClientCreator 4 from chromadb.api.client import ( 5 AdminClient as AdminClientCreator, 6 ) 7 from chromadb.api.async_client import AsyncClient as AsyncClientCreator File ~/workspace/ai/rag-practice/lib/python3.14/site-packages/chromadb/api/__init__.py:51 46 from overrides import override 47 from chromadb.api.collection_configuration import ( 48 CreateCollectionConfiguration, 49 UpdateCollectionConfiguration, 50 ) ---> 51 from chromadb.config import DEFAULT_DATABASE, DEFAULT_TENANT 52 from chromadb.api.types import ( 53 CollectionMetadata, 54 Documents, (...) 73 DefaultEmbeddingFunction, 74 ) 76 from chromadb.auth import UserIdentity File ~/workspace/ai/rag-practice/lib/python3.14/site-packages/chromadb/config.py:120 116 NODE = "node" 117 ID = "id" --> 120 class Settings(BaseSettings): # type: ignore 121 # ============== 122 # Generic config 123 # ============== 125 environment: str = "" 127 # Can be "chromadb.api.segment.SegmentAPI" or "chromadb.api.fastapi.FastAPI" or "chromadb.api.rust.RustBindingsAPI" File ~/workspace/ai/rag-practice/lib/python3.14/site-packages/pydantic/v1/main.py:221, in ModelMetaclass.__new__(mcs, name, bases, namespace, **kwargs) 219 elif is_valid_field(var_name) and var_name not in annotations and can_be_changed: 220 validate_field_name(bases, var_name) --> 221 inferred = ModelField.infer( 222 name=var_name, 223 value=value, 224 annotation=annotations.get(var_name, Undefined), 225 class_validators=vg.get_validators(var_name), 226 config=config, 227 ) 228 if var_name in fields: 229 if lenient_issubclass(inferred.type_, fields[var_name].type_): File ~/workspace/ai/rag-practice/lib/python3.14/site-packages/pydantic/v1/fields.py:504, in ModelField.infer(cls, name, value, annotation, class_validators, config) 501 required = False 502 annotation = get_annotation_from_field_info(annotation, field_info, name, config.validate_assignment) --> 504 return cls( 505 name=name, 506 type_=annotation, 507 alias=field_info.alias, 508 class_validators=class_validators, 509 default=value, 510 default_factory=field_info.default_factory, 511 required=required, 512 model_config=config, 513 field_info=field_info, 514 ) File ~/workspace/ai/rag-practice/lib/python3.14/site-packages/pydantic/v1/fields.py:434, in ModelField.__init__(self, name, type_, class_validators, model_config, default, default_factory, required, final, alias, field_info) 432 self.shape: int = SHAPE_SINGLETON 433 self.model_config.prepare_field(self) --> 434 self.prepare() File ~/workspace/ai/rag-practice/lib/python3.14/site-packages/pydantic/v1/fields.py:544, in ModelField.prepare(self) 537 def prepare(self) -> None: 538 """ 539 Prepare the field but inspecting self.default, self.type_ etc. 540 541 Note: this method is **not** idempotent (because _type_analysis is not idempotent), 542 e.g. calling it it multiple times may modify the field and configure it incorrectly. 543 """ --> 544 self._set_default_and_type() 545 if self.type_.__class__ is ForwardRef or self.type_.__class__ is DeferredType: 546 # self.type_ is currently a ForwardRef and there's nothing we can do now, 547 # user will need to call model.update_forward_refs() 548 return File ~/workspace/ai/rag-practice/lib/python3.14/site-packages/pydantic/v1/fields.py:576, in ModelField._set_default_and_type(self) 573 self.annotation = self.type_ 575 if self.type_ is Undefined: --> 576 raise errors_.ConfigError(f'unable to infer type for attribute "{self.name}"') 578 if self.required is False and default_value is None: 579 self.allow_none = True ConfigError: unable to infer type for attribute "chroma_server_nofile" 저는 Python 3.14 버전으로 venv 를 사용중이었는데요. 위와 같은 에러가 발생하였습니다. 구글에 ConfigError 문구를 검색해도 잘 나오지 않아서 ChatGPT의 도움을 좀 받았는데 이렇게 답하더라구요. - Python 3.14 환경에서 chromadb 가 (pydantic v2에서 BaseSettings가 빠진 걸 처리하려다) pydantic.v1 호환 레이어로 떨어지고 - 그런데 Pydantic v1 코어는 Python 3.14+에서 제대로 동작하지 않아서, Settings 모델 필드( chroma_server_nofile ) 타입 추론이 깨지면서 ConfigError 가 납니다. 파이썬 버전을 3.12로 낮추어서 venv 를 다시 설정했더니 같은 코드임에도 정상적으로 실행되었습니다. 혹시나 저와 같은 이슈를 겪으신 분들은 python 버전을 낮추어보시길 바라요.
모두를 위한 대규모 언어 모델 LLM Part 5 - LangGraph로 나만의 AI 에이전트 만들기
안녕하세요 강사님, 강의 잘 듣고있습니다. https://docs.langchain.com/oss/python/integrations/tools 를 확인해보면 LangChain에서 제공해주는 미리 구현된 툴 구현체를 확인할 수 있는데, 이것들과 langchain-mcp-adapters를 사용하여 외부 서비스의 MCP를 LLM과 직접 연동하는 것이 어떤 차이가 있는지 궁금합니다. 강의를 촬영할 당시에는 MCP가 나오기 전이라 강의 내용처럼 tool로만 연동이 가능했었던 것일까요?
안녕하세요! 강의 수강과 책을 병행해서 보고 싶은데요, 강의가 예전에 촬영된것 같아서, 책을 참고해서 보는게 훨씬 수월하고 학습하는데 좋을것 같아서요. 각 강의 회차별로 "혼자서도 척척 해내는 AI 에이전트 만들기" 책에서 어떤 챕터랑 같이 보면 도움이 될지 알 수 있을까요??
안녕하세요, 개인 프로젝트로 rag 기반 챗봇을 구현하고 있습니다. ollama, gemma3:1b를 사용중입니다. txt 파일을 어느정도 전처리를 하고 임베딩을 시키려고 하는데 전처리 중 고민이 있습니다. 구조가 잡혀있는 txt 파일인데, 문서 구조는 대략 아래와 같은 형태입니다. 1.2 화면 설명 1.2.1 개요 - 이 화면은 사용자가 업무를 처리하기 위한 화면입니다. 1.2.2 화면 위치 상단 메뉴 > 업무 관리 > 처리 화면 1.2.3 처리 절차 1) 항목 선택 2) 저장 버튼 클릭 현재 고민되는 부분은 다음과 같습니다. 이런 번호 기반 구조를 그대로 유지한 채로 chunking 하는 것이 좋은지, 아니면 번호는 제거하고 의미 단위로만 분할하는 것이 나은지 - , • , 숫자 목록 같은 불릿/목록 기호를 임베딩 전에 제거하거나 정규화하는 게 좋은지 “개요 / 처리 절차 / 화면 위치” 같은 섹션 제목을 chunk 본문에 포함시키는 것이 검색 품질에 도움이 되는지 감사합니다.
안녕하세요, 좋은 강의 감사합니다 ! 강의 내용과는 별개로, 개인 프로젝트 겸 하나 실험해보고 싶은 주제가 있어 간단히 의견 여쭤보고 싶습니다. 유튜브 라이브 채팅 로그를 분석하기 위해, 각 채팅을 의도 기반으로 7~10개 정도의 라벨로 분류해보려 합니다. (채팅은 약 5만~10만개 정도) 다만 라이브 채팅 특성상 다국어가 섞여 있고, 이모지 사용이 많으며, 문장이 매우 짧은 경우가 대부분이라 과연 잘 될지 고민이 됩니다... 이와 관련해 LLM을 활용해 채팅 데이터를 라벨링하는 방식에 대해 어떻게 생각하시는지 궁금합니다. 실제로 비슷한 케이스를 다뤄보신 경험이 있거나, 주의해야 할 점이 있다면 공유해주시면 감사하겠습니다. 또한 LLM을 활용한 라벨링 관점에서, 7~10개 라벨이 모델이 분류하기 적절한 수준인지 아니면 라벨 수를 줄이는 것이 성능 향상에 도움이 될지도 의견을 듣고 싶습니다. 감사합니다!
안녕하세요, 폐쇄망에 챗봇을 구축하려 합니다. 하지만, GPU가 안 되는 환경입니다. 폐쇄망 환경에서 CPU 위주로 운용한다는 제약까지 고려했을 때, 강의에서 소개된 것처럼 LGAI-EXAONE/EXAONE-3.0-7.8B-Instruct를 생성 모델로 사용하고, intfloat/multilingual-e5-large-instruct를 임베딩 모델로 사용하는 조합이 한국어 중심 RAG 환경에서도 여전히 합리적인 선택이라고 보시는지 궁금합니다.
어제 (2026/01/16) 12강에 나오는 TimeAPI ( https://timeapi.io/ ) 에 접속하려고 했는데, 접속을 시도할 때마다 사이트가 응답하지 않는다는 메시지만 떴고, 다른 비슷한 사이트에서도 같은 결과가 나왔습니다. Powershell을 이용한 자체검사를 시도해 보니 제 쪽에서는 문제가 없고 TimeAPI 쪽에서 응답하지 않는 것이라는 결과가 나왔으며, 오늘 아침에도 접속을 시도해 봤는데 결과가 같았습니다. 그래서 TimeAPI를 사용하지 못하는 지금, TimeAPI 접속 문제를 해결할 수 있는 방법을 알고 싶고, 강의에서 소개된 코드 및 작업과정을 거의 수정하지 않고도 TimeAPI를 깔끔하게 대체할 수 있는 사이트가 필요합니다. 도와주실 수 있나요?
소득세법 제55조(세율) 및 제47조(근로소득공제)에 따르면, 거주자 기준으로 연봉 5천만원(근로소득)의 소득세는 다음과 같이 계산됩니다. 근로소득공제 적용 총급여액 5천만원 기준 공제액: 1,475만원 (5천만원 × 15% + 75만원, 단 최고 한도 2천만원 미만) 과세표준 산정 5천만원 - 1,475만원 = 3,525만원 종합소득세율 적용 3,525만원 구간: 1,400만원 이하 6% + 초과분 15% 산출세액: 84만원(1,400만원 × 6%) + (3,525만원 - 1,400만원) × 15% = 474.75만원 최종 납부세액 474.75만원에서 근로소득세액공제 (산출세액의 55% 한도) 등 추가 공제 적용 가능 ※ 정확한 세액은 의료비·교육비·보험료 등 추가 공제항목에 따라 달라질 수 있습니다. (추가 설명: "거주자"는 직장·자영업 등 소득 유형과 무관하게 국적에 관계없이 국내 주소를 둔 개인을 의미하며, 직장인은 그 하위 범주에 포함됩니다.) 답변이 전혀 다르고 이상하게 근거없는 숫자도 나오는데 왜그런걸까유 fewshot하는것까지 작성했습니다.
new_question 이 ''연봉 5천만원인 거주자의 소득세는 얼마인가요?'' 이라는 질문만 내놓고, 답은 내놓지 않습니다 %pip install python-dotenv langchain langchain-upstage langchain-community langchain-text-splitters langchain-pinecone docx2txt 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) from dotenv import load_dotenv from langchain_upstage import UpstageEmbeddings # 환경변수를 불러옴 load_dotenv() # OpenAI에서 제공하는 Embedding Model을 활용해서 `chunk`를 vector화 embedding = UpstageEmbeddings(model="embedding-query") from langchain_pinecone import PineconeVectorStore # 데이터를 처음 저장할 때 index_name = 'tax-upstage-index' database = PineconeVectorStore.from_documents(document_list, embeddin g, index_name=index_name) query = '연봉 5천만원인 직장인의 소득세는 얼마인가요?' # `k` 값을 조절해서 얼마나 많은 데이터를 불러올지 결정 retrieved_docs = database.similarity_search(query, k=3) retrieved_docs from langchain_upstage import ChatUpstage llm = ChatUpstage() from langchain_core.prompts import PromptTemplate prompt_with_template = '아래 질문에 답변해주세요:\n\n {query}' prompt_template = PromptTemplate(template=prompt_with_template, input_variables={"query"}) from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate dictionary = ["사람을 나타내는 표현 -> 거주자"] prompt = ChatPromptTemplate.from_template(f""" 사용자의 질문을 보고, 우리의 사전을 참고해서 사용자의 질문을 변경해주세요. 만약 변경할 필요가 없다고 판단된다면, 사용자의 질문을 변경하지 않아도 됩니다. 그런 경우에는 질문만 리턴해주세요 사전: {dictionary} 질문: {{question}} """) dictionary_chain = prompt | llm | StrOutputParser() tax_chain = {"query": dictionary_chain} | prompt_template new_question = dictionary_chain.invoke({"question": query}) new_question RetrievalQA 가 사라져서 PromptTemplate 랑 Pinecorn으로 어떻게든 대체하려고 했는데 엉망이 된거 같습니다. ㅠㅠ 어떻게 하면 답까지 내놓게 할 수 있을까요?
Gradio ChatInterface로 PDF 챗봇 애플리케이션 구현 (실습) 강의에서 작성하신 코드를 그대로 똑같이 적용해서 돌렸는데 이런 에러가 뜨네요. TypeError: argument of type 'bool' is not iterable ERROR: Exception in ASGI application demo = gr.ChatInterface(fn=process_pdf_and_answer, additional_inputs=[ PDF(label="Upload PDF file"), gr.Number(label="Chunk Size", value=1000), gr.Number(label="Chunk Overlap", value=200), gr.Dropdown(["cosine", "l2"], label="similarity metric", value="cosine"), gr.Slider(label="Temperature", minimum=0, maximum=2, step=0.1, value=0.0), ], ) gradio launch 시 additional_inputs에 PDF를 제외하면 launch가 되는데, PDF를 포함하니까 위의 에러가 뜨면서 launch 자체가 안 돼요. gradio document를 봐도 이해가 잘 안 돼서요.. 코드를 어떻게 수정하면 될까요?
안녕하세요. 이번에 회사 내부에서 AI Agent를 도입 예정인데요. 회사 DB는 대부분 postgresql로 구성되어 있는데, postgresql에서 pgvector 벡터 데이터베이스를 제공하더라고요? 사용해도 성능이 괜찮을지.. 혹시 경험이 있을지 궁금해서요. 혹시 주위분들에게 들은 거라도 있으신지 ㅠ