해결된 질문
작성
·
133
0
안녕하십니까 선생님 강의 잘 듣고있습니다.
만약 create_react_agent에 tool이 vectordb retriever를 수행 할 때 retriever의 문서의 내용이 너무 많은 context를 가지고 있다면 llm이 리트리버한 결과를 바탕으로 질문에 대한 답변을 하지 않고 리트리버 문서를 요약해서 답변으로 출력합니다. 왜 그런건지 궁금합니다.
from langgraph.prebuilt import create_react_agent
@tool
def retriever_tool(query: str)->List[Document]:
"""
이 도구는 HR 데이터베이스에서 정보를 검색합니다.
"""
return retriever.invoke(query)
tools = [retriever_tool]
research_agent = create_react_agent(
model = llm,
tools = tools,
prompt=(""), )
답변 2
0
안녕하세요! 좋은 질문 감사합니다.
추측하기로는 prompt
가 비어있어서 LLM이 어떤 작업을 할지 명확하지 않아서 요약을 하는 것으로 보이는데요, 전체 코드를 한번 올려주시면 디버깅이 더 수월할 것 같습니다!
Context Overflow가 발생하면 reactAgent에서 동문서답이나 요약을 해버린다는 글
은 거짓정보입니다. context overflow가 발생하면 해당요청을 처리하지 못하고 에러가 나야해요.
저도 처음보는 에러라 감이 잘 안오는데, create_react_agent에 prompt를 주입하고 invoke나 stream으로 실행하시는건가요? 작성하신 코드를 올려주시면 ollama활용해서 llama3.1로 저도 한번 시도해보겠습니다.
선생님 늦은 시간까지 노고에 감사드립니다.
소스코드를 모두 올리기에는 무리가 있어 예시를 만들어 봤습니다. 큰 틀은 모두 동일 합니다.
invoker, stream 둘 다 동일하게 증상이 나왔었습니다. 가속기로 ChatOllama를 사용했습니다.
문서를 제공해드리고 싶은데 제공 못 드리는 점 죄송합니다.
from langchain_core.tools import tool
from langgraph.prebuilt import create_react_agent
from langchain_ollama import ChatOllama
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_core.messages import HumanMessage, AIMessage
llm = ChatOllama(
model="llama3.1:latest",
temperature=0,
# extract_reasoning = True
)
embedding =HuggingFaceEmbeddings(model_name='bespin-global-klue-sroberta-base-continue-learning-by-mnr')
vector_db = FAISS.load_local(
folder_path="",
embeddings=embedding,
allow_dangerous_deserialization=True
)
retriever = vector_db.as_retriever(search_kwargs={'k': 5})
def retriever_tool_wrapping():
@tool
def retriever_tool(query: str)->str:
"""
이 도구는 암호화된 데이터베이스에서 문서에 대한 정보를 안전하게 조회하는 데 사용됩니다.
Args:
query (str): 사용자의 질문(미리 정의된 질문이 사용됨)
Returns:
str: 문서 내용
"""
return retriever.invoke(query)
return retriever_tool
tools = [retriever_tool_wrapping()]
graph = create_react_agent(
model = llm,
tools = tools,
prompt=("""당신은 문서 담당자자 입니다. 주어진 질문에 답변하세요. 의견이 아닌 사실만 제공하세요
문서 관련련 질문은 retriever_tool 도구를 사용하세요.
반환된 문서의 내용을 요약하지 말고 질문에 직접 답변하세요.
문서의 내용이 충분하지 않으면 '정보 부족'이라고 답하고, 확신 없는 내용을 만들어내지 마세요."""),
)
inputs = {'messages': [HumanMessage("")]}
graph.invoke(inputs)
음 추측하기로는 retriever_tool_wrapping 이라는 wrapper가 필요 없는 작업을 하는 것 같은 느낌이긴한데 요거는 시도해보고 결과를 다시 올려드릴게요!
선생님 답변이 늦었습니다. 많은 도움이 되었습니다. 감사합니다.
아직 근본적인 retreiver의 문서길이가 길어질 경우 react agent에서 문서를 요약하는 부분은 해결하지 못 하였습니다.
하지만 문제를 우회하는 방식으로 문제를 해결하려고 하고 있고 공유 드리려고 합니다.
제가 테스트했던 retreiver의 문서5개(as_retriever(search_kwargs={'k': 5}))의 총 length는 13280입니다. ( 대략 글자 수가 10000개의 이상 되면 문제가 생기는 것 같습니다.)
현재 4가지의 해결 방법을 생각하여 진행하고 있습니다.
문서의 search_kwargs를 줄이기
rerank 방식을 사용하기
document의 metadata는 사용하지 않고 page_content만 따로 파싱해서 llm에게 넘겨주기
총 document의 length가 일정 범위를 넘으면 자르거나 요약해서 넘겨주기
감사합니다.
오늘도 좋은 하루 보내세요!
0
안녕하세요, 인프런 AI 인턴입니다. sangin1.park님.
질문하신 내용은 create_react_agent
함수로 생성된 에이전트가 너무 많은 컨텍스트를 가진 문서를 리트리버에서 가져올 때, 그 문서 자체의 요약을 답변으로 반환하는 상황에 대한 것입니다. 이는 여러 가지 요인에 의해 발생할 수 있으며, 다음과 같이 설명드릴 수 있습니다.
문서의 길이 및 복잡성:
프롬프트 설계:
create_react_agent
에 활용된 prompt
가 비어 있습니다. LLM이 적절히 핵심 응답을 생성하려면 프롬프트에 명확하고 구체적인 요청사항을 설정해주는 것이 중요합니다. 예를 들어, “질문에 직접 답변하는 방식으로 문서를 활용하세요.“처럼 LLM에게 원하는 결과물을 명확히 지시하는 것이 좋습니다.프롬프트 기반 조정:
prompt
를 통해 에이전트에게 구체적인 행동 지침을 제공할 수 있습니다. 예를 들어, 필요한 정보만을 선별해 제공하도록 요청하거나, 추가적인 context를 적절히 줄여 명료한 답변을 요청하는 등 방법이 있습니다.마음에 드는 답변이 되기를 바라며, 더 자세한 정보를 얻고 싶은 경우, 다른 유사한 이슈가 있는 다음의 링크에서도 자세한 내용을 살펴보시면 더 많은 도움을 받으실 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
prompt에 요약을 하지말라고도 해보고 여러가지 시도를 해봤었는데 리트리버의 문서 길이가 길어지면 결국요약을 하는 일이 발생하더라고요. 계속 찾아보고 있는데 리트리버의 chunk size가 너무커서 Context Overflow가 발생하면 reactAgent에서 동문서답이나 요약을 해버린다는 글을 봤었는데 이게 진짜인지 잘 모르겠어서요.. 모델은 llama3.18b와 qwen3 8b,14b 모두 같은 증상이 있었습니다. 문서가 짧으면 정상적으로 대답하는데 이게 creat_react_agent의 특성인지 아니면 문제점인지 잘모르겠습니다.
프롬프트는 이런식으로 작성했습니다
"너는 주어진 질문에 정확하게 답하는 전문가야.
retriever tool을 사용할 수 있으며, 반환된 문서의 내용을 요약하지 말고 질문에 직접 답변하도록 해.
문서가 충분하지 않으면 '정보 부족'이라고 답하고, 확신 없는 내용을 만들어내지 마."