인프런 커뮤니티 질문&답변

foqlzm12345님의 프로필 이미지

작성한 질문수

RAG를 활용한 LLM Application 개발 (feat. LangChain)

3.2.1 OpenAIEmbeddings 대신 UpstageEmbeddings를 활용하는 방법

답변에 Source 추가하기

해결된 질문

24.08.14 14:35 작성

·

76

0

안녕하세요 강사님

답변에 마지막에 참고한 문서의 source를 남겨 신뢰도를 올리려 합니다.
prompt를 다음과 같이 추가했습니다
1. 모든 답변에는 직접적으로 참조한 자료의 목록을 추가해야 합니다. 최종 답변에 관련이 없는 자료는 제외합니다. 2. 답을 모를 경우 답을 지어내지 말고 [정확한 답을 찾을 수 없지만, 다음 링크를 확인해 보시기 바랍니다] 라고 말한 뒤 자료 링크를 목록으로 추가합니다.

문제는 출처를 남길 때 AI가 참고한 자료를 남길 때도 있지만 AI가 존재하지 않는 source를 문서내의 링크나 내용과 조합해서 만들어내는 일종의 hallucination이 발생하는 것 입니다 ( 정확한 원인은 모르겠습니다 )

 

따라서 prompt 말고 직접 data에서 pick(answer)를 하지 않고 content속 metadata : souce를 꺼내고자 하는데 강의에서의 stream으로 응답주기 전에 answer 하단 부에 [출처 : 1. aaa, 2. bbb] 하기 위해서는 chain을 수정해야 할 까요?

 

지금으로서는

ai_response = final_chain.pick("answer").stream(
    {
        "question": user_message
    },
    config={
        "configurable": {"session_id": "abc123"}
    }
)
ai_resource = final_chain.pick("context").invoke(
    {
        "question": user_message
    },
    config={
        "configurable": {"session_id": "abc123"}
    }
)

이렇게 두번 호출해서 resource는 반복문을 통해서 떠내는 방식으로 구현해보았는데 절대 올바른 방법은 아닌 것 같아서요..

답변 2

0

강병진님의 프로필 이미지
강병진
지식공유자

2024. 08. 14. 18:02

너무너무 좋은 고민입니다! 질문에 대한 답변은 4.4강에 있습니다 계속 화이팅하세요~

0

foqlzm12345님의 프로필 이미지
foqlzm12345
질문자

2024. 08. 14. 15:04

추가로 resource 를 st.write 하면 이후 질문시 음영처리 되면서 사용자 질문 section으로 넘어 가는데 어떤부분에서 일어나는 현상인지 궁금합니다. streamlit을 처음 사용해봐서 알 수가 없네요..

# source 데이터 꺼내기 위한 함수
def write_sources(documents):
    sources = set()  # 중복을 제거하기 위해 set 사용
    st.write("\n*이 정보는 다음의 자료를 기반으로 제공되었습니다.*")

    unique_sources = []

    for doc in documents:
        source = doc.metadata.get("source")
        if source not in sources:
            sources.add(source)
            unique_sources.append(f"\n- {source}")

    return unique_sources

with st.spinner("답변을 생성하는 중입니다"):
    ai_response, ai_resource = get_ai_response(user_question)
    with st.chat_message("ai"):
        ai_message = st.write_stream(ai_response)
        st.session_state.message_list.append({"role": "ai", "content": ai_message})
        # st.write(f"AI resource: {ai_resource}") # stream 문제는 아닌 것으로 추정
        st.write_stream(write_sources(ai_resource)) # 해당 부분이 넘어감
image.png
강병진님의 프로필 이미지
강병진
지식공유자

2024. 08. 14. 18:04

추측하기로는 ai_resource.invoke() 의 리턴값이라서 iterable이 아니라서 에러가 나는게 아닌가 싶네요.

 

.stream() 으로 가져온 답변은 st.write_stream() 을 하고, .invoke() 로 가져온 답변은 st.write() 를 해야합니다