Я пытаюсь передать контекст в диалоговую цепочку тряпок при использовании RunnableWithMessageHistory.
У меня есть следующая функция запроса:
def query(query_text, prompt, session_id, metadata_context):
# History retrieval test
contextualize_q_prompt = ChatPromptTemplate.from_messages(
[
("system", contextualize_q_system_prompt),
("system", "{context}"),
("system", prompt),
MessagesPlaceholder("chat_history"),
("human", "{input}"),
]
)
history_aware_retriever = create_history_aware_retriever(
llm, retriever, contextualize_q_prompt
)
qa_prompt = ChatPromptTemplate.from_messages(
[
("system", PROMPT_TEMPLATE),
("system", "{context}"),
("system", prompt),
MessagesPlaceholder("chat_history"),
("human", "{input}"),
]
)
question_answer_chain = create_stuff_documents_chain(llm, qa_prompt)
rag_chain = create_retrieval_chain(history_aware_retriever, question_answer_chain)
conversational_rag_chain = RunnableWithMessageHistory(
rag_chain,
get_session_history,
input_messages_key = "input",
history_messages_key = "chat_history",
output_messages_key = "answer",
)
try:
logger.info(f"Model: {LLM_MODEL} assigned. Generation of response has started.")
response = conversational_rag_chain.invoke({"input": query_text, "context": metadata_context}, config = {"configurable": {"session_id": f"{session_id}"}},)
logger.info(f"Response generated.")
except Exception as e:
return ({'Generation of response failed: ': str(e)})
return response["answer"]
Я хочу передать свой собственный «контекст», подготовленный и проанализированный из ретривера. Я не хочу, чтобы ретривер вызывался снова, но, судя по тому, что я прочитал, получение происходит само по себе, еслиchat_history не содержит ответа.
создается переменная подсказки:
prompt_template = ChatPromptTemplate.from_template(PROMPT_TEMPLATE)
prompt = prompt_template.format(context=metadata_context, input=query_text)
Как видите, я пытаюсь везде разместить контекст, но безуспешно.
«Контекст», который я вижу при звонке
conversational_rag_chain.invoke({"input": query_text, "context": metadata_context}, config = {"configurable": {"session_id": f"{session_id}"}},)
logger.info(f"Response generated.")
является результатом ретривера:
Document(metadata = {'number_of_reviews': '16', 'price': 18999, 'product_name': 'product', 'rating': '4')
Код, который я использую, выглядит следующим образом:
chroma_client = chromadb.HttpClient(host=DB_HOST, port=DB_PORT)
chroma_collection = chroma_client.get_collection(os.getenv("DB_COLLECTION"))
vectorstore = VStoreChroma(DB_COLLECTION, embedding_function, client=client)
llm = ChatOpenAI(model = "gpt-4o-mini",temperature=0)
retriever = SelfQueryRetriever.from_llm(
llm,
vectorstore,
document_content_description,
metadata_field_info,
search_kwargs = {"k": 10}
)
def self_query(query_text):
model = llm
logger.info("Data retrieval has started.")
try:
result = retriever.invoke(query_text)
logger.info("Data retrieved from database.")
if len(result) == 0:
logger.info(f"Unable to find matching results.")
except Exception as e:
return ({'Retrieval failed: ': str(e)})
return result
С извлечением все в порядке, я получаю правильные результаты. Проблема в том, что контекст я готовлю из метаданных, анализируя его с помощью функции, подобной той, которую вы упомянули в своем фрагменте. Это строка, и я не понимаю, куда ее можно передать, чтобы контекст использовался правильно. Остальное, как я уже говорил.
🤔 А знаете ли вы, что...
Python является интерпретируемым языком программирования.
Вы можете передать свой контекст или свой вопрос по своему усмотрению, но я думаю, что по сути ваш контекст должен быть отделен от вопроса.
Вы также можете легко передать свой контекст, используя этот шаблон, который я предоставил.
chat_template = """
Answer the following questions{question} \n
Based on the data and context provided {context} \n
Question: {question} \n
"""
# get the chat prompt template
prompt = ChatPromptTemplate.from_template(chat_template)
Что-то вроде этого ниже.
from langchain.prompts import ChatPromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.chains import LLMChain
from langchain_core.output_parsers import StrOutputParser
from operator import itemgetter
prompt = ChatPromptTemplate.from_template(chat_template)
# Initialize the LLM
llm = ChatOpenAI(temperature=0.5, max_tokens=4096)
# Initialize the output parser
output_parser = StrOutputParser()
# Create the LLMChain
final_rag = LLMChain(prompt=prompt, llm=llm, output_parser=output_parser)
# Invoke the chain with the input
question = "Your question here" # Replace this with your actual question
response = final_rag.invoke({"input": question, "context": itemgetter(metadata_context)})
print(response)