自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

TypeScript版LlamaIndex來襲!用Agentic RAG構(gòu)建智能AI代理,效率與隱私雙提升! 原創(chuàng)

發(fā)布于 2025-4-7 09:45
瀏覽
0收藏

TypeScript版LlamaIndex來襲!用Agentic RAG構(gòu)建智能AI代理,效率與隱私雙提升!-AI.x社區(qū)

想象一下,有一個私人研究助手不僅能理解你的問題,還能智能地決定如何找到答案。對于某些問題,它會深入你的文檔庫中查找答案,而對于其他問題,它則會生成富有創(chuàng)意的回應(yīng)。這聽起來是不是很酷?其實,這一切都可以通過使用 Agentic RAG(檢索增強(qiáng)型生成) 和 LlamaIndex TypeScript 系統(tǒng)來實現(xiàn)。

無論你是想創(chuàng)建一個文獻(xiàn)分析系統(tǒng)、技術(shù)文檔助手,還是任何知識密集型應(yīng)用,本文介紹的方法都將為你提供一個實用的基礎(chǔ)框架。接下來,我們將通過一個實際的動手項目,帶你一步步構(gòu)建這樣一個系統(tǒng),從設(shè)置本地模型到實現(xiàn)專門的工具,最終交付令人驚嘆的結(jié)果。

為什么選擇 TypeScript?

TypeScript 是一種強(qiáng)大的編程語言,它為構(gòu)建基于 LLM(大型語言模型)的 AI 應(yīng)用提供了諸多優(yōu)勢:

  • 類型安全:TypeScript 的靜態(tài)類型檢查可以在開發(fā)過程中捕捉錯誤,而不是等到運行時才發(fā)現(xiàn)。
  • 更好的 IDE 支持:自動補(bǔ)全和智能提示讓開發(fā)過程更快捷。
  • 提高可維護(hù)性:類型定義讓代碼更易讀,也更具自文檔性。
  • 無縫 JavaScript 集成:TypeScript 可以與現(xiàn)有的 JavaScript 庫無縫對接。
  • 可擴(kuò)展性:隨著你的 RAG 應(yīng)用不斷擴(kuò)展,TypeScript 的結(jié)構(gòu)化特性有助于管理復(fù)雜性。
  • 框架支持:Vite、NextJS 等強(qiáng)大的 Web 框架與 TypeScript 無縫連接,讓構(gòu)建基于 AI 的 Web 應(yīng)用變得輕松且可擴(kuò)展。

LlamaIndex 的優(yōu)勢

LlamaIndex 是一個強(qiáng)大的框架,用于構(gòu)建基于 LLM 的 AI 應(yīng)用。它提供了以下優(yōu)勢:

  • 簡化數(shù)據(jù)加載:通過 LlamaParse,可以輕松加載和處理本地或云端的文檔。
  • 向量存儲:內(nèi)置支持嵌入和檢索語義信息,支持與 ChromaDB、Milvus、Weaviate 和 pgvector 等行業(yè)標(biāo)準(zhǔn)數(shù)據(jù)庫的集成。
  • 工具集成:可以創(chuàng)建和管理多個專業(yè)工具。
  • 代理插件:你可以輕松構(gòu)建或插入第三方代理。
  • 查詢引擎靈活性:可以根據(jù)不同的用例定制查詢處理。
  • 持久化支持:可以保存和加載索引,提高重復(fù)使用的效率。

什么是 Agentic RAG?

TypeScript版LlamaIndex來襲!用Agentic RAG構(gòu)建智能AI代理,效率與隱私雙提升!-AI.x社區(qū)

在深入實現(xiàn)之前,我們先來了解一下 Agentic RAG 是什么。RAG(檢索增強(qiáng)型生成)是一種技術(shù),通過從知識庫中檢索相關(guān)信息來增強(qiáng)語言模型的輸出,然后利用這些信息生成更準(zhǔn)確、更符合事實的回應(yīng)。而 Agentic 系統(tǒng)則涉及 AI 根據(jù)用戶查詢決定采取哪些行動,有效地作為一個智能助手,選擇合適的工具來滿足請求。

