12:20 에서 grade, num_generation 필드값으로 상태값이 덮어 써진다고 하셨는데요. 그러면 기존 상태에 있던 "messages"와 "documents"가 사라지는 건가요? 4:07에서 rag_chain.invoke함수에 string 타입의 query가 들어가면 "context"와 "question"에 모두 입력으로 들어가게 되는건가요?
안녕하세요, 강사님 워크플로우가 아닌 에이전틱 루프에서 병렬 노드 구현이 가능한지 문의드립니다. 구체적으로 다음과 같은 두 가지 시나리오에 대한 가능 여부가 궁금합니다 쿼리에 따라 1, 2번 작업을 순차적으로 진행한 후, 그 결과를 aggregate하여 3번으로 전달하는 방식 1, 2, 3번 작업을 동시에 병렬로 수행한 후 한 번에 취합하는 방식 어떤 방식이 가능한지 조언 부탁드립니다. 감사합니다
"LLM 모델의 Tool Calling 성능 비교(OpenAI, Gemini, Llama 70B)" 파트 강의 중 1:48초 부터 llama3-groq-70b-8192-tool-use-preview 모델을 불러와 Tool Call의 성능 비교를 진행합니다. 2025-04-03 기준 해당 모델명이 변경되어 더 이상 로드가 불가능 합니다. 따라서 "llam3-70b-8192" 모델명을 변경하여 사용하는 것이 좋을 것 같습니다. 수정 전 코드 llm_groq = ChatGroq(model="llama3-groq-70b-8192-tool-use-preview", temperature=0) 수정 후 코드 llm_groq = ChatGroq(model="llama3-70b-8192", temperature=0) 감사합니다.
안녕하세요 선생님 위 이미지처럼 추후 서브그래프로 들어갈 CSV 관련 코드 작성 및 실행 워크플로우를 구성했는데, 테스트를 통해서 동작은 확인했습니다 그런데 마지막 execute_node가 python_repl로 실행만 하는 노드라서 실패했을 때 워크플로우가 중간에 다시 돌아갈 때 원인이 전달되지 않아서 수정이 잘 될지가 걱정됩니다. 에러까지 넘겨야 할지, 아니면 code_gen node에서 agentexecutor api로 tool_call로 python_repl을 연결한 다음 validation 노드를 타는 게 더 나을지 고민 중인데, 이렇게 하면 코드 실행 실패할 때마다 그래프 시각화가 여러 번 나올 것 같아서 어떤 접근법이 좋을지 조언 부탁드립니다 감사합니다
안녕하세요 강사님, 서브 그래프 관련 질문입니다! subgraph에서 routing 코드를 보고 있는데, add_conditional_edges 문법이 좀 헷갈려서 질문드립니다. search_builder.add_conditional_edges( "analyze_question", route_datasources_tool_search, ["search_menu", "search_web", "search_wine"] ) 위 코드에서 세 번째 매개변수인 ["search_menu", "search_web", "search_wine"] 가 어떻게 작동하는지 궁금합니다. 제가 이해한 바로는 route_datasources_tool_search 함수에서 return되는 값의 key 값에 따라 다음 노드로 라우팅되는 것 같은데요. 그냥 저렇게 함수들을 나열하면 알아서 key 값과 네임이 일치하는 함수로 넘어가는 건가요? 혹시 시간 되실 때 설명 부탁드립니다! 감사합니다.
섹션 6. 서브그래프입니다! 안녕하세요, tool_search_graph 관련 서브그래프 구현에 대해 두 가지 질문이 있습니다 조건부 분기 처리 시, question에 따라 분기된 후에 해당 툴에 맞게 질문을 추가로 필터링하는 과정이 필요한지 궁금합니다. 현재는 간단해서 그냥 하신건지요? question을 찍어보니, 그대로 넘어와서요 해당 서브그래프를 supervisor 하단에 배치했을 때, 코드상으로 어떻게 연결할 수 있는지 구체적인 방법이 궁금합니다. 답변 부탁드립니다
선생님 안녕하세요, LLM 모델의 Tool calling 성능비교를 해봤는데요. # 도구 호출이 필요한 LLM 호출을 수행 query = "스테이크와 어울리는 와인을 추천해주세요." ai_msg = llm_with_tools.invoke(query) 아래 2개 LLM 모델로 성능비교를 해봤습니다. 그런데 (2) 모델의 경우 Content 와 tool_calls 모두 나오는데요. 그러면 (1), (2) 모델 중에 무엇이 더 좋은 성능인가요? 그리고 Content 와 tool_calls 동시에 나오는 경우는 왜 그런건가요? (1) gpt-4o-2024-05-13 ---------------------------------------------------------------------------------------------------- '' ---------------------------------------------------------------------------------------------------- [{'args': {'query': 'best wine to pair with steak'}, 'id': 'call_p7PJFCZUWXEwyCmK4nzLjx9g', 'name': 'search_web', 'type': 'tool_call'}] ---------------------------------------------------------------------------------------------------- (2) claude-3-7-sonnet-20250219 ---------------------------------------------------------------------------------------------------- [{'text': '스테이크와 어울리는 와인에 대한 정보를 찾아보겠습니다.', 'type': 'text'}, {'id': 'toolu_01Uc2BwXXyW26n7L78zZ6wGf', 'input': {'query': '스테이크와 어울리는 와인 추천'}, 'name': 'search_web', 'type': 'tool_use'}] ---------------------------------------------------------------------------------------------------- [{'args': {'query': '스테이크와 어울리는 와인 추천'}, 'id': 'toolu_01Uc2BwXXyW26n7L78zZ6wGf', 'name': 'search_web', 'type': 'tool_call'}] ----------------------------------------------------------------------------------------------------
안녕하세요 강사님 Windows 환경에서 진행하려고 하는데요, 깃헙 레포 파일명에 3.6. 파일에는 : 이 들어가고 3.7. 파일에는 " 이 들어가서 clone을 해도, zip 다운로드 후 압축해제를 해도 문제가 발생하는 것 같습니다. 3.6, 3.7 파일명을 수정해주실 수 있으실까요?
안녕하세요 강사님 좋은 강의 덕분에 많이 배우고 있습니다 gpt4-mini 모델을 사용 중인데, 날짜 관련 문제가 있습니다 ex) 최근 한 달간 데이터 가져와줘 강의에서는 gpt 학습된 날짜 기준으로 최근이기 떄문에 오류가 난다고 하셔서 datetime을 프롬프트에 넣으시더라구요 근데 만약에 이런 날짜 관련된 질문을 처리해야 할 노드나 툴 들이 많다면 매번 프롬프트에 넣어줘야하는걸까요? 아니면 시간 도구를 별도로 만들어서 사용하게 해야하는지.. 팁이나 경험 알려주시면 감사하겠습니답
안녕하세요 강의 잘 듣고있습니다. llm을 이용해 카테고리화된 응답 을 받아야할때 강의에서 사용한 아래와같은 프롬프트를 사용하는데 doc_relevance_prompt = hub.pull( "langchain-ai/rag-document-relevance" ) 모델에 따라 제가 원하는 단어가 아닌 문장단위가 나와서 판단 로직이 잘 수행되지않더라고요 이런 경우 프롬프트 말고 다른 해결 책이 있을까요? 특정 문자열이 아니면 irrelevant 이런 식으로 처리하려고해도 대부분의 질문이 관련 없다 라고만 판단을 해서 제대로된 기능 사용이 힘드네요
아래 처럼 hub.pull을 사용하면 에러가 발생해서, https://smith.langchain.com/hub/rlm/rag-prompt 해당 링크의 문구를 그대로 사용하고 있는 것 외에는 전부 동일한 코드인데, tax_base_retrieval_chain을 구축할 때 에러가 발생합니다 hub.pull('rlm/rag-prompt')
안녕하세요. 저는 이번에 pdf를 입력하고 그것을 기반으로하는 멀티모달 graph를 streamlit을 통해 구현했습니다. 근데 제가 이번에 Langchain 관련 코드를 몰라서 완성 된 것과는 별개로 너무 투박하게 코드가 작성된 것 같아서 질문드립니다. 질문 요약 : hub.pull("rlm/rag-prompt")한 프롬포트 str로 뽑기 or 이미지 추가해서 메세지만드는 방법 GPT 모델은 message_content = [] message_content.append({"type": "text", "text": prompt}) message_content.append( {"type": "image_url", "image_url": {"url": f"data:{image_type};base64,{image_data}"}} ) message = HumanMessage(content=message_content) # 응답받기 client = ChatOpenAI(model='gpt-4o') response = client.invoke([message]) response.content ## str임! 해당 모양대로 메세지를 만들고 invoke하면 이미지포함 메세지가 되는 것을 알았습니다. 이를 통해 이미지에 보이는것은 ~~문서에있니? 이런식으로 구현하고자 했습니다. generate 함수(노드) 에서 이미지와 텍스트를 같이 메세지로 전달하고 싶은데 조금 어려움을 겪었습니다. generate 함수 코드입니다. 해당 함수는 sate['context']의 내용을 프롬포트에 넣고 이를 이미지와 함께 보내고자합니다. # 허브에서 RAG 프롬프트를 가져옵니다 generate_prompt = hub.pull("rlm/rag-prompt") # 지정된 매개변수로 언어 모델을 초기화합니다 generate_llm2 = ChatOpenAI(model='gpt-4o') def generate(state: AgentState) -> AgentState: """ 주어진 state를 기반으로 RAG 체인을 사용하여 응답을 생성합니다. Args: state (AgentState): 사용자의 질문과 문맥을 포함한 에이전트의 현재 state. Returns: AgentState: 생성된 응답을 포함하는 state를 반환합니다. """ context = state['context'] query = state['query_message'] make_massage = [] massage = generate_prompt.invoke({'question': query, 'context': context}) messages = massage.to_messages() # print(massage) # print("--------------------------------") # print(messages) # print("--------------------------------") # print(messages[0]) # print("--------------------------------") # print(messages[0].content) # print("--------------------------------") make_massage.append({"type": "text", "text": messages[0].content}) if state['query_img'] != "": make_massage.append({"type": "image_url", 'image_url': {"url": state['query_img']}}) final_massage = HumanMessage(content=make_massage) response = generate_llm2.invoke([final_massage]) answer = { "type" : "RAGtext", "message" : response.content} print(f"call : generate") return {'answer': answer} 처음에는 prompt에서 str을 추출하려고 했는데 조금 어려웠습니다; from langchain_openai import ChatOpenAI from langchain import hub # 허브에서 RAG 프롬프트를 가져옵니다 generate_prompt = hub.pull("rlm/rag-prompt") print(generate_prompt.messages[0]) print(generate_prompt.messages[0].content) # 'HumanMessagePromptTemplate' object has no attribute 'content' 오류 print(generate_prompt.messages[0].invoke({"context" : "test", "question" : "test22" })) # 오류;; 그렇기에 일단 invoke 를하고 완성된 text를 찾아 넣어주었습니다. make_massage.append({"type": "text", "text": messages[0].content}) 이런식으로 텍스트를 추출해서 다시 메세지를 구성하는게아니라. 이미지 url을 알고있으니 추가로 더 넣어주는 뭔가 그런 세련된 방법이 없었을까요? 분명 HumanMessagePromptTemplate 클래스나 그런것들다루는거라 기초 문법인거 같은데 조금 많이 헤매서 더 좋은 코드가 있을까 싶어 이렇게 질문을 드립니다.
해당 위 사진은 GitHub에 올려주신 3.5 강 노트북이미지입니다. 강의에서 요약 프롬포트를 summary로 하고 요약 메세지는 response의 content로 저장하는데 혹시 오타인건가요? 아니면 MessagesState 클래스는 자동으로 메세지를 저장해준다고 이야기해주신 그거랑 연관이있는걸까요?
안녕하세요! section3을 듣고나서 제 나름대로 langgraph를 만들고 이걸.. streamlit으로 구현을 해봤는데요. 이번 강의에서와 같이 chat-history를 checkpointer를 사용해서 연결하려고하면 Checkpointer requires one or more of the following 'configurable' keys: ['thread_id', 'checkpoint_ns', 'checkpoint_id'] 이런 오류 가 뜨고 있는 상태입니다. chat-gpt와 구글 서치를 통해 나름대로 아래와 같이 해보았지만(간략하게 서술하면 CustomMememorySaver라는 클라스를 통해 ['thread_id', 'checkpoint_ns', 'checkpoint_id'] 를 checkpointer에 넣는 것입니다.) 이 역시 제대로 동작하지 않습니다. system_message_template = SystemMessagePromptTemplate.from_template("You are a helpful assistant.") chat_prompt = ChatPromptTemplate.from_messages([system_message_template]) # 세션 키 생성 (세션 관리) def generate_session_key(): if 'session_key' not in st.session_state: st.session_state['session_key'] = str(uuid.uuid4()) return st.session_state['session_key'] # Checkpointer 설정 (세션 상태 관리) class CustomMemorySaver(MemorySaver): def __init__(self, session_key): super().__init__() self.session_key = session_key def get_checkpoints(self): # 필요한 체크포인트 정보 반환 return { "thread_id": self.session_key, # session_key를 thread_id로 사용 "checkpoint_ns": "default", # 기본 네임스페이스 "checkpoint_id": f"checkpoint_{self.session_key}" # 고유한 checkpoint_id } # 시스템 메시지와 메모리 체크포인터 설정 session_key = generate_session_key() checkpointer = CustomMemorySaver(session_key=session_key) # LangGraph만을 사용한 에이전트 생성 (tools는 빈 리스트로 설정) agent_executor = create_react_agent(llm, [], state_modifier=chat_prompt, checkpointer=checkpointer) 또, 예전 langchain 강의에서 알려주셨던 chat-with-history 코드를 활용하려는 시도도 해봤는데요. (가독성을 위해 프롬프트 내용이나 중간 중간 선언 내용은 지웠습니다.) 하지만 이거 같은 경우에는 langgraph를 사용하는 입장에서, rag-chain을 ai_response에 넣는 과정을 어떻게 처리해야될지 모르겠어서 중도포기한 상태입니다. ㅠㅠ;; store = {} def get_session_history(session_id: str) -> BaseChatMessageHistory: if session_id not in store: store[session_id] = ChatMessageHistory() return store[session_id] def get_rag_chain(): llm = get_llm() retriever = get_retriever() contextualize_q_system_prompt = ("생략") contextualize_q_prompt = "생략" history_aware_retriever = create_history_aware_retriever( llm, retriever, contextualize_q_prompt ) system_prompt = ("생략") qa_prompt = ChatPromptTemplate.from_messages("생략") question_answer_chain = create_stuff_documents_chain(llm, qa_prompt) rag_chain = create_retrieval_chain(history_aware_retriever, question_answer_chain) conversational_rag_chain = RunnableWithMessageHistory( "생략" history_messages_key="chat_history", output_messages_key="answer", ).pick('answer') return conversational_rag_chain def get_ai_response(user_message): rag_chain = get_rag_chain() loan_chain ={"input": dictionary_chain} | rag_chain ai_message = loan_chain.stream( { "question": user_message }, config={ "configurable": {"session_id": "abc123"} }, ) return ai_message 결론적으로 말하면 langgraph로 어떻게해야 langchain에서 했던것처럼 streamlit상에서 구현할 수 있을지 궁금합니다! 질문 읽어주셔서 감사합니다!