Menggunakan LangChain dengan Genkit

Penginstalan

npm i --save genkitx-langchain

Penggunaan

Anda dapat menggunakan sebagian besar rantai atau utilitas LangChain dalam alur Genkit sebagaimana adanya. Contoh di bawah ini menggunakan pengambil LangChain, pemuat dokumen, dan konstruksi rantai untuk membuat contoh RAG yang akurat.

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

Perhatikan bahwa contoh ini menggunakan GenkitTracer yang disediakan oleh plugin genkitx-langchain untuk menginstrumentasikan chain LangChain dengan fitur kemampuan observasi Genkit. Sekarang, saat Anda menjalankan flow dari UI Dev atau dalam produksi, Anda akan mendapatkan visibilitas penuh ke dalam rantai LangChain.

Perhatikan juga bahwa komponen LangChain tidak dapat dioperasikan dengan primitif Genkit (model, dokumen, retriever, dll.).

Evaluator (Pratinjau)

Anda dapat menggunakan evaluator LangChain dengan Genkit. Konfigurasikan evaluator mana yang Anda inginkan dari plugin langchain, lalu ikuti proses evaluasi standar:

import { langchain } from 'genkitx-langchain';

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