大模型实战;基于 DeepSeek + Chroma + LangChain 开发一个简单 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 系统,然后在输入框输入问题:互联网的人才缺口有哪些

img

也可以通过访问 http://localhost:3000/rag/generate?question=互联网的人才缺口有哪些

img

通过以上步骤,我们就完成了一个基础 RAG 系统的搭建,其中借助于 LangChain 提供了一系列强大的工具和组件,使得构建和整合检索与生成过程变得简单而高效。而借助 Ollama 我们也能够在本地部署大语言模型和向量模型,这让我们可以以较小的资源进行 AI 的开发学习实践。

普通人如何抓住AI大模型的风口?

领取方式在文末

为什么要学习大模型?

目前AI大模型的技术岗位与能力培养随着人工智能技术的迅速发展和应用 , 大模型作为其中的重要组成部分 , 正逐渐成为推动人工智能发展的重要引擎 。大模型以其强大的数据处理和模式识别能力, 广泛应用于自然语言处理 、计算机视觉 、 智能推荐等领域 ,为各行各业带来了革命性的改变和机遇 。

目前,开源人工智能大模型已应用于医疗、政务、法律、汽车、娱乐、金融、互联网、教育、制造业、企业服务等多个场景,其中,应用于金融、企业服务、制造业和法律领域的大模型在本次调研中占比超过 30%。
在这里插入图片描述

随着AI大模型技术的迅速发展,相关岗位的需求也日益增加。大模型产业链催生了一批高薪新职业:

在这里插入图片描述

人工智能大潮已来,不加入就可能被淘汰。如果你是技术人,尤其是互联网从业者,现在就开始学习AI大模型技术,真的是给你的人生一个重要建议!

0基础如何入门大模型?

大模型目前在人工智能领域可以说正处于一种“炙手可热”的状态,吸引了很多人的关注和兴趣,也有很多新人小白想要学习入门大模型,那么,如何入门大模型呢?

下面给大家分享一份2025最新版的大模型学习路线,帮助新人小白更系统、更快速的学习大模型!

有需要完整版学习路线,可以微信扫描下方二维码,或点击下方链接免费领取!

**读者福利 |** 👉2024最新《AGI大模型学习资源包》免费分享 **(安全链接,放心点击)**
在这里插入图片描述

👉1.大模型入门学习思维导图👈

要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。

对于从来没有接触过AI大模型的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。(全套教程文末领取哈)

img

👉2.AGI大模型配套视频👈

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,每个章节都是当前板块的精华浓缩。

img

img

👉3.大模型实际应用报告合集👈

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(全套教程文末领取哈)

img

👉4.大模型落地应用案例PPT👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(全套教程文末领取哈)

img

👉5.大模型经典学习电子书👈

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。(全套教程文末领取哈)

img

img

👉6.大模型面试题&答案👈

截至目前大模型已经超过200个,在大模型纵横的时代,不仅大模型技术越来越卷,就连大模型相关的岗位和面试也开始越来越卷了。为了让大家更容易上车大模型算法赛道,我总结了大模型常考的面试题。(全套教程文末领取哈)

img

👉学会后的收获:👈基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习

这份完整版的 AI 大模型学习资料已经上传CSDN,朋友们如果需要可以点击下方链接免费领取 【保证100%免费】

在这里插入图片描述
**读者福利 |** 👉2024最新《AGI大模型学习资源包》免费分享 **(安全链接,放心点击)**

### 使用 LangChainDeepSeek 模型结合向量数据库进行本地化开发和部署 为了实现基于 LangChainDeepSeek 的本地化开发与部署,可以按照以下方法构建系统: #### 1. 安装必要的依赖项 在开始之前,确保已安装所需的库和工具。可以通过运行以下命令完成环境准备: ```bash pip install langchain deepspeed torch transformers streamlit chromadb tiktoken ``` 这一步为后续的开发和部署奠定了基础[^1]。 #### 2. 下载并加载 DeepSeek 模型 通过 `ollama` 工具下载指定版本的 DeepSeek 模型,并将其用于推理任务。例如: ```bash ollama pull deepseek-r1:1.5b ``` 此操作会拉取 DeepSeek-R1 模型的 1.5B 参数版本。随后,在 Python 脚本中初始化模型实例以便调用其生成能力。 #### 3. 处理文档数据 对于输入的知识源(如 PDF 文件或其他结构化/非结构化的文本),需先解析它们的内容并将之切分为适合传递给大语言模型的小片段。以下是具体代码示例: ```python from langchain.document_loaders import DirectoryLoader, TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter loader = DirectoryLoader('./data', glob="*.txt", loader_cls=TextLoader) documents = loader.load() text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=0) texts = text_splitter.split_documents(documents) ``` 上述脚本实现了从目录读取文件、加载内容到内存以及按固定长度切割的功能[^2]。 #### 4. 构建嵌入表示并向量化存储 接着要计算每一段文字对应的高维特征向量形式作为索引依据存放到专用的数据结构里——即所谓的“向量数据库”。这里推荐 ChromaDB 或 FAISS 来管理这些对象。 ```python from langchain.embeddings.openai import OpenAIEmbeddings from langchain.vectorstores import Chroma embeddings = OpenAIEmbeddings() # 可替换其他类型的 embedding provider vectorstore = Chroma.from_texts(texts=[t.page_content for t in texts], embeddings=embeddings) query_result = vectorstore.similarity_search(query="example question here", k=3) print([doc.metadata['source'] for doc in query_result]) ``` 以上展示了如何利用预训练好的 Embedding 函数把原始字符串映射至连续空间坐标系上;再经由相似度匹配找出最贴近提问意图的相关条目集合。 #### 5. 集成问答逻辑链路 最后定义好整个对话流程控制机制之后就可以正式对外提供服务了。下面给出了一种简单的实现方式供参考学习: ```python from langchain.chains.question_answering import load_qa_chain from langchain.llms import Ollama llm = Ollama(model="deepseek-r1:1.5b") qa_chain = load_qa_chain(llm=llm, chain_type="stuff") response = qa_chain.run(input_documents=query_result, question="What is the answer?") print(response) ``` 在这里我们选择了 stuffing 方法将检索出来的上下文拼接到一起送进 LLM 中去求解最终答案。 --- ### 总结 综上所述,借助 LangChain 提供的强大框架支持配合高性能算力驱动下的 DeepSeek 系列产品完全可以满足大多数场景下关于私有领域定制化需求方面的挑战。与此同时引入第三方插件还能进一步增强系统的灵活性与扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员一粟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值