成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

RAG系列:基于 DeepSeek + Chroma + LangChain 開發一個簡單 RAG 系統

人工智能
相信看過我之前文章的同學,已經了解了什么是 RAG 以及技術實現,也學會了如何本地搭建基于 Ollama、DeepSeek、Chroma、LangChain.js 和 Next.js 的全棧 AI 應用開發框架。本文我們基于這一套全棧 AI 應用開發框架開發一個簡單的 RAG 系統。

創建 Next 項目

首先,使用 npx create-next-app@latest 根據提示完成 Next 項目的創建:

# 創建 Next 項目
npx create-next-app@latest

創建好項目之后,在 src/app 目錄下新建 rag 目錄,本次 demo 的代碼都將放在這里。

知識庫構建

接下來,我們將構建知識庫,主要目標是將準備好的 pdf 通過向量化存到向量數據庫中,以便后續的檢索。

由于本次 RAG 系統的開發都要依賴 LangChain 框架,所以我們先在項目中安裝 LangChain 框架和核心依賴:

# LangChain 框架和核心依賴
npm install langchain @langchain/core

文檔加載

LangChain 的 DocumentLoaders[1] 提供了種類豐富的文檔加載器,可加載文件系統的文件也可以加載線上文件,包括 csv、docx、pdf、pptx、html、github、youtube等等。

現在我們使用 PDFLoader[2] 來實現 pdf 的數據加載。

先安裝所需的依賴包:

# @langchain/community:包含第三方集成,這些集成實現了 LangChain Core 中定義的基本接口,如:文檔加載、文檔嵌入、向量數據庫等等
# pdf-parse:讀取 pdf 文本
npm install @langchain/community pdf-parse

然后添加加載 pdf 的代碼:

import { PDFLoader } from '@langchain/community/document_loaders/fs/pdf';

const loader = new PDFLoader('public/example.pdf', { splitPages: false });
const docs = await loader.load();

文檔分割

加載完成后,由于加載的文檔可能過長,不適合模型的上下文窗口,需要將文檔分割成合適的大小。

LangChain 提供了 TextSplitter[3] 組件來實現文檔分割:

import { RecursiveCharacterTextSplitter } from 'langchain/text_splitter';

// chunkSize:分割文檔的長度
// chunkOverlap:分割文檔間的重疊長度
const textSplitter = new RecursiveCharacterTextSplitter({
    chunkSize: 1000,
    chunkOverlap: 200,
});
const texts = await textSplitter.splitDocuments(docs);

文檔向量嵌入

接下來我們需要對分割后的文本塊進行向量嵌入,然后使用 Chroma 向量數據庫存儲。

向量模型使用 ollama 安裝的 nomic-embed-text 模型,可用 ollama run nomic-embed-text進行下載和運行,完整的代碼如下:

import {
Chroma,
ChromaLibArgs,
} from'@langchain/community/vectorstores/chroma';
import { ChatOllama, OllamaEmbeddings } from'@langchain/ollama';
import { EmbeddingsInterface } from'@langchain/core/embeddings';

// 初始化 embeddings 函數
exportfunctioninitOllamaEmbeddings(model = 'nomic-embed-text') {
returnnewOllamaEmbeddings({ model });
}

// 初始化向量數據庫
exportfunctioninitChroma(
  embeddings: EmbeddingsInterface = initOllamaEmbeddings(),
  args: ChromaLibArgs = {
    collectionName: 'rag_collection',
    url: 'http://localhost:8000',
  }
) {
returnnewChroma(embeddings, args);
}

// 初始化向量數據庫
const chromadb = initChroma();
// 保存文本塊
const documents = await chromadb.addDocuments(texts);

到此就構建好了一個簡單的知識庫。

RAG 系統構建

在創建好知識庫之后,接下來就可以開始構建一個基礎的 RAG 系統。該系統包括檢索器與生成器兩部分,具體工作流程如下:對于用戶輸入的問題,檢索器先搜索與該問題相關的文檔,接著將檢索到的文檔與初始問題一起傳遞給生成器,即大語言模型,最后將模型生成的答案返回給用戶。

檢索器創建

我們先基于 VectorStoreRetriever 創建檢索器,利用向量相似度進行檢索。

// 初始化向量數據庫
  const chromadb = initChroma();
  // 創建檢索器
  const retriever = chromadb.asRetriever();

生成器創建

接下來我們創建生成器,這里我們使用 Ollama 安裝的 deepseek-r1:14b 大模型作為生成器。

import { ChatOllama } from '@langchain/ollama';

