Большинство руководств рекомендуют использовать ConversationalRetrievalChain. Однако я заметил, что он рекурсивно анализирует предыдущие тексты несколько раз, что приводит к квадратичному увеличению длины текста с каждым новым вопросом. Это ожидаемое поведение? Как это исправить?
Минимальный воспроизводимый пример
Для простоты давайте проигнорируем средство внедрения (предположим, что соответствующих документов нет). Итак, базовый код будет следующим:
Код: Выделить всё
import gradio as gr
from langchain.chains import ConversationalRetrievalChain
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.llms.huggingface_pipeline import HuggingFacePipeline
from langchain_core.vectorstores import InMemoryVectorStore
from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
LLM_MODEL_NAME = 'meta-llama/Llama-3.2-1B-Instruct' # can be any other model
EMBEDDER_MODEL_NAME = 'dunzhang/stella_en_1.5B_v5' # doesn't matter here
model = AutoModelForCausalLM.from_pretrained(LLM_MODEL_NAME)
tokenizer = AutoTokenizer.from_pretrained(LLM_MODEL_NAME)
llm_pipeline = pipeline(
'text-generation',
model=model,
tokenizer=tokenizer,
max_new_tokens=256,
)
llm = HuggingFacePipeline(pipeline=llm_pipeline)
# just mock of embedder and vector store
embedder = HuggingFaceEmbeddings(model_name=EMBEDDER_MODEL_NAME)
vector_store = InMemoryVectorStore(embedder)
retriever = vector_store.as_retriever()
chain = ConversationalRetrievalChain.from_llm(
llm=llm,
retriever=retriever,
return_source_documents=True,
)
def predict(message: str, history: list[list[str]]) -> str:
history = [tuple(record) for record in history]
result = chain.invoke({
'question': message,
'chat_history': history,
})
return result['answer']
gr.ChatInterface(predict).launch()

< /п>
Подробнее здесь: https://stackoverflow.com/questions/791 ... ext-growth