Как включить историю контекста/чата в 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.