ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [RAG] 챗봇 - 이전 대화 기억하여 답변하기
    딥러닝/LLM 2024. 4. 11. 13:22

    도입 배경

    기존의 chat gpt api를 사용할 시, 단발성의 질문요청과 답변을 주고 받았다 

    -> 이전의 대화에서 나왔던 답변에 대해 추가적인 질문을 할 수가 없는 문제가 발생

    사용 코드

    system_instruction = "농업 분야의 질문에 대해 상세히 설명해주세요"
    
    # Define your template with the system instruction
    template = (
        f"{system_instruction} "
        "이전 대화 내용과 후속 질문을 참고하여 독립적인 질문을 만들어주세요."
        "대화 내역: {chat_history}"
        "후속 질문: {question}"
    )
    # Create the prompt template
    condense_question_prompt = PromptTemplate.from_template(template)
    
    # 질문이 모호할 경우 추가 정보 요청
    def _question_generator(self, question: str, chat_history: list) -> str:
        chat_history_str = self._get_chat_history_str(chat_history)
        if question.strip() == "":
            return "질문이 비어있습니다. 구체적인 질문을 입력해주세요."
        elif len(question) < 5:
            return "질문이 너무 짧습니다. 더 자세한 내용을 포함하여 질문해주세요."
        else:
            prompt = PromptTemplate(
                input_variables=["question", "chat_history"],
                template="{chat_history}질문: {question}",
            )
            return prompt.format(question=question, chat_history=chat_history_str)
    
    ConversationalRetrievalChain.question_generator = _question_generator
    #############################################################################
    llm = ChatOpenAI(temperature=0, model_name='gpt-3.5-turbo-0125')
    memory = ConversationBufferWindowMemory(memory_key='chat_history', input_key='question', k=5, return_messages=True)
    vectorstore = Chroma(persist_directory = f'{domain_name}/Vector_DB/{data_name}', embedding_function = OpenAIEmbeddings(model ="text-embedding-3-large"))
    retriever = vectorstore.as_retriever(search_kwargs={"k": 4})
    
    chain = ConversationalRetrievalChain.from_llm(
    llm=llm,
    retriever=retriever,
    condense_question_prompt=condense_question_prompt,
    chain_type="stuff",
    memory=memory
    )
    
    chat_history = []
    
    while True:
        query = input("질문: ")
        if query.lower() == 'exit':
            break
        result = chain.invoke({"question": query, "chat_history": chat_history})
        chat_history.append((query, result["answer"]))
        print("답변:", result["answer"])
        print("-----------------------------------")
        print("대화 내역:", chat_history)
        print("-----------------------------------")
    질문: 딸기 정식시기 주의해야할 사항 5가지를 말해줘
    답변: 1. 촉성재배 딸기의 경우, 가급적 9.15일 이후에 정식하는 것이 바람직합니다.
    2. 정식 후에는 딸기 잎을 개화기까지 1∼2매를 제거해야 합니다.
    3. 수경재배 시에는 농장주의 베드내의 목표 EC와 ㏗를 결정하여 관리해야 합니다.
    4. 딸기의 생육상 전환에는 배액율, 온도, 배지의 함수율, 배양액의 농도 등 여러 요인이 관여하므로 조절이 필요합니다.
    5. 딸기 재배 시에는 정식 시기를 준수하고, 잎 따기를 적절히 하며, 수경재배 시에는 배양액의 관리와 딸기의 생육상 전환에 영향을 주는 요인들을 조절해야 합니다.
    -----------------------------------
    대화 내역: [('딸기 정식시기 주의해야할 사항 5가지를 말해줘', '1. 촉성재배 딸기의 경우, 가급적 9.15일 이후에 정식하는 것이 바람직합니다.\n2. 정식 후에는 딸기 잎을 개화기까지 1∼2매를 제거해야 합니다.\n3. 수경재배 시에는 농장주의 베드내의 목표 EC와 ㏗를 결정하여 관리해야 합니다.\n4. 딸기의 생육상 전환에는 배액율, 온도, 배지의 함수율, 배양액의 농도 등 여러 요인이 관여하므로 조절이 필요합니다.\n5. 딸기 재배 시에는 정식 시기를 준수하고, 잎 따기를 적절히 하며, 수경재배 시에는 배양액의 관리와 딸기의 생육상 전환에 영향을 주는 요인들을 조절해야 합니다.')]
    -----------------------------------
    질문: 가장 중요한 요소가 뭐야?
    답변: 주어진 내용에서 딸기의 생육환경을 적절히 조절하는 것이 중요하다고 언급되었습니다. 딸기의 생육환경을 관리하는 데는 온도, 습도, 빛, 토양의 영양성 등 여러 가지 요소가 중요하며, 이러한 요소들을 적절히 조절하여 딸기가 건강하게 자라도록 해야 합니다. 생육환경을 적절히 조절하지 않으면 딸기의 생육에 부정적인 영향을 줄 수 있으므로 주의해야 합니다.
    -----------------------------------
    대화 내역: [('딸기 정식시기 주의해야할 사항 5가지를 말해줘', '1. 촉성재배 딸기의 경우, 가급적 9.15일 이후에 정식하는 것이 바람직합니다.\n2. 정식 후에는 딸기 잎을 개화기까지 1∼2매를 제거해야 합니다.\n3. 수경재배 시에는 농장주의 베드내의 목표 EC와 ㏗를 결정하여 관리해야 합니다.\n4. 딸기의 생육상 전환에는 배액율, 온도, 배지의 함수율, 배양액의 농도 등 여러 요인이 관여하므로 조절이 필요합니다.\n5. 딸기 재배 시에는 정식 시기를 준수하고, 잎 따기를 적절히 하며, 수경재배 시에는 배양액의 관리와 딸기의 생육상 전환에 영향을 주는 요인들을 조절해야 합니다.'), ('가장 중요한 요소가 뭐야?', '주어진 내용에서 딸기의 생육환경을 적절히 조절하는 것이 중요하다고 언급되었습니다. 딸기의 생육환경을 관리하는 데는 온도, 습도, 빛, 토양의 영양성 등 여러 가지 요소가 중요하며, 이러한 요소들을 적절히 조절하여 딸기가 건강하게 자라도록 해야 합니다. 생육환경을 적절히 조절하지 않으면 딸기의 생육에 부정적인 영향을 줄 수 있으므로 주의해야 합니다.')]
    -----------------------------------

     

    위와 같이 이전의 대화기록을 참고하여 답변할 수 있는 챗봇으로 수정완료! 

     

    '딥러닝 > LLM' 카테고리의 다른 글

    [RAG] 임베딩 모델 선택  (0) 2024.04.11
Designed by Tistory.