Agentic RAG 系統(tǒng)結(jié)合了這兩種方法,創(chuàng)建了一個既能從知識庫中檢索信息,又能根據(jù)需要使用其他工具的 AI 助手。根據(jù)用戶問題的性質(zhì),它會決定是使用內(nèi)置知識、查詢向量數(shù)據(jù)庫,還是調(diào)用外部工具。

開發(fā)環(huán)境搭建

安裝 Node.js

在 Windows 上安裝 Node.js 的步驟如下:

# 下載并安裝 fnm
winget install Schniz.fnm

# 下載并安裝 Node.js
fnm install 22

# 驗證 Node.js 版本
node -v # 應(yīng)輸出 "v22.14.0"

# 驗證 npm 版本
npm -v # 應(yīng)輸出 "10.9.2"

其他系統(tǒng)可以參考 官方文檔。

從簡單數(shù)學(xué)代理開始

讓我們先從一個簡單的數(shù)學(xué)代理開始,了解 LlamaIndex TypeScript API 的基本用法。

第一步:設(shè)置工作環(huán)境

創(chuàng)建一個新目錄,進(jìn)入該目錄并初始化一個 Node.js 項目,安裝必要的依賴:

$ md simple-agent
$ cd simple-agent
$ npm init
$ npm install llamaindex @llamaindex/ollama

我們將為數(shù)學(xué)代理創(chuàng)建兩個工具:

  • 一個加法工具,用于計算兩個數(shù)字的和。
  • 一個除法工具,用于計算兩個數(shù)字的商。

第二步:導(dǎo)入必要的模塊

在你的腳本中添加以下導(dǎo)入:

import { agent, Settings, tool } from "llamaindex";
import { z } from "zod";
import { Ollama, OllamaEmbedding } from "@llamaindex/ollama";

第三步:創(chuàng)建 Ollama 模型實例

實例化 Llama 模型:

const llama3 = new Ollama({
  model: "llama3.2:1b",
});

現(xiàn)在,你可以通過 ??Settings?? 直接為系統(tǒng)設(shè)置主模型,或者在代理中直接使用不同的模型。

Settings.llm = llama3;

第四步:創(chuàng)建數(shù)學(xué)代理工具

創(chuàng)建加法和除法工具:

const addNumbers = tool({
  name: "SumNumbers",
  description: "使用此函數(shù)計算兩個數(shù)字的和",
  parameters: z.object({
    a: z.number().describe("第一個數(shù)字"),
    b: z.number().describe("第二個數(shù)字"),
  }),
  execute: ({ a, b }: { a: number; b: number }) => `${a + b}`,
});

這里我們使用了 Zod 庫來驗證工具的參數(shù)。同樣地,我們創(chuàng)建一個除法工具:

const divideNumbers = tool({
  name: "divideNumber",
  description: "使用此函數(shù)計算兩個數(shù)字的商",
  parameters: z.object({
    a: z.number().describe("被除數(shù)"),
    b: z.number().describe("除數(shù)"),
  }),
  execute: ({ a, b }: { a: number; b: number }) => `${a / b}`,
});

第五步:創(chuàng)建數(shù)學(xué)代理

在主函數(shù)中,我們創(chuàng)建一個數(shù)學(xué)代理,使用這些工具進(jìn)行計算:

async function main(query: string) {
const mathAgent = agent({
    tools: [addNumbers, divideNumbers],
    llm: llama3,
    verbose: false,
  });

const response = await mathAgent.run(query);
console.log(response.data);
}

// 驅(qū)動代碼,運行應(yīng)用
const query = "Add two number 5 and 7 and divide by 2";
void main(query).then(() => {
console.log("Done");
});

如果你直接通過 ??Settings??? 設(shè)置 LLM,那么你不需要在代理中顯式指定 LLM 參數(shù)。如果你希望為不同的代理使用不同的模型,那么必須顯式指定 ??llm?? 參數(shù)。

