Menggunakan LangChain dengan Genkit

Penginstalan

npm i --save genkitx-langchain

Penggunaan

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

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 melengkapi LangChain jaringan dengan fitur kemampuan observasi Genkit. Sekarang, saat Anda menjalankan alur dari {i>Dev UI<i} atau dalam produksi, kamu akan mendapatkan visibilitas penuh ke 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. Mengonfigurasi evaluator mana yang Anda inginkan dari plugin langchain, lalu mengikuti standar proses evaluasi:

import { langchain } from 'genkitx-langchain';

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