Как включить историю контекста/чата в OpenAI ChatBot, используя ChatGPT и langchain в Python?

Пожалуйста, будьте терпеливы, поскольку это буквально первый крупный код, который я когда-либо писал, и он предназначен для API ChatGPT OpenAI.

С помощью этого кода я собираюсь загрузить PDF-документ или группу PDF-документов. Затем разделите их, чтобы не расходовать мои жетоны. Затем пользователь задавал вопросы, связанные с указанными документами, и бот отвечал. У меня возникли проблемы с тем, что я хочу, чтобы бот понимал контекст, когда я задаю новые вопросы. Например: Вопрос 1: Что такое божья коровка?A1: Божья коровка — это разновидность жука, бла-бла-бла… В2: Какого они цвета?A2: Они могут быть самых разных цветов, бла-бла-бла... Q3: Где их можно найти?A3: Божьих коровок можно найти по всему миру....

Но я не могу запустить свой код. Вместо этого я получаю следующий результат:что я получаю, когда задаю дополнительный вопрос, требующий от бота знания контекста.

**Вот код: **

      import os
import platform

import openai
import gradio as gr
import chromadb
import langchain

from langchain.chat_models import ChatOpenAI
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import TokenTextSplitter

from langchain.document_loaders import PyPDFLoader
from langchain.prompts.prompt import PromptTemplate
from langchain.chains import ConversationalRetrievalChain
from langchain.memory import ConversationBufferMemory

#OpenAI API Key goes here
os.environ["OPENAI_API_KEY"] = 'sk-xxxxxxx'

#load the data here. 
def get_document():
    loader = PyPDFLoader('docs/ladybug.pdf')
    data = loader.load()
    return data

my_data = get_document()

#converting the Documents to Embedding using Chroma
text_splitter = TokenTextSplitter(chunk_size=1000, chunk_overlap=50)
my_doc = text_splitter.split_documents(my_data)

embeddings = OpenAIEmbeddings()
vectordb = Chroma.from_documents(my_doc, embeddings)
retriever=vectordb.as_retriever(search_type="similarity")
#Use System Messages for Chat Completions - this is the prompt template 

template = """{question}"""

QA_PROMPT = PromptTemplate(template=template, input_variables=["question"])
#QA_PROMPT = PromptTemplate(template=template, input_variables=["question"])


# Call OpenAI API via LangChain
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
#input_key="question",
def generate_response(query,chat_history):
    if query:
        llm = ChatOpenAI(temperature=0.5, model_name="gpt-3.5-turbo")
        my_qa = ConversationalRetrievalChain.from_llm(llm, retriever, QA_PROMPT, verbose=True, memory=memory)
        result = my_qa({"question": query, "chat_history": chat_history})

    return result["answer"]




# Create a user interface
def my_chatbot(input, history):
    history = history or []
    my_history = list(sum(history, ()))
    my_history.append(input)
    my_input = ' '.join(my_history)
    output = generate_response(input,history)
    history.append((input, output))
    return history, history

with gr.Blocks() as demo:
    gr.Markdown("""<h1><center>GPT - ABC Project (LSTK)</center></h1>""")
    chatbot = gr.Chatbot()
    state = gr.State()
    text = gr.Textbox(placeholder="Ask me a question about the contract.")
    submit = gr.Button("SEND")
    submit.click(my_chatbot, inputs=[text, state], outputs=[chatbot, state])

demo.launch(share = True)

Я понятия не имею, что я могу попробовать, и каждый раз, когда я что-то пробую, мне удается сделать это только хуже. поэтому я оставил все как есть в надежде, что кто-нибудь здесь сможет помочь.

Спасибо заранее.

2 ответа

Я воспользовался советом из ответа lax1089 и попробовал. Из второго сообщения, отправленного пользователем, был добавлен предыдущий запрос разговора до того, как сообщение достигнет сервера openAI. Я просто написал так qnaQuery +=[Previous Question: ${values.question}, Previous Answer: ${useOpenAiStore.answer}], New Question: Должны быть какие-то другие хитрые способы, но, тем не менее, это все равно работает для меня.

У меня также были большие проблемы с памятью LangChain. В конце концов мне удалось добиться того, что вы пытаетесь сделать, просто добавив приглашение/ответы к текущей строке (или массиву строк), которую я затем добавляю к каждому приглашению. Это грубо, но это работает.

Что-то вроде:[ТЕКУЩАЯ ПОДСКАЗКА] «Хорошо, какого они цвета?» [ДОБАВЛЕНО] «Для контекста, вот история чата на данный момент:[ИСТОРИЯ ЧАТА]

Это работает отлично, но, очевидно, для более длительных разговоров может потребоваться модель с большим контекстным окном, например gpt-4-32k.

Другие вопросы по тегам