해결된 질문
작성
·
70
1
안녕하세요 매번 빠른 답변 감사합니다. 복습을 하는중에 궁금한게 생겨서 질문을 남깁니다!
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가 알아서 판단하게 만드는것도 이론상은 가능할 것 같아서요. 그렇담 어떻게 구현하는지 궁금합니다.
적다보니 ..기네요 읽어주셔서 감사합니다.
답변 1
1
안녕하세요! 좋은 질문 감사합니다. 하나씩 답변을 드리자면
check_hallucination
과 check_doc_relevance
는 노드의 실행 결과에 따라 다음에 실행할 노드를 결정하는 edge로만 사용됩니다. 특정 조건에 따라 흐름을 제어하는 역할을 하므로, 별도의 노드로 선언되지 않고 edge로만 사용됩니다.
반면, check_helpfulness
는 노드이자 edge로 활용됩니다. check_helpfulness
가 단순히 흐름을 제어하는 것뿐만 아니라, 그 자체로도 중요한 기능을 수행하기 때문입니다. 따라서, 가독성을 높이고 그래프의 구조를 명확히 하기 위해 별도의 노드로 선언되었습니다.
하지만, check_helpfulness
를 edge로만 선언해도 기능적으로는 문제가 없습니다. 설계상의 선택이며, 가독성과 유지보수성을 고려한 결정입니다.
hallucination_prompt
를 보시면 not hallucinated
또는 hallucinated
를 리턴하게 되어있고, StrOutputParser()
를 활용해서, string만 뽑아내게 됩니다. 이 결과가 함수의 리턴값에 선언된 Literal의 옵션들과 동일하기 때문에 response를 리턴한다고 보시면 됩니다.
가능합니다. retrieval한 결과에 threshold(예를 들면 유사도가 70점은 넘어야 실제로 관련이 있다고 보는 점수)를 줘서, 사전에 정한 threshold를 넘기는 문서가 없는 경우에는 retrieval을 통해 가져올 문서가 없으니 web_search를 하도록 유도할 수 있습니다
추가로 설명이 필요한 부분이 있으시면 말씀 부탁드립니다!
네네 생각하시는 그래프가 맞습니다. threshold로 검증을하고, 웹검색을 할지 말지 결정하는 플로우로 가시면 됩니다.
[a, b]로 구현하는 것도 가능합니다.
웹검색 결과를 web_context: list[Document] 와 같은 형식으로 저장하고, 필요한 정보를 찾을 때마다 추가하고, 필요한 정보를 다 찾았는지 검증하는 node를 써서 while loop과 유사하게 구현하는 방법이 있을 것 같습니다.
그런데 말씀하신 기능은 워크플로우보다는 3강에서 설명드리는 도구를 활용하는 편이 좋습니다. 프롬프트 엔지니어링과 웹검색 도구를 결합하면, 필요한 정보를 얻을 때까지 웹검색을 계속 시킬 수 있습니다.
아 3강에서 다루는군요 !! 2강 복습하면서 생긴 궁금증이라 섣불렀네요 ㅋㅋ 사실 사람이랑 소통하는것도 궁금했는데 커리큘럼보니까 있는거 같아보여서 이건 생략했었거든요. 답변 감사합니다 ㅎㅎ.. 마저 열심히 듣겠습니다.
답변 감사합니다. 근데 3번 같은 경우 유사도로 판단하는건 이해를 했는데, 어떻게 답변을 생성하는 지 모르겠습니다.
이렇게 필요한 변수를 미리 정하는 것이 아니라
이렇게 선언하고(해당 문서와 관련된 어떤 질문을 할 지 모르기 때문에), 쿼리를 받았을 때 vector_store에 있는 정보(유사도 점수가 높은 경우)는 따로 저장 + 없는 정보는 ai가 알아서 판단한 다음 따로 웹서치를 하게 만든 필요한 정보들이 전부 모이면 -> 답변 생성.
이게 제가 생각한 그래프입니다. 이렇게 된다는 건가요? 근데 사실 웹서치를 해야되는게 n개가 된다면? 그걸 하나하나 계산해서 web_search 노드를 만들 순 없지 않나요? 기존에 웹서치하나해서 -> 필요한 일부 정보를 저장하고, 또 웹서치 돌려서 b를 찾아서 필요한 정보 [a ,b] 만드는 식으로 한다. << 이것도 가능한가요???? 야밤에 질문이 많네요.
글 읽어주셔서 감사합니다!