運行這段代碼后,你將得到如下輸出:

TypeScript版LlamaIndex來襲!用Agentic RAG構(gòu)建智能AI代理,效率與隱私雙提升!-AI.x社區(qū)

接下來,我們嘗試一個更復(fù)雜的查詢:

const query = "If the total number of boys in a class is 50 and girls is 30, what is the total number of students in the class?";
void main(query).then(() => {
  console.log("Done");
});

輸出:

TypeScript版LlamaIndex來襲!用Agentic RAG構(gòu)建智能AI代理,效率與隱私雙提升!-AI.x社區(qū)

哇,我們的小 Llama3.2 1B 模型表現(xiàn)得相當(dāng)出色,能夠準(zhǔn)確地處理代理任務(wù)并進(jìn)行計算!現(xiàn)在,讓我們深入到項目的主體部分。

構(gòu)建 Agentic RAG 應(yīng)用

開發(fā)環(huán)境搭建

按照以下步驟設(shè)置開發(fā)環(huán)境:

$ md agentic-rag-app
$ cd agentic-rag-app
$ npm init
$ npm install llamaindex @llamaindex/ollama

同時,從 Ollama 中拉取必要的模型,例如 ??Llama3.2:1b??? 和 ??nomic-embed-text??。

在我們的應(yīng)用中,我們將有四個模塊:

  • load-index:用于加載和索引文本文件。
  • query-paul:用于查詢 Paul Graham 的文章。
  • constant:用于存儲可重用的常量。
  • app:用于運行整個應(yīng)用。

首先,創(chuàng)建 ??constant.ts??? 文件和 ??data?? 文件夾:

// constant.ts
const constant = {
  STORAGE_DIR: "./storage",
  DATA_FILE: "data/pual-essay.txt",
};

export default constant;

這是一個包含必要常量的對象,將在整個應(yīng)用中多次使用。創(chuàng)建一個 ??data?? 文件夾,并將文本文件放入其中。你可以從 這里 下載數(shù)據(jù)源。

實現(xiàn)加載和索引模塊

TypeScript版LlamaIndex來襲!用Agentic RAG構(gòu)建智能AI代理,效率與隱私雙提升!-AI.x社區(qū)

以下是加載和索引模塊的實現(xiàn)流程:

導(dǎo)入必要的包

import { Settings, storageContextFromDefaults } from "llamaindex";
import { Ollama, OllamaEmbedding } from "@llamaindex/ollama";
import { Document, VectorStoreIndex } from "llamaindex";
import fs from "fs/promises";
import constant from "./constant";

創(chuàng)建 Ollama 模型實例

const llama3 = new Ollama({
  model: "llama3.2:1b",
});

const nomic = new OllamaEmbedding({
  model: "nomic-embed-text",
});

設(shè)置系統(tǒng)模型

Settings.llm = llama3;
Settings.embedModel = nomic;

實現(xiàn) ???indexAndStorage?? 函數(shù)

async function indexAndStorage() {
try {
    // 設(shè)置持久化存儲
    const storageContext = await storageContextFromDefaults({
      persistDir: constant.STORAGE_DIR,
    });

    // 加載文檔
    const essay = await fs.readFile(constant.DATA_FILE, "utf-8");
    constdocument = new Document({
      text: essay,
      id_: "essay",
    });

    // 創(chuàng)建并持久化索引
    await VectorStoreIndex.fromDocuments([document], {
      storageContext,
    });

    console.log("索引和嵌入文件已成功存儲!");
  } catch (error) {
    console.log("索引過程中發(fā)生錯誤:", error);
  }
}

這段代碼將創(chuàng)建一個持久化存儲空間,用于存儲索引和嵌入文件。然后,它將從項目的數(shù)據(jù)目錄中加載文本數(shù)據(jù),并使用 LlamaIndex 的 ??Document??? 方法創(chuàng)建一個文檔對象。最后,它將使用 ??VectorStoreIndex?? 方法從該文檔創(chuàng)建一個向量索引。

