Почему ConversationalRetrievalChain/RetrivalQA включает в ответ подсказку, вызывающую рекурсивный рост текста?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Почему ConversationalRetrievalChain/RetrivalQA включает в ответ подсказку, вызывающую рекурсивный рост текста?

Сообщение Anonymous »

Я создаю чат-бота RAG на собственных данных, используя langchain. Существует множество руководств, как это сделать, например это
Большинство руководств рекомендуют использовать 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()
Когда я запускаю этот код, модель рекурсивно анализирует одну и ту же часть все больше и больше раз. Эта часть выделена красным прямоугольником на экране:
Изображение
< /p>
PS Такое поведение также происходит в случае цепочки RetrivalQA
UPD Я обнаружил аналогичную проблему в этом сообщении Reddit для RetrivalQA цепочка, но у нее нет полезного ответа

Подробнее здесь: https://stackoverflow.com/questions/791 ... answer-tha
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Почему ConversationalRetrievalChain вызывает рекурсивный рост текста?
    Anonymous » » в форуме Python
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Могу ли я предотвратить рост ребенка в контейнере «гибкий рост»?
    Anonymous » » в форуме Html
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Могу ли я предотвратить рост ребенка в контейнере «гибкий рост»?
    Anonymous » » в форуме CSS
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Могу ли я предотвратить рост ребенка в контейнере «гибкий рост»?
    Anonymous » » в форуме Html
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Могу ли я предотвратить рост ребенка в контейнере «гибкий рост»?
    Anonymous » » в форуме CSS
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»