استخدام LangChain مع Genkit

تثبيت

npm i --save genkitx-langchain

الاستخدام

يمكنك استخدام معظم سلاسل أو برامج LangChain في تدفقات 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'],
      },
    }),
  ],
});