導(dǎo)出函數(shù)

export default indexAndStorage;

實現(xiàn)查詢模塊

TypeScript版LlamaIndex來襲!用Agentic RAG構(gòu)建智能AI代理,效率與隱私雙提升!-AI.x社區(qū)

接下來,我們實現(xiàn)查詢模塊。創(chuàng)建一個名為 ??query-paul.ts?? 的文件。

導(dǎo)入必要的包

import {
  Settings,
  storageContextFromDefaults,
  VectorStoreIndex,
} from "llamaindex";
import constant from "./constant";
import { Ollama, OllamaEmbedding } from "@llamaindex/ollama";
import { agent } from "llamaindex";

創(chuàng)建和設(shè)置模型

創(chuàng)建和設(shè)置模型的方式與前面相同。

實現(xiàn) ???loadAndQuery?? 函數(shù)

async function loadAndQuery(query: string) {
try {
    // 從持久化存儲中加載索引
    const storageContext = await storageContextFromDefaults({
      persistDir: constant.STORAGE_DIR,
    });

    // 加載已有的索引
    const index = await VectorStoreIndex.init({ storageContext });

    // 創(chuàng)建檢索器和查詢引擎
    const retriever = index.asRetriever();
    const queryEngine = index.asQueryEngine({ retriever });

    const tools = [
      index.queryTool({
        metadata: {
          name: "paul_graham_essay_tool",
          description: `此工具可以回答有關(guān) Paul Graham 文章的詳細(xì)問題。`,
        },
      }),
    ];
    const ragAgent = agent({ tools });

    // 查詢已索引的文章
    const response = await queryEngine.query({ query });
    let toolResponse = await ragAgent.run(query);

    console.log("響應(yīng):", response.message);
    console.log("工具響應(yīng):", toolResponse);
  } catch (error) {
    console.log("檢索過程中發(fā)生錯誤:", error);
  }
}

在這段代碼中,我們首先從 ??STORAGE_DIR??? 中加載存儲上下文,然后使用 ??VectorStoreIndex.init()??? 方法加載已索引的文件。加載完成后,我們創(chuàng)建一個檢索器和查詢引擎。接下來,我們創(chuàng)建一個工具,該工具可以從已索引的文件中回答問題,并將其添加到名為 ??ragAgent?? 的代理中。

然后,我們通過查詢引擎和代理分別查詢已索引的文章,并將響應(yīng)輸出到終端。

導(dǎo)出函數(shù)

export default loadAndQuery;

實現(xiàn) ???app.ts??

現(xiàn)在,我們將所有模塊整合到一個 ??app.ts?? 文件中,方便執(zhí)行。

import indexAndStorage from"./load-index";
import loadAndQuery from"./query-paul";

function main(query: string) {
console.log("======================================");
console.log("正在索引數(shù)據(jù)....");
  indexAndStorage();
console.log("數(shù)據(jù)索引完成!");
console.log("請稍候,正在獲取響應(yīng)或訂閱!");
  loadAndQuery(query);
}

const query = "什么是生活?";
main(query);

在這里,我們導(dǎo)入所有模塊,按順序執(zhí)行它們,并運行應(yīng)用。

運行應(yīng)用

在終端中運行以下命令:

$ npx tsx ./app.ts

首次運行時,可能會發(fā)生以下幾件事:

  1. 它會提示你安裝??tsx??,請按照提示安裝。
  2. 它會根據(jù)你的系統(tǒng)性能花費一些時間來嵌入文檔(這是一次性的操作)。
  3. 最后,它會返回響應(yīng)。

以下是首次運行的示例:

TypeScript版LlamaIndex來襲!用Agentic RAG構(gòu)建智能AI代理,效率與隱私雙提升!-AI.x社區(qū)

沒有代理時,響應(yīng)可能如下所示:

