안녕하세요 강사님, 강의 잘 듣고 있습니다. 개발 병행하면서 강의 수강 중인데, 끝까지 다 듣지 못한 점 미리 양해드립니다. LangGraph 공식 문서를 보면, Graph의 상태 스키마를 정의할 때 Pydantic의 BaseModel 보다 TypedDict 나 dataclass 를 사용하는 걸 더 권장하는 것처럼 보입니다. 강사님께서도 강의에서 주로 TypedDict 를 쓰시는 걸 확인했습니다. 그런데 개발을 하다 보니, TypedDict 는 런타임 유효성 검사나 구조화 파싱 기능이 없어서 LLM 응답이 해당 스키마에 맞게 출력되었는지 보장할 수 없는 점 이 불편하게 느껴졌습니다. 예를 들어, PydanticOutputParser(pydantic_object=MyModel) 처럼 출력 형식을 강제할 수 있는 기능은 TypedDict 에는 없어서, 결국 출력 파싱이 명확하지 않거나 "```json ... ```" 처럼 마크다운이 붙는 문제도 자주 발생합니다. 물론 TypedDict 는 속도 면에서 이점이 있고 LangGraph state로는 잘 어울린다는 것도 알고 있지만, 이런 이유 때문에 결국 스키마를 TypedDict 와 Pydantic 두 번 정의해야 하는 상황 이 종종 생깁니다. 그래서 질문드리고 싶은 건 다음과 같습니다: 하나의 스키마 정의만으로 상태 관리와 LLM 출력 파싱까지 모두 깔끔하게 처리하는 더 좋은 방법은 없을까요? 혹은 실무에서는 이런 문제를 보통 어떻게 해결하고 계신지도 궁금합니다. 감사합니다!
workflow.add_edge(START, "note1") workflow.add_edge(START, "note2") workflow.add_edge(START, "note3") 이렇게 해두면, 어떤 설정을 따로 안해도 note1,2,3이 동시에 실행되나요? note1 먼저 하고 note2 하고 그다음 note3이 되는게 아니죠? 그러면 병렬이 아니니까
안녕하세요. uv sync 로 커서에서 실행을 했는데요. 화면에서와 달리 google폴더도 없고, .env 파일도 없습니다. 2.5 웹 검색을 지원하는 Corrective RAG 에서 코드 실행중인데요. from dotenv import load_dotenv load_dotenv() 여기서부터 false 가 뜨고요 바로 밑 코드부터 에러가 뜹니다. --------------------------------------------------------------------------- OpenAIError Traceback (most recent call last) Cell In[2], line 4 1 from langchain_chroma import Chroma 2 from langchain_openai import OpenAIEmbeddings ----> 4 embedding_function = OpenAIEmbeddings(model='text-embedding-3-large') 6 vector_store = Chroma( 7 embedding_function=embedding_function, 8 collection_name = 'income_tax_collection', 9 persist_directory = './income_tax_collection' 10 ) 11 retriever = vector_ store.as _retriever(search_kwargs={'k': 3}) [... skipping hidden 1 frame] File c:\Users\LGCNS\inflearn-langgraph-agent\.venv\Lib\site-packages\langchain_openai\embeddings\base.py:338, in OpenAIEmbeddings.validate_environment(self) 336 self.http_client = httpx.Client(proxy=self.openai_proxy) 337 sync_specific = {"http_client": self.http_client} --> 338 self.client = openai.OpenAI(**client_params, **sync_specific).embeddings # type: ignore[arg-type] 339 if not self.async_client: 340 if self.openai_proxy and not self.http_async_client: File c:\Users\LGCNS\inflearn-langgraph-agent\.venv\Lib\site-packages\openai\_client.py:110, in OpenAI.__init__(self, api_key, organization, project, base_url, websocket_base_url, timeout, max_retries, default_headers, default_query, http_client, strict response_validation) 108 api_key = os.environ.get("OPENAI_API_KEY") 109 if api_key is None: --> 110 raise OpenAIError( 111 "The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable" 112 ) 113 self.api_key = api_key 115 if organization is None: OpenAIError: The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable 찾아보니 OPENAI_API_KEY가 없어서 뜨는 에러 같은데 어떻게 설정하면 되나요?
강의 46 듣고 질문드립니다. 여러 노드가 병렬로 수행 되면서 동일한 ToolSearchState를 접근해서 데이터를 수정하게 되면 thread-safety 문제가 발생할 텐데 이런 부분에 대한 설명이 명시적이지 않아서 어떻게 처리 되는 건지 궁금합니다. Langchain에서 State 클래스는 이미 thread-safety를 보장하는 것인가요? 아니면 강의 예제에는 없었지만 실 구현시에는 사용자가 직접 thread-safety에 대한 고려를 해서 코딩해야 하는 건가요?
안녕하세요. Self RAG 에이전트 구현하기 강좌에 대한 질문이 있습니다. 중간 중간에 결과 평가하는 것 중 검색된 문서와 질문에 대한 관련성을 평가하는 부분이 있는데요, 검색 자체를 embedding된 vector에서 similarity search를 하여 뽑아 낸 것들이고, 이 방식 자체가 질문과 유사한 문서를 뽑아 내는 기술인데 굳이 LLM으로 하여 다시 평가를 하게 하는 이유는 뭘까요? 벡터 embedding 과 유사도 검색에 대한 기술이 LLM에 맏기는 것 보다 유사도 검색에 있어 더 정확해야 하는 것이 아닌가 하는 생각이 들어서요. LLM이 하는 유사도 평가가 더 정확하다면 굳이 벡터 embedding 같은 기술을 쓸 필요가 있을까 싶어서 질문 드립니다.
모두를 위한 대규모 언어 모델 LLM Part 5 - LangGraph로 나만의 AI 에이전트 만들기
안녕하세요, 강의 감사히 잘 보고 있습니다. Plan-and-Execute 강의 코드 보다가 궁금한 점이 있는데요, 다른 agent 구성에서는 동기 방식으로 def를 정의했었는데, 여기에서는 async와 await, .ainvoke의 비동기 방식으로 agent를 정의하는 것 같아 왜 여기서는 비동기 방식으로 정의하는지 여쭤봅니다. plan -> execute -> replan 자체도 순차적으로 실행되는 것 같은데(RAG와 같이), 비동기 방식이 어떤 이유로 필요한 것인지 질문드립니다. 감사합니다.
모두를 위한 대규모 언어 모델 LLM Part 5 - LangGraph로 나만의 AI 에이전트 만들기
안녕하세요, 강의 잘 듣고 있습니다. 강의자료 관련하여 Structured outputs 관련 자료는 '강의 슬라이드 다운로드'를 통한 다운로드에도 포함되어 있지 않고 강의 화면에서 아래로 스크롤을 내려서도 확인할 수 없는데, 어디서 받을 수 있는지 답변주시면 감사드리겠습니다.
안녕하세요. 강의들 듣다가 질문이 생겨서 문의 드립니다. 첫번째, 툴이 너무 많은경우 어떤 식으로 처리해야 하나요? 즉, 사용할수 있는 툴이 천개 정도 된다면 LLM 호출시 마다 모든 툴에 대한 description 등을 같이 보내서 알맞은 툴을 선택하라고 할 수 없을 것 같은데 좋은 방법이 있을 까요? 두번째, 툴들 중 비슷한 역할을 하거나 중복되는 툴이 있을 때는 어떻게 처리해야 하나요? 사용자 정의 툴들을 등록하다 보면 기존에 있었던 것과 동일하지만 이름만 다르거나 아예 중복되는 툴들이 생길 수 있는데 이럴때 처리 방법이 궁금합니다.
강의에서 구성한 그래프를 보면 retriever로 조회한 document들을 그대로 context로 넣는것으로 보이는데요. 여기에서 document의 page_content만 추출하는 과정은 필요 없나요? lang smith를 보면 아래와 같이 프롬프트가 구성되어있는데 page_content만 넣도록 해야하는것이 아닌가 의문이 들었습니다.
안녕하세요. 강의에선 zeorx로 PDF -> Markdown 변환 후 UnstructuredMarkdownLoader로 split해서 document chunk를 얻는데요 혹시 UnstructuredPDFLoader를 통해서 한번에 load_and_split 하는것과는 어떤 차이가 있을까요? UnstructuredLoader에서 요구하는 것이 패키지 외에도 pdf2image 모듈등이 있는것 같아서 실제로 시도해보지는 못했습니다.
안녕하세요. 강의 잘 수강하고 있습니다. 자체적으로 텍스트, 표, 시계열꺽은선그래프로 주로 구성된 pdf를 임베딩해서 RAG 기반의 LLM 서비스를 만들어 보고 싶은데요 표의 경우는 md 파일을 txt로 변환해서 저장하는 방법을 잘 알려주셨습니다만, 혹시 꺾은선그래프를 이미지처럼 저장해서 서비스에 활용할 수 있는 방법이 있을까요? 참고할만한 기술이나 좋은 아이디어 있으면 공유 혹은 조언해주시면 감사하겠습니다.
커널 재실행 직후 run all 하면 토큰 수 제한 에러가 뜹니다. 다시 run all하면 잘 실행되구요. websearch 후 generate의 query 찍어보면 토큰 수 제한 걸릴일이 없는 문장인데 왜이럴까요? websearch 후 generate의 query 값이 "쿼리입니다 === " 이 부분입니다.