Как повысить релевантность исходного документа в реализации Langchain ConversationalRetrivalQAChain?

В настоящее время я работаю над проектом, в котором я реализовал ConversationalRetrivalQAChain с параметром returnSourceDocuments, установленным в значение true. Система отлично работает, когда я задаю конкретные вопросы, связанные с базой данных VectorStore, поскольку возвращает совпадающие источники. Однако когда я задаю общие вопросы типа «Земля круглая?» или «Как дела сегодня?» он возвращает несвязанные источники, которые не соответствуют запросу. Оказывается, векторное хранилище всегда возвращает документы, даже если они не соответствуют запросу.

Мне нужны рекомендации о том, как повысить релевантность исходных документов, полученных с помощью Langchain ConversationalRetrivalQAChain. Существуют ли в рамках Langchain конкретные инструменты или методы, которые могут помочь смягчить такое поведение, или необходимо разработать ручной процесс оценки релевантности документа? Как я могу эффективно ограничить получение несвязанных исходных документов в этом сценарии?

Вот соответствующая часть кода:

      async init(): Promise<void> {
        try {
            this.driver = await this.getQdrantDriver()
            this.retriever = await this.createRetrieverFromDriver()
            this.chat = new ChatOpenAI({ modelName: aiConfig.modelName })
            this.chain = await this.createQAChain(this.chat)

            this.questionGenerationChain = await this.createQuestionGenerationChain()
            this.conversation = new ConversationalRetrievalQAChain({
                retriever: this.retriever,
                combineDocumentsChain: this.chain,
                questionGeneratorChain: this.questionGenerationChain,
                returnSourceDocuments: true,
            })
        } catch (error) {
            Logger.error(error.message)
            throw error
        }
    }

    private async createQuestionGenerationChain(): Promise<LLMChain> {
        const { default: Prompt } = await import('App/Models/Prompt')
        return new LLMChain({
            llm: this.chat,
            prompt: await Prompt.fetchCondensePrompt(),
        })
    }

    private async createRetrieverFromDriver(): Promise<VectorStoreRetriever<QdrantVectorStore>> {
        return this.driver.asRetriever(qdrantConfig.noResults ?? 5)
    }

    private async getQdrantDriver(embeddings = new OpenAIEmbeddings(), collectionName: string | null = null): Promise<QdrantVectorStore> {
        const { default: Ingest } = await import('App/Models/Ingest')
        return new QdrantVectorStore(
            embeddings,
            {
                url: qdrantConfig.qdrantUrl,
                collectionName: collectionName ?? await Ingest.lastCollection(),
            },
        )
    }

    private async createQAChain(chat: BaseLanguageModel<any, BaseLanguageModelCallOptions>): Promise<StuffDocumentsChain> {
        const { default: Prompt } = await import('App/Models/Prompt')
        return loadQAStuffChain(chat, {
            prompt: await Prompt.fetchQuestionPrompt(),
        })
    }

1 ответ

Хорошо, я решил эту проблему, используя средство извлечения контекстного сжатия и EmbeddingsFilter. Это не идеальное решение, но в большинстве случаев оно уменьшает количество нежелательных ресурсов.

https://js.langchain.com/docs/modules/data_connection/retievers/how_to/contextual_compression/

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