استخدام LangChain مع Genkit

تثبيت

npm i --save genkitx-langchain

الاستخدام

يمكنك استخدام معظم سلاسل Langain أو برامجها المساعدة في تدفقات Genkit كما هو. ويستخدم المثال أدناه أدوات استرداد LangChain، وبرامج تحميل المستندات، وتركيبات السلاسل لإنشاء عينة 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();

تجدر الإشارة إلى أنّ المثال يستخدم السمة GenkitTracer التي يقدّمها المكوِّن الإضافي genkitx-langchain لقياس أداء سلاسل LangChain مع ميزات إمكانية رصد Genkit. والآن، عندما يتم تشغيل التدفق من واجهة مستخدم Dev أو في مرحلة الإنتاج، ستحصل على رؤية كاملة لسلاسل LangChain.

تجدر الإشارة أيضًا إلى أنّ مكوّنات LangChain لا يمكن تبادلها مع إصدارات Genkit الأساسية (الطُرز، والمستندات، وبرامج استرداد البيانات، وما إلى ذلك).

المقيّمون (معاينة)

يمكنك الاستعانة بالمقيّمين من LangChain مع Genkit. يمكنك تحديد المقيّمين الذين تريدهم من المكوّن الإضافي langchain ثم اتّباع عملية التقييم العادية:

import { langchain } from 'genkitx-langchain';

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