Używanie LangChain z Genkit

Instalacja

npm i --save genkitx-langchain

Wykorzystanie

W procesach Genkit możesz używać większości sieci i narzędzi LangChain. W przykładzie poniżej używamy plików LangChain, narzędzi do wczytywania dokumentów i konstrukcji łańcuchowych, aby utworzyć naiwną próbkę RAG.

import { initializeGenkit } from '@genkit-ai/core';
import { defineFlow, run, startFlowsServer } from '@genkit-ai/flow';
import { GoogleVertexAIEmbeddings } from '@langchain/community/embeddings/googlevertexai';
import { GoogleVertexAI } from '@langchain/community/llms/googlevertexai';
import { StringOutputParser } from '@langchain/core/output_parsers';
import { PromptTemplate } from '@langchain/core/prompts';
import {
  RunnablePassthrough,
  RunnableSequence,
} from '@langchain/core/runnables';
import { GenkitTracer } from 'genkitx-langchain';
import { PDFLoader } from 'langchain/document_loaders/fs/pdf';
import { formatDocumentsAsString } from 'langchain/util/document';
import { MemoryVectorStore } from 'langchain/vectorstores/memory';
import * as z from 'zod';

import config from './genkit.config';

initializeGenkit(config);

const vectorStore = new MemoryVectorStore(new GoogleVertexAIEmbeddings());
const model = new GoogleVertexAI();

export const indexPdf = defineFlow(
  { name: 'indexPdf', inputSchema: z.string(), outputSchema: z.void() },
  async (filePath) => {
    const docs = await run('load-pdf', async () => {
      return await new PDFLoader(filePath).load();
    });
    await run('index', async () => {
      vectorStore.addDocuments(docs);
    });
  }
);

const prompt =
  PromptTemplate.fromTemplate(`Answer the question based only on the following context:
{context}

Question: {question}`);
const retriever = vectorStore.asRetriever();

export const pdfQA = defineFlow(
  { name: 'pdfQA', inputSchema: z.string(), outputSchema: z.string() },
  async (question) => {
    const chain = RunnableSequence.from([
      {
        context: retriever.pipe(formatDocumentsAsString),
        question: new RunnablePassthrough(),
      },
      prompt,
      model,
      new StringOutputParser(),
    ]);

    return await chain.invoke(question, { callbacks: [new GenkitTracer()] });
  }
);

startFlowsServer();

Zwróć uwagę, że w przykładzie użyliśmy parametru GenkitTracer udostępnionego przez wtyczkę genkitx-langchain, aby dostosować łańcuchy LangChain za pomocą funkcji dostrzegalności Genkit. Teraz, gdy uruchomisz proces z poziomu interfejsu deweloperskiego lub w środowisku produkcyjnym, zyskasz pełny wgląd w łańcuchy LangChain.

Pamiętaj też, że komponenty LangChain nie współdziałają z pierwotnymi elementami Genkit (modelami, dokumentami, plikami typu retriever itp.).

Oceniający (wersja testowa)

W przypadku Genkit możesz używać weryfikatorów LangChain. Określ, których recenzentów chcesz używać we wtyczce langchain, a następnie postępuj zgodnie ze standardowym procesem oceny:

import { langchain } from 'genkitx-langchain';

configureGenkit({
  plugins: [
    langchain({
      evaluators: {
        judge: geminiPro,
        criteria: ['harmfulness', 'maliciousness'],
      },
    }),
  ],
});