TypeScript版LlamaIndex來襲!用Agentic RAG構(gòu)建智能AI代理,效率與隱私雙提升!-AI.x社區(qū)

使用代理時,響應(yīng)可能如下所示:

TypeScript版LlamaIndex來襲!用Agentic RAG構(gòu)建智能AI代理,效率與隱私雙提升!-AI.x社區(qū)

TypeScript版LlamaIndex來襲!用Agentic RAG構(gòu)建智能AI代理,效率與隱私雙提升!-AI.x社區(qū)

今天的分享就到這里。希望這篇文章能幫助你了解 TypeScript 的工作流程。

項目代碼倉庫

你可以在 這里 找到完整的項目代碼。

總結(jié)

這是一個簡單但功能強(qiáng)大的 Agentic RAG Using LlamaIndex TypeScript 系統(tǒng)。通過這篇文章,我想讓你了解除了 Python 之外,還可以使用 TypeScript 來構(gòu)建 Agentic RAG Using LlamaIndex TypeScript 或其他基于 LLM 的 AI 應(yīng)用。Agentic RAG 系統(tǒng)是基本 RAG 實現(xiàn)的有力進(jìn)化,能夠根據(jù)用戶查詢提供更智能、更靈活的響應(yīng)。使用 LlamaIndex 和 TypeScript,你可以以類型安全、可維護(hù)的方式構(gòu)建這樣的系統(tǒng),并且它能夠很好地與 Web 應(yīng)用生態(tài)系統(tǒng)集成。

關(guān)鍵要點

  • TypeScript + LlamaIndex為構(gòu)建 RAG 系統(tǒng)提供了堅實的基礎(chǔ)。
  • 嵌入文件的持久化存儲提高了重復(fù)查詢的效率。
  • Agentic 方法根據(jù)查詢內(nèi)容實現(xiàn)更智能的工具選擇。
  • 本地模型執(zhí)行提供了隱私和成本優(yōu)勢。
  • 專業(yè)工具可以針對不同領(lǐng)域的知識進(jìn)行處理。
  • Agentic RAG Using LlamaIndex TypeScript通過啟用智能、動態(tài)的響應(yīng),增強(qiáng)了檢索增強(qiáng)型生成。

常見問題解答

Q1:如何擴(kuò)展這個系統(tǒng)以處理多個文檔源?

A1:你可以修改索引函數(shù),從多個文件或數(shù)據(jù)源加載文檔,并將一個文檔對象數(shù)組傳遞給 ??VectorStoreIndex?? 方法。

Q2:這種方法是否支持其他 LLM 提供商,而不僅僅是 Ollama?

A2:是的!LlamaIndex 支持多種 LLM 提供商,包括 OpenAI、Antropic 等。你可以將 Ollama 設(shè)置替換為任何支持的提供商。

Q3:如何提高特定領(lǐng)域問題的響應(yīng)質(zhì)量?

A3:可以考慮在特定領(lǐng)域數(shù)據(jù)上微調(diào)你的嵌入模型,或者實現(xiàn)自定義檢索策略,根據(jù)你的具體用例優(yōu)先檢索某些文檔部分。

Q4:直接查詢和使用代理方法有什么區(qū)別?

A4:直接查詢只是檢索相關(guān)內(nèi)容并生成響應(yīng),而代理方法首先決定哪個工具最適合查詢,可能會結(jié)合多個來源的信息,或者為不同類型的查詢使用專門的處理。

希望這篇文章能幫助你更好地理解和使用 TypeScript 和 LlamaIndex 構(gòu)建智能應(yīng)用!


本文轉(zhuǎn)載自公眾號Halo咯咯    作者:基咯咯

原文鏈接:??https://mp.weixin.qq.com/s/tOSntLc37ffZlvhoBrWmJg??


?著作權(quán)歸作者所有,如需轉(zhuǎn)載,請注明出處,否則將追究法律責(zé)任
收藏
回復(fù)
舉報
回復(fù)
相關(guān)推薦