Como usar o LangChain com o Genkit

Instalação

npm i --save genkitx-langchain

Uso

Você pode usar a maioria das cadeias ou utilitários do LangChain nos fluxos do Genkit como estão. O exemplo abaixo usa recuperados LangChain, carregadores de documentos e construções de cadeia para criar uma amostra de RAG simples.

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();

O exemplo usa o GenkitTracer fornecido pelo plug-in genkitx-langchain para instrumentar o LangChain. com recursos de observabilidade do Genkit. Agora, ao executar o fluxo da interface de desenvolvimento ou na produção, você terá visibilidade total das cadeias do LangChain.

Além disso, os componentes do LangChain não são interoperáveis com primitivos do Genkit (modelos, documentos, retrievers etc.).

Avaliadores (pré-lançamento)

É possível usar os avaliadores LangChain com o Genkit. Configure quais avaliadores você quer no plug-in langchain e siga o padrão processo de avaliação:

import { langchain } from 'genkitx-langchain';

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