안녕하세요, 저에게는 조금 어려운 강의였긴 했지만 아무쪼록 마지막까지 강의 잘 듣고 있습니다. 질문1) MCP를 활용해서 간단한 에이전트를 만들어보세요 의 과제와 관련해서 아이디어가 전혀 생각이 나지 않는데 간단한 에이전트 관련해서 샘플이 있을까요? MCP 서버와 클라이언트 개발까지 해서 제출 해야하는지 아니면 이미 만들어져있는 MCP나 이런 있는 것들을 활용해서 LLM 모델과 연결하면 되는건지 감이 안 잡히네요; 과제 사례를 확인할 수 있는 곳이 있을까요?
안녕하세요! 강의 수강과 책을 병행해서 보고 싶은데요, 강의가 예전에 촬영된것 같아서, 책을 참고해서 보는게 훨씬 수월하고 학습하는데 좋을것 같아서요. 각 강의 회차별로 "혼자서도 척척 해내는 AI 에이전트 만들기" 책에서 어떤 챕터랑 같이 보면 도움이 될지 알 수 있을까요??
안녕하세요, 개인 프로젝트로 rag 기반 챗봇을 구현하고 있습니다. ollama, gemma3:1b를 사용중입니다. txt 파일을 어느정도 전처리를 하고 임베딩을 시키려고 하는데 전처리 중 고민이 있습니다. 구조가 잡혀있는 txt 파일인데, 문서 구조는 대략 아래와 같은 형태입니다. 1.2 화면 설명 1.2.1 개요 - 이 화면은 사용자가 업무를 처리하기 위한 화면입니다. 1.2.2 화면 위치 상단 메뉴 > 업무 관리 > 처리 화면 1.2.3 처리 절차 1) 항목 선택 2) 저장 버튼 클릭 현재 고민되는 부분은 다음과 같습니다. 이런 번호 기반 구조를 그대로 유지한 채로 chunking 하는 것이 좋은지, 아니면 번호는 제거하고 의미 단위로만 분할하는 것이 나은지 - , • , 숫자 목록 같은 불릿/목록 기호를 임베딩 전에 제거하거나 정규화하는 게 좋은지 “개요 / 처리 절차 / 화면 위치” 같은 섹션 제목을 chunk 본문에 포함시키는 것이 검색 품질에 도움이 되는지 감사합니다.
강의를 들으면서 문득 든 궁금증인데, ai메세지가 도구를 잘못 선택했을 때(3번케이스)를 구현할 때, 왜 tool message를 수정하셨나요? tool 노드 호출전에 interrupt 해서 ai_message의 tool_calls에서 툴네임을 변경해도 되지 않을까해서요 case2번 : 도구는 잘 선택했을 때 쿼리가 잘못된 경우에서는 ai_message의 쿼리를 변경했듯이 3번의 케이스에선 ai_message의 툴네임을 변경해도 되지 않을까 의문이 들었습니다.
안녕하세요, 좋은 강의 감사합니다 ! 강의 내용과는 별개로, 개인 프로젝트 겸 하나 실험해보고 싶은 주제가 있어 간단히 의견 여쭤보고 싶습니다. 유튜브 라이브 채팅 로그를 분석하기 위해, 각 채팅을 의도 기반으로 7~10개 정도의 라벨로 분류해보려 합니다. (채팅은 약 5만~10만개 정도) 다만 라이브 채팅 특성상 다국어가 섞여 있고, 이모지 사용이 많으며, 문장이 매우 짧은 경우가 대부분이라 과연 잘 될지 고민이 됩니다... 이와 관련해 LLM을 활용해 채팅 데이터를 라벨링하는 방식에 대해 어떻게 생각하시는지 궁금합니다. 실제로 비슷한 케이스를 다뤄보신 경험이 있거나, 주의해야 할 점이 있다면 공유해주시면 감사하겠습니다. 또한 LLM을 활용한 라벨링 관점에서, 7~10개 라벨이 모델이 분류하기 적절한 수준인지 아니면 라벨 수를 줄이는 것이 성능 향상에 도움이 될지도 의견을 듣고 싶습니다. 감사합니다!
agent(state:AgentState) ->AgentState: messages =state['messages'] summary = state.get('summary',None) if summary: messages =[SystemMessage(content='Here is the summary of the earil er conversation : {summary}')]+messages response = llm_with_tools.invoke(messages) return {'messages':[response]} 안녕하세요 강사님, 강의 재밌게 듣고 있습니다. 수강중 궁금한 사항이 있어 질문 남깁니다. 위와 같이 코드를 알려주셨는데요, 이런 흐름이라면, messages 에 동일한 내용의 SystemMessage가 여러번 들어가게되는 걸까요? 예를 들어 사용자 질의 한개를 처리하는데, agent <-> tool 간의 반복 작업이 3번 있었다면 agent 가 3번 호출될 때마다 messages 리스트 앞에 동일한 SystemMessage 객체가 중복되어 붙을거 같아서요.
안녕하세요~ 강의 정말 재밌게 잘 듣고 있습니다!! 2.7 병렬 처리를 통한 효율 개선 강의의 tax_rate_calculation_prompt = ChatPromptTemplate.from_messages([ ('system', '''당신은 종합부동산세 계산 전문가입니다. 아래 문서를 참고해서 사용자의 질문에 대한 종합부동산세를 계산해주세요 종합부동산세 세율:{context}'''), ('human', '''과세표준과 사용자가 소지한 주택의 수가 아래와 같을 때 종합부동산세를 계산해주세요 과세표준: {tax_base} 주택 수:{query}''') ]) def calculate_tax_rate(state: AgentState): """ 주어진 state에서 세율을 계산합니다. Args: state (AgentState): 현재 에이전트의 state를 나타내는 객체입니다. Returns: dict: 'answer' 키를 포함하는 새로운 state를 반환합니다. """ # state에서 필요한 정보를 추출합니다. query = state['query'] tax_base = state['tax_base'] # retriever를 사용하여 쿼리를 실행하고 컨텍스트를 얻습니다. context = retriever.invoke(query) # tax_rate_chain을 구성하여 세율을 계산합니다. tax_rate_chain = ( tax_rate_calculation_prompt | llm | StrOutputParser() ) # tax_rate_chain을 사용하여 세율을 계산합니다. tax_rate = tax_rate_chain.invoke({ 'context': context, 'tax_base': tax_base, 'query': query }) # state에서 'answer' 키에 대한 값을 반환합니다. return {'answer': tax_rate} 이 부분에서 들은 궁금증인데요, context 는 과세표준별 세율 구간에 관한 정보를 가져오는 변수인데 왜 query에는 과세표준이 아닌 사용자의 주택 정보를 넣어서 invoke하는 형태인가요?
강의 모두 코드 똑같이 돌리고 db만 pinecone 을 사용하였습니다 ! 결과에 강의처럼 answer이 나오지 않는데 원인을 잘 모르겠습니다 ㅜ gpt 에 검색해보면 전체 코드를 꼼꼼히 검토해본 결과, 질문하신 "결과(answer)가 나오지 않는 이유" 는 크게 두 가지입니다. 하나는 데이터가 유실되는 방식의 반환(return) 때문이고, 다른 하나는 무한 루프(Infinite Loop) 가능성 때문입니다. 1. 가장 큰 원인: State 데이터 유실 LangGraph의 각 노드 함수( retrieve , generate , rewrite 등)는 AgentState 를 반환할 때, 기존의 데이터를 포함해서 돌려주어야 합니다. 현재 작성하신 코드를 보면: retrieve 함수: return {'context': docs} (이때 query 가 사라짐) generate 함수: return {'answer': response.content} (이때 query , context 가 모두 사라짐) 이렇게 나오는데 제가 봤을땐 이게 원인은 아닌것같습니다...!
from langchain_core.prompts import PromptTemplate from langchain_core.output_parsers import StrOutputParser dictionary = ['사람과 관련된 표현 -> 거주자'] rewrite_propmt = PromptTemplate.from_template(f"""사용자의 질문을 보고, 우리의 사전을 참고해서 사용자의 질문을 변경해주세요 사전:{dictionary} 질문: {{query}}""") def rewrite(state: AgentState)->AgentState: query = state['query'] rewrite_chain = rewrite_propmt | llm | StrOutputParser() response = rewrite_chain.invoke({'query': query}) return {'query' : response} # Create a LangSmith API in Settings > API Keys # Make sure API key env var is set: # import os; os.environ["LANGSMITH_API_KEY"] = "<your-api-key>" from langsmith import Client from typing import Literal client = Client() relevance_prompt = client.pull_prompt("langchain-ai/rag-document-relevance") def check_doc_relevance(state: AgentState)-> Literal['generateAnswer','rewrite']: query= state['query'] context= state['context'] relevance_chain = relevance_prompt | llm response = relevance_chain.invoke({'question':query, 'documents': context}) if response['Score'] ==1: return 'generateAnswer' return 'rewrite' graph_builer.add_node('retrieveDoc', retrieveDoc) graph_builer.add_node('generateAnswer', generateAnswer) graph_builer.add_node('rewrite', rewrite) from langgraph.graph import START, END graph_builer.add_edge(START,'retrieveDoc') graph_builer.add_conditional_edges('retrieveDoc', check_doc_relevance) graph_builer.add_edge('rewrite','retrieveDoc') graph_builer.add_edge('generateAnswer', END) graph =graph_builer.compile() from IPython.display import Image, display display(Image(graph.get_graph().draw_mermaid_png())) initial_State = {'query' : '연봉 5천만원 세금'} graph.invoke(initial_State) 강사님! 강의랑 똑같이 코드를 작성했는데도 'query: 연봉 5천만원 세금 ' 질문에 대한 답 score가 계속 1이 나와서 rewrite 노드로 이동하지 않습니다. 쿼리자체에 거주자나 사람을 나타내는 표현이 없는데도 문서에서 관련성을 키워드로 찾다보니 키워드가 있기만 해도 결과가 1이 나오네요ㅜㅜㅜ 강사님은 결과가 0이 나와 rewrite를 하고 제가 해볼때는 1이 나오는 이유가 무엇인지 모르겠습니다. {'query': '연봉 5천만원 세금', 'context': [Document(id='15f6746f-4e63-4775-a47e-c72298375620', metadata={'source': './tax_combined_final.txt'}, page_content='소득세법'), Document(id='a6c9015f-092f-4aa3-819b-e23588bb0a0f', metadata={'source': './tax_combined_final.txt'}, page_content='소득세법\n하는 자(제119조제9호에 따른 국내원천 부동산등양도소득을 지급하는 거주자 및 비거주자는 제외한다)는 제127조\n에도 불구하고 그 소득을 지급할 때에 다음 각 호의 금액을 그 비거주자의 국내원천소득에 대한 소득세로서 원천징\n수하여 그 원천징수한 날이 속하는 달의 다음 달 10일까지 대통령령으로 정하는 바에 따라 원천징수 관할 세무서,\n한국은행 또는 체신관서에 납부하여야 한다. <개정 2013. 1. 1., 2016. 12. 20., 2018. 12. 31., 2019. 12. 31., 2020. 12.\n29.>\n1. 제119조제1호에 따른 국내원천 이자소득: 다음 각 목의 구분에 따른 금액\n가. 국가·지방자치단체 및 내국법인이 발행하는 채권에서 발생하는 이자소득: 지급금액의 100분의 14\n나. 가목 외의 이자소득: 지급금액의 100분의 20\n2. 제119조제2호에 따른 국내원천 배당소득: 지급금액의 100분의 20\n3. 제119조제4호에 따른 국내원천 선박등임대소득 및 같은 조 제5호(조세조약에 따라 국내원천 사업소득으로 과세\n할 수 있는 소득은 제외한다)에 따른 국내원천 사업소득: 지급금액의 100분의 2\n4. 제119조제6호에 따른 국내원천 인적용역소득: 지급금액의 100분의 20. 다만, 국외에서 제공하는 인적용역 중대\n통령령으로 정하는 용역을 제공함으로써 발생하는 소득이 조세조약에 따라 국내에서 발생하는 것으로 보는 소득\n에 대해서는 그 지급금액의 100분의 3으로 한다.\n5. 제119조제9호에 따른 국내원천 부동산등양도소득: 지급금액의 100분의 10. 다만, 양도한 자산의 취득가액 및 양\n도비용이 확인되는 경우에는 그 지급금액의 100분의 10에 해당하는 금액과 그 자산의 양도차익의 100분의 20에\n해당하는 금액 중 적은 금액으로 한다.\n6. 제119조제10호에 따른 국내원천 사용료소득: 지급금액의 100분의 20\n7. 제119조제11호에 따른 국내원천 유가증권양도소득: 지급금액(제126조제6항에 해당하는 경우에는 같은 항의 정\n상가격을 말한다. 이하 이 호에서 같다)의 100분의 10. 다만, 제126조제1항제1호에 따라 해당 유가증권의 취득가\n액 및 양도비용이 확인되는 경우에는 그 지급금액의 100분의 10에 해당하는 금액과 같은 호에 따라 계산한 금액\n의 100분의 20에 해당하는 금액 중 적은 금액으로 한다.\n8. 제119조제12호에 따른 국내원천 기타소득: 다음 각 목의 구분에 따른 금액\n가. 제119조제12호카목의 소득: 지급금액의 100분의 15\n나. 제119조제12호타목의 소득: 다음의 구분에 따른 금액. 다만, 가상자산을 교환하거나 인출하는 경우에는 다음\n의 구분에 상당하는 금액으로서 가상자산 단위로 표시한 대통령령으로 정하는 금액으로 한다.\n1) 제126조제1항제3호에 따라 가상자산의 필요경비가 확인되는 경우: 지급금액의 100분의 10에 해당하는 금\n액과 같은 호에 따라 계산한 금액의 100분의 20에 해당하는 금액 중 적은 금액'), Document(id='5a211886-c6db-4fd5-9e77-a4375dd2ee6d', metadata={'source': './tax_combined_final.txt'}, page_content='5. 공적연금소득에 대해서는 기본세율\n5의2.제20조의3제1항제2호나목 및 다목에 따른 연금계좌 납입액이나 운용실적에 따라 증가된 금액을 연금수령한\n연금소득에 대해서는 다음 각 목의 구분에 따른 세율. 이 경우 각 목의 요건을 동시에 충족하는 때에는 낮은 세율\n을 적용한다.\n가. 연금소득자의 나이에 따른 다음의 세율\n|나이(연금수령일 현재)| 세율 |\n| ----------- | ----------- |\n| 70세 미만 | 100분의 5 |\n| 70세 이상 80세 미만 | 100분의 4 |\n| 80세 이상 | 100분의 3 |\n나. 삭제 <2014. 12. 23.>')], 'answer': AIMessage(content='연봉 5천만원에 대한 세금은 다양한 소득세 항목에 따라 달라질 수 있습니다. 일반적으로 소득세율은 소득금액에 따라 차등 적용되며, 기본 세율은 5%에서 시작합니다. 정확한 세금액을 계산하기 위해서는 총소득, 공제 항목 등을 고려해야 합니다.', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 78, 'prompt_tokens': 1352, 'total_tokens': 1430, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_provider': 'openai', 'model_name': 'gpt-4o-mini-2024-07-18', 'system_fingerprint': 'fp_3683ee3deb', 'id': 'chatcmpl-D2psPuRb1GQcktIDJfUhfjTjYL2CO', 'service_tier': 'default', 'finish_reason': 'stop', 'logprobs': None}, id='lc_run--019c027f-916f-7c82-9b4a-00ba35551ea7-0', tool_calls=[], invalid_tool_calls=[], usage_metadata={'input_tokens': 1352, 'output_tokens': 78, 'total_tokens': 1430, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})} 도와주시면 감사하겠습니다.