export function initOllamaLLM(model = 'deepseek-r1:14b') {
  return new ChatOllama({ model });
}

// 創建生成器(初始化大模型)
const ollamaLLM = initOllamaLLM()

然后再設置提示模版:

// 設置提示模版
  const prompt = PromptTemplate.fromTemplate(
    '你是負責回答問題的助手。使用以下檢索到的上下文片段來回答問題。如果你不知道答案,就說你不知道。\n\n上下文:{context}\n\n問題:{question}\n\n回答:'
  );

RAG 鏈生成答案

最后我們通過 RAG 鏈將檢索器和生成器整合在一起,這里可以使用 LangChain 表達式語言(LangChain Execution Language,LCEL)來方便快捷地構建一個鏈,將檢索到的文檔、構建的輸入 Prompt 以及模型的輸出組合起來。

// 使用 LCEL 構建 RAG 鏈
const ragChain = RunnableSequence.from([
    {
      context: retriever.pipe((docs) => {
        // 文檔列表使用 \n\n 拼接為字符串
        return docs.map((doc) => doc.pageContent).join('\n\n');
      }),
      question: newRunnablePassthrough(),
    },
    prompt,
    ollamaLLM,
    newStringOutputParser(),
  ]);

// 使用 RAG 鏈生成答案
const answer = await ragChain.invoke(question);

項目代碼

代碼:https://github.com/laixiangran/ai-learn

啟動項目之后在瀏覽器輸入 http://localhost:3000/rag 即可訪問該 RAG 系統,然后在輸入框輸入問題:互聯網的人才缺口有哪些

圖片

也可以通過訪問 http://localhost:3000/rag/generate?questinotallow=互聯網的人才缺口有哪些

圖片

通過以上步驟,我們就完成了一個基礎 RAG 系統的搭建,其中借助于 LangChain 提供了一系列強大的工具和組件,使得構建和整合檢索與生成過程變得簡單而高效。而借助 Ollama 我們也能夠在本地部署大語言模型和向量模型,這讓我們可以以較小的資源進行 AI 的開發學習實踐。

引用鏈接

[1] DocumentLoaders: https://js.langchain.com/docs/concepts/document_loaders

[2] PDFLoader: https://v03.api.js.langchain.com/classes/_langchain_community.document_loaders_fs_pdf.PDFLoader.html

[3] TextSplitter: https://js.langchain.com/docs/concepts/text_splitters

責任編輯:龐桂玉 來源: 燃哥講AI
相關推薦

2024-05-22 09:38:25

2025-05-22 02:00:00

AI人工智能前端

2024-06-24 14:32:33

2025-02-10 11:27:37

2025-05-26 09:57:46

2024-06-03 09:33:28

2024-09-02 08:17:53

RAG聊天機器人人工智能

2025-05-23 06:00:00

RAGAI人工智能

2024-02-05 14:12:37

大模型RAG架構

2024-12-06 09:58:09

2025-02-06 13:50:06

2025-02-14 00:00:35

2025-02-06 08:26:21

2025-06-10 04:30:00

2025-05-22 06:23:48

2024-03-26 00:00:07

2025-02-24 08:39:08

2025-02-03 00:00:55

DeepSeekRAG系統

2025-06-24 09:51:10

2025-02-17 03:00:00

RAG開源DeepSeek
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久中文字幕在线 | 一级高清免费毛片 | 午夜视频在线 | 久久国产精品无码网站 | 成人国产毛片 | 亚洲区一区二 | 国产在线区 | 免费观看的av毛片的网站 | 可以免费看的毛片 | 91在线精品一区二区 | 亚洲欧美日韩国产综合 | 免费看日韩视频 | 亚洲精品美女视频 | 午夜免费在线电影 | 免费一级淫片aaa片毛片a级 | 一级片片 | 国产97色| 日韩亚洲视频 | 第一福利社区1024 | 日韩在线xx | 欧美日韩中 | 久久精品亚洲精品国产欧美 | 日韩国产一区二区三区 | 国产精品久久久久一区二区三区 | 国产一级视频 | 成人亚洲精品 | 一区二区福利视频 | 久久久999国产精品 中文字幕在线精品 | 亚洲视屏 | 精品电影 | 国产97久久 | 精品福利一区二区三区 | 欧美成视频 | 国产一在线观看 | 中文字幕一区二区三区在线观看 | 免费观看国产视频在线 | 久久久一区二区 | 久久不卡 | 99这里只有精品视频 | 欧美一区二区免费 | 羞羞在线观看视频 |