묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨챗GPT와 파이썬으로 주식 자동매매 앱 및 웹 투자 리포트 만들기
Anaconda 32비트 다운로드하는건가요?
64로 되어 있어서 키움하고 연결이 안되는거 같아요(kiwoom32) PS C:\Users\main> python -c "import struct; print(struct.calcsize('P') * 8)">> 64(kiwoom32) PS C:\Users\main>
-
미해결LangGraph를 활용한 AI Agent 개발 (feat. MCP)
2-7 병렬 처리를 통한 효율 개선 파트 chain 구축
아래 처럼 hub.pull을 사용하면 에러가 발생해서, https://smith.langchain.com/hub/rlm/rag-prompt 해당 링크의 문구를 그대로 사용하고 있는 것 외에는 전부 동일한 코드인데, tax_base_retrieval_chain을 구축할 때 에러가 발생합니다hub.pull('rlm/rag-prompt')
-
해결됨한시간으로 끝내는 LangChain 기본기
Template 사용에 관해 질문 있습니다.
안녕하세요. 수강 듣던 중 궁금한게 생겨 질문드립니다.강의 중간에 PromptTemplate와 ChatPromptTempate를 모두 사용하셨는데, 특정 목적에만 사용하는 Template이 있는건가요?아니면 두 Template의 성능 차이가 있는걸까요?
-
미해결Prompt Engineering: 완벽 가이드
reddit data 는 어디있을까요?
수업 자료에는 code, review_criteria이 두개만 있어요.이 강의에서 사용하는 레딧 자료가 어디있는지 모르겠네요.
-
해결됨LangGraph를 활용한 AI Agent 개발 (feat. MCP)
Hub에서 다운 받은 프롬프트에 이미지 추가하기
안녕하세요. 저는 이번에 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 클래스나 그런것들다루는거라 기초 문법인거 같은데 조금 많이 헤매서 더 좋은 코드가 있을까 싶어 이렇게 질문을 드립니다.
-
해결됨LangGraph를 활용한 AI Agent 개발 (feat. MCP)
3.5 강 14:20초 관련 질문입니다.
해당 위 사진은 GitHub에 올려주신 3.5 강 노트북이미지입니다. 강의에서 요약 프롬포트를 summary로 하고 요약 메세지는 response의 content로 저장하는데 혹시 오타인건가요?아니면 MessagesState 클래스는 자동으로 메세지를 저장해준다고 이야기해주신 그거랑 연관이있는걸까요?
-
해결됨LangGraph를 활용한 AI Agent 개발 (feat. MCP)
langgraph를 streamlit과 연동(?)하는 과정에서 질문이 있습니다.
안녕하세요! 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상에서 구현할 수 있을지 궁금합니다! 질문 읽어주셔서 감사합니다!
-
해결됨LangGraph를 활용한 AI Agent 개발 (feat. MCP)
2.4강~2.7강 관련 질문이 있습니다.
안녕하세요 매번 빠른 답변 감사합니다. 복습을 하는중에 궁금한게 생겨서 질문을 남깁니다! 2.4강에서 1) 왜 check_helpfulness는 check_hallucination, check_doc_relevance와 다르게 하나의 노드로 선언되나요? 2) check_doc_relevance를 할때는 return하는것을 Literal['relevant', 'irrelevant'] 이렇게 정해주고, 실제로 리턴도 if response['Score'] == 1: return 'relevant' return 'irrelevant'이렇게 했잖아요. check_helpfulness 노드 만들때도 그렇구요. 근데 왜 check_hallucination을 할때는 왜 Literal['hallucinated', 'not hallucinated']:이렇게 적었음에도 왜 하지 않고 return hallucination_chain.invoke({'student_answer': answer, 'documents': context}) 까지만 해도 되는건가요? 3) 2.6~2.7강에서도 궁금한 부분이 있는데요. router prompt를 보면 if you think you need to search the web to answer the question use 'web_search'라고 나오는데, web_seach를 하는 것이 사실 tax_income_vector_store에 없는 정보잖아요. (이게 2.6강 이 뒤로는 2.7강 관련입니다.)단순 tax_income과 관련 없는(=역삼 근처 맛집)것 과는 다른 대통령령으로 정한 공정시장가액 을 구해야 할 때(=질문이 tax_income과 관련 있지만, vector_store에는 정보가 없는 경우) web_search를 하게 만드는 것이 가능한가요? 2.7강에서는 공정시장가액이 없다< 라는 사실을 알아서 코드를 짤 때 공정시장가액만 웹서치 해오는 걸 구현했는데 이런 서치를 해야되는 과정이 비단 공정시장가액 뿐 아니라 다른 것들도 있을것 같거든요?? 이걸 ai가 알아서 판단하게 만드는것도 이론상은 가능할 것 같아서요. 그렇담 어떻게 구현하는지 궁금합니다. 적다보니 ..기네요 읽어주셔서 감사합니다.
-
해결됨챗GPT와 파이썬으로 주식 자동매매 앱 및 웹 투자 리포트 만들기
아.. 혹시 이 강의 내용 맥북에서는 못하나요?
32bit 설정이 되지 않아서 찾아봤는데 MAC에서는 안되다고 하던데 방법이 없는지요?
-
해결됨LangGraph를 활용한 AI Agent 개발 (feat. MCP)
임베딩 데이터에대해 질문이 있습니다.
안녕하세요 강의 너무 잘보고있습니다. 문의 답변 챗봇을 구축하려고 하는데 임베딩 데이터 관련해서 질문이 있습니다.아래 두가지 방법중 고민인데요[Question]: {질문}, [Answer]: {답변}질문과 답변을 같이 임베딩[Question]: {질문} 질문만 임베딩 하고 답변은 meta 데이터에 넣기 보통 어떤 형식으로 임베딩하는게 검색이 잘되고 좋은 응답을 만드는지 궁금합니다.
-
해결됨LangGraph를 활용한 AI Agent 개발 (feat. MCP)
pdf 를 md를 바꾸는 과정 질문있습니다.
안녕하세요~ 2.2강 초반부 전처리 관련해서 질문이 있습니다. 제가 window os라 그런가 어디서 잘못했는지는 모르겠지만.. 주피터에서 nest_asyncio.apply()를 해도 안되더라구요. 그래서 하루종일 쳇지피티 지지고 볶으면서 그냥 주피터 포기하고 .py로 돌리자 했는데 계속 poppler path가 없다는 에러가 뜨더니 실행이 안됐어요. 그래서 poppler 깔고, 해당 파일이 있는 주소를 아래와 같이 위치지정 해주니까 작동은 되더군요. 제가 했던 코드는 아래와 같습니다.poppler_bin_path = r"C:\Users\Desktop\langgraph-agent\poppler-24.08.0\Library\bin" os.environ["PATH"] += os.pathsep + poppler_bin_path load_dotenv() kwargs = {} model = "gpt-4o-mini" custom_system_prompt = None async def main(): file_path = "./documents/income_tax.pdf" select_pages = 53 output_dir = "./documents" result = await zerox(file_path=file_path, model=model, output_dir=output_dir, custom_system_prompt=custom_system_prompt, select_pages=select_pages, **kwargs) return result result = asyncio.run(main()) print(result) 젤 위에 두 줄 말곤 똑같이 했고 .md 파일 생기는것도 확인했어요. select_pages는 표가 있는 하나만 골라서 했습니다. 서론이 길었지만 여기까지가 제 상황이구요! 아래가 찐질문입니다 ㅎ...md 파일을 열어보니 문제가 세가지 정도 보였는데첫번째는 인코딩 문제입니다. 저만 그런건지 utf-8로하면 깨져서 나오고 euc-kr로하면 원하는 한국어 파일이 나오더라구요. 저만 이런건가요 강사님도 변환 과정을 거치신 건가요?두번째는 오타입니다. 님시제< 라는 단어가 반복되길래 뭐지 했는데 나중에 3번 오류를 찾아보면서 같이 찾아보니까 납세지 더라구요. '면세사업등 수입금액)보다 미달하게'를 '면세사업동안이지 더욱 미달하여'라고 표현한것도 보이고요.. 저 위에 있는 코드가 문제인가요 아님 이런 자잘한 오타들은 pdf를 변환하는 과정에서 어쩔 수 없는 것인가요? 강사님이 올려주신 md파일이랑도 번갈아가며 보는데 저기도 짜잘하게 보이긴 하거든요.. 이정도 오타는 넘어가도 괜찮은 건가요??마지막으로 제 마크다운 파일에는 표가 보이지 않습니다. 강의 내용 중에도 zerox로 만들어진 .md 파일을 훑어보는데 거기도 표가 나오고, 애초에 zerox를 사용하는 이유가 표를 꺼내기 위해선데 표가 보이지 않아요. 강의 자료 .md를 보면 수식으로 나와있는데(표는 아니더라도) 저는 수식이 있어야 될 곳은 공란으로 나오고 바로 다음 내용으로 넘어갑니다. 아래와 같이요. 복붙하면서 보니까 여기에도 어색한 표현이 있네요ㄷㄷ.. 특히 아래껀 1만분의 2를 곱한 금액인데.. 1만분의 1금이면 타격이 좀 있지 않나요??<제가 변환한 거 - 틀린 부분이 1 이하 <-> 1보다 큰 경우라서 아예 반대로.. 서술하고 있네요 ㄷㄷ> 1. 다음 계산세에 따라 계산한 약수(사업소득금액)의 종합소득금액에 차치하는 비율 1분 이하인 경우에는 1로, 0보다 큰 경우에는 0으로 한다. ② 해당 과세기간의 사업소득의 총수입금액에 1만분의 1금을 곱한 금액 <강사님의 강의자료> 1. 다음 계산식에 따라 계산한 금액(사업소득금액이 종합소득금액에서 차지하는 비율이 1보다 큰 경우에는 1, 0보다 작은 경우에는 0으로 한다) 가산세 = A × (B/C) × 100 - C × 5 A: 종합소득분이출세액 B: 사업소득금액 C: 종합소득금액 2. 해당 과세기간 사업소득의 총수입금액에 1만분의 2를 곱한 금액 적다보니 글이 길어졌네요 볼드체로 칠한게 글의 요지랍니다. 긴 글 읽어주셔서 감사합니다!
-
해결됨LangGraph를 활용한 AI Agent 개발 (feat. MCP)
수강에 대한 질문이 있습니다.
안녕하세요, RAG를 활용한 LLM Application 개발 강의를 수강했던 수강생 입니다. 수강 이후 약 두달정도 langchain을 놓은 상태라 거의.. 리셋된 상태입니다. 마지막으로 짰던 코드는 이해는 가는데 강의 내용이 세세하겐 떠오르지 않네요. 이와 같은 상황에서 그냥 바로 수강을 해도 될까요 아니면 RAG LLM 강의를 다시 한번 돌리고 시작하는 게 나을까요?? 답변 감사합니다!
-
미해결인공지능을 제대로 쓰는 개발자 되기: 코딩 부트캠프 실전 특강
보충강의 섹션에는 원래 강의가 없는 건가요?
보충강의 섹션에는 원래 강의가 없는 건가요?
-
해결됨LangGraph를 활용한 AI Agent 개발 (feat. MCP)
무한 rewrite 발생시 대처 방법
2.3 강의에서 generate 이후 스코어를 통해 rewrite를할지 end를 할지 판단할때, 쿼리 자체에서 document와 관련이 없는 질문을 했을때 무한으로 rewrite에 빠질 경우 어떻게 대처하면 될까요?
-
미해결Prompt Engineering: 완벽 가이드
[Advanced Prompt Technique: Thought Generation - Theory] 18:26 ~ 21:29 간 음성이 누락되어 있습니다.
[Advanced Prompt Technique: Thought Generation - Theory] 18:26 ~ 21:29 간 음성이 누락되어 있습니다.
-
해결됨LangGraph를 활용한 AI Agent 개발 (feat. MCP)
'NoneType' object is not subscriptable 에러 해결법 공유
안녕하세요. 강의 내용 따라하다가 아래 에러가 발생해서 공유드립니다.전체 소스코드는 글 맨 아래에 링크로 첨부했습니다. 위 코드를 실행했을 때, 결과가 잘 나올때도 있지만 종종 에러가 발생합니다. 에러 내용에 따르면 check_doc_relevance 함수에서 response에 아무것도 안담겨있어서 발생했다고 나오네요. 왜인지는 모르겠지만, 문서 관련성 판단 LLM이 작동하지 않은걸로 보입니다.그래서 저는 아래와 같이 response 에 아무것도 안담겨있다면 rewrite를 반환해서 노드를 다시 실행시키도록 했습니다.def check_doc_relevance(state: AgentState) -> Literal['generate', 'rewrite']: """ 주어진 state를 기반으로 문서의 관련성을 판단합니다. Args: state (AgentState): 사용자의 질문과 문맥을 포함한 에이전트의 현재 state. Returns: Literal['generate', 'rewrite']: 문서가 관련성이 높으면 'generate', 그렇지 않으면 'rewrite'를 반환합니다. """ query = state['query'] # state에서 사용자의 질문을 추출합니다. context = state['context'] # state에서 문맥을 추출합니다. # 문서 관련성 판단 체인을 구성합니다. doc_relevance_chain = doc_relevance_prompt | llm # 질문과 문맥을 사용하여 문서의 관련성을 판단합니다. response = doc_relevance_chain.invoke({'question': query, 'documents': context}) # ==================================== # 응답이 없는 경우에는 로그를 출력하고 'rewrite'를 반환합니다. if not response: print("No Response!!!") return 'rewrite' # ==================================== # 관련성이 높으면 'generate'를 반환하고, 그렇지 않으면 'rewrite'를 반환합니다. if response['Score'] == 1: return 'generate' return 'rewrite'위 코드 수행 결과:check_doc_relevance 가 두 번 다시 실행되어서 원하는 결과가 나왔습니다. 참고로 저는 강의에 쓰인 OpenAI 대신 UpstageAI 모델을 사용하고 있습니다.from langchain_upstage import ChatUpstage llm = ChatUpstage()저처럼 OpenAI 모델을 사용하지 않고 개발하다가 같은 문제를 겪는다면 도움이 되길 바랍니다. 전체 소스코드 링크: https://drive.google.com/file/d/1_WP4DM1OWFiP226WksXvjG5Em9dOaqPp/view?usp=sharing
-
미해결Prompt Engineering: 완벽 가이드
음성 누락
19분에서 21분 음성이 안나와요
-
해결됨LangGraph를 활용한 AI Agent 개발 (feat. MCP)
2.2강 8:33 강사님 설명 하신 에러 외 poppler 설치 요구 에러.
c:\miniforge3\envs\inflearn-langgraph-lecture\Lib\site-packages\pydantic\_internal\_config.py:345: UserWarning: Valid config keys have changed in V2:* 'fields' has been removed warnings.warn(message, UserWarning)ERROR:root:Error converting PDF to images: Unable to get page count. Is poppler installed and in PATH?--> ## 추가 설치 해야 할 패키지(강사님은 안함: 애플은 필요 없는 패키지 같음)# Poppler 설치: Poppler(https://github.com/oschwartz10612/poppler-windows/releases/download/v24.08.0-0/Release-24.08.0-0.zip)를 다운로드하여 설치합니다. 운영체제에 맞는 Poppler 바이너리를 다운로드하여 압축을 풀고 적절한 위치에 저장합니다. - (Windows의 경우, bin 폴더의 경로를 기억해두세요.)# 환경 변수 설정 (Windows): (1) 시스템 환경 변수 편집기(검색창에 "환경 변수" 검색)를 엽니다.# (2) "시스템 속성" 창에서 "환경 변수" 버튼을 클릭합니다.# (3) "시스템 변수" 섹션에서 "Path" 변수를 선택하고 "편집" 버튼을 클릭합니다.# (4) "새로 만들기" 버튼을 클릭하고 Poppler bin 폴더의 경로를 추가합니다. (예: C:\path\to\poppler-x.xx.x\bin)# (5) 모든 창을 닫고 변경 사항을 저장합니다.# (6) 터미널 또는 IDE 재시작: 환경 변수 변경 사항이 적용되도록 터미널 또는 IDE를 재시작합니다.
-
해결됨LangGraph를 활용한 AI Agent 개발 (feat. MCP)
2.2 강의에 income_tax.pdf 파일이 git 에서 누락된것 같아요
안녕하세요~!중요한건 아니지만 ㅎㅎ documents 폴더 밑에 income_tax.pdf 파일이 누락된것 같습니다.https://www.law.go.kr/%EB%B2%95%EB%A0%B9/%EC%86%8C%EB%93%9D%EC%84%B8%EB%B2%95%EC%8B%9C%ED%96%89%EB%A0%B9저는 위 링크로 가서 직접 받아서 코드 실행에는 문제 없었습니다~
-
해결됨LangGraph를 활용한 AI Agent 개발 (feat. MCP)
repository 클로닝 오류
git clone 하는 중에 error: inavalid path '2.6 SubGraph: LangGraph Agent를 Node로 활용하는 방법.ipynb'뜨면서 클론리포가 안되서요. 파일경로에 포함된 (:) 특수문자 때문이라고 gpt가 알려줬는데 원격저장소에서 파일 이름을 변경하기를 권장하네요..