【LLM应用开发101】初探RAG

本文是LLM应用开发101系列的先导篇,旨在帮助读者快速了解LLM应用开发中需要用到的一些基础知识和工具/组件。

本文将包括以下内容:首先会介绍LLM应用最常见的搜索增强生成RAG,然后引出实现RAG的一个关键组件 – 向量数据库,随后我们是我们这篇博客的重点,一个非常有效的轻量级向量数据库实现ChromaDB.

概述

大语言模型(LLMs)的应用开发可以被视为一种实现人工智能(AI)和自然语言处理(NLP)技术的方式。这种类型的模型,比如GPT-3或GPT-4(但其实一些不那么大的模型例如BERT及其变种, 在很多应用中也非常有用),能够生成与人类语言类似的文本,使其在各种应用上具有广泛的可能性。

以下是一些大语言模型应用开发的主要应用领域:

  1. 内容生成与编辑:语言模型可以生成文章、报告、电子邮件等,也可以提供写作建议和修改。

  2. 问答系统:大语言模型可以被用来创建自动问答系统,能够理解并回答用户的问题(BERT应用中有一种Question Answer和我们直觉的问答系统有点不一样,是从给出的文本中找答案)。

  3. 对话系统与聊天机器人:大语言模型可以生成连贯且自然的对话,使其在创建聊天机器人或虚拟助手方面具有潜力。

  4. 机器翻译:虽然这些模型通常不专为翻译设计,但它们可以理解并生成多种语言,从而能够进行一定程度的翻译。

  5. 编程助手:语言模型可以理解编程语言,并提供编程帮助,比如代码生成、代码审查、错误检测等。

  6. 教育:语言模型可以被用于创建个性化的学习工具,如自动化的作业帮助或在线教育平台。

在开发这些应用时,开发者需要注意模型可能存在的限制,比如误解用户的输入、生成不准确或不可靠的信息、可能出现的偏见等等。这就需要开发者在应用设计和实现时进行适当的控制和优化。

那么在什么情况下需要RAG呢?

RAG模型在以下几种情况下可能特别有用:

  1. 需要大量背景知识的任务:比如在问答系统中,如果问题需要引用大量的背景知识或者事实来回答,那么RAG模型可能是一个很好的选择。RAG模型可以从大规模的知识库中检索相关信息,然后生成回答。

  2. 需要复杂推理的任务:在一些需要理解和推理复杂关系的任务中,比如多跳问答或者复杂的对话生成,RAG模型也可能表现得比纯生成模型更好。因为RAG模型可以利用检索到的文本来帮助生成模型进行推理。

  3. 需要从长文本中提取信息的任务:在一些需要从长文本中提取信息的任务中,比如文档摘要或者长文本阅读理解,RAG模型也有很大的潜力。因为RAG模型可以先检索到相关的文本片段,然后再生成答案,避免了生成模型处理长文本的困难。

总的来说,RAG模型在需要大量背景知识、复杂推理或者长文本信息提取的任务中可能有很大的优势。下面我们介绍一下RAG

RAG

RAG,全称为Retrieval-Augmented Generation,是一种结合了检索和生成的深度学习模型。它首先使用一个检索模型从一个大规模的知识库中找出和输入相关的文档或者文本片段,然后将这些检索到的文本和原始输入一起输入到一个生成模型中。生成模型使用这些信息来生成响应。这种结合检索和生成的方式使得RAG模型可以更好地处理需要大量背景知识或者具有复杂推理需求的问题。

RAG模型的一个关键优点是它可以从非结构化的大规模文本数据中提取知识,而不需要预先构建一个结构化的知识图谱。这使得RAG模型在许多NLP任务,如问答、对话生成等,都有出色的表现。

下图展现了LLMsRAG是如何协作的:

LLMs and RAG

从图中我们可以看到,RAG的关键步骤,就是要能够Search Relevant Information, 而向量数据库,就是一个非常好的实现途径. 下面介绍一个非常优秀的实现, ChromaDB.

向量数据库ChromaDB

在这里插入图片描述

ChromaDB 是一个轻量级、易用的向量数据库,主要用于 AI 和机器学习场景。

它的主要功能是存储和查询通过嵌入(embedding)算法从文本、图像等数据转换而来的向量数据。ChromaDB 的设计目标是简化大模型应用的构建过程,允许开发者轻松地将知识、事实和技能等文档整合进大型语言模型中。

ChromaDB 的开源地址是: https://github.com/chroma-core/chroma

ChromaDB 支持大多数的主流编程语言,如Python, Javascript,Java, Go等,当前具体支持情况可以看下表,本文主要介绍Python环境下的使用.

编程语言客户端
Python✅ chromadb (by Chroma)
Javascript✅ chromadb (by Chroma)
Ruby✅ from @mariochavez
Java✅ from @t_azarov
Go✅ from @t_azarov
C#✅ from @microsoft
Rust✅ from @Anush008
Elixir✅ from @3zcurdia
Dart✅ from @davidmigloz
PHP✅ from @CodeWithKyrian
PHP (Laravel)✅ from @HelgeSverre

安装

在python环境下,安装非常简单,只需要用pip 就可以完成,如果遇到网络速度问题,可以选择替换pip mirror, 如果担心环境中各种包的干扰,可以用Annaconda创建一个全新的env.


pip install chromadb

顺便介绍一下nodejs 环境下的安装,也非常容易


## yarnyarn install chromadb chromadb-default-embed## npmnpm install --save chromadb chromadb-default-embed

编程交互

在开始用代码和chromadb交互前,我们还有一个问题需要理清:向量数据库存储的是向量,而RAG需要的是文本来做增强生成,那么显然,我们需要有一个机制来实现文本和向量之间的转换。这个转换过程就是我们常说的文本嵌入(Text Embedding)。在ChromaDB中,这个过程是自动完成的,它内置了多种嵌入模型供我们选择。

为了演示过程,我们先创建一个collection

collection = chroma_client.create_collection(name="my_collection")

添加一些数据

collection.add(documents=["This is a document about pineapple","This is a document about oranges"],ids=["id1", "id2"]
)

这里是为了简单起见用的非常短的测试文本,在实际应用中,就是从文档中切分出的某一段文字了。文档显示,Chroma使用all-MiniLM-L6-v2作为默认的embedding模型(第一次进行embedding时,可以看到下载模型的输出\.cache\chroma\onnx_models\all-MiniLM-L6-v2\onnx.tar.gz). 这个模型参数量适中且经过充分训练,在模型上加上分类头进行classification任务也能取得很好的效果。

接下来进行一次query

results = collection.query(query_texts=["This is a query document about hawaii"], n_results=2 # 设置返回文档数量,默认是10
)
print(results)

可以看到输出的结果

{'ids': [['id1', 'id2']],'embeddings': None,'documents': [['This is a document about pineapple','This is a document about oranges']],'uris': None,'included': ['metadatas', 'documents', 'distances'],'data': None,'metadatas': [[None, None]],'distances': [[1.0404009819030762, 1.2430799007415771]]}

完整例子

import re
import ollama
import chromadb
from chromadb.config import Settings
from concurrent.futures import ThreadPoolExecutor# 1. 文档加载与文本切分(这里以纯文本为例,实际可用PyMuPDF等库加载PDF)
def split_text(text, chunk_size=500, chunk_overlap=100):chunks = []start = 0length = len(text)while start < length:end = min(start + chunk_size, length)chunk = text[start:end]chunks.append(chunk)start += chunk_size - chunk_overlapreturn chunks# 2. 初始化Ollama Embeddings(DeepSeek-R1)
class OllamaDeepSeekEmbeddings:def __init__(self, model="deepseek-r1:14b"):self.model = modelself.client = ollama.Ollama()def embed_query(self, text):# 通过 Ollama API 调用 DeepSeek-R1 生成文本向量# Ollama Python SDK具体接口可能不同,以下为示例response = self.client.embeddings(model=self.model, input=text)return response['embedding']# 3. 初始化Chroma客户端和向量库
def init_chroma_collection(collection_name="rag_collection"):client = chromadb.Client(Settings(chroma_db_impl="duckdb+parquet",persist_directory="./chroma_db"))collection = client.get_or_create_collection(name=collection_name)return client, collection# 4. 构建向量数据库:将文本切分后生成embedding并存入Chroma
def build_vector_store(text, embedding_model, collection):chunks = split_text(text)# 并行生成向量def embed_chunk(chunk):return embedding_model.embed_query(chunk)with ThreadPoolExecutor() as executor:embeddings = list(executor.map(embed_chunk, chunks))# 插入Chromaids = [f"chunk_{i}" for i in range(len(chunks))]metadatas = [{"text": chunk} for chunk in chunks]collection.add(documents=chunks,embeddings=embeddings,metadatas=metadatas,ids=ids)collection.persist()# 5. 检索相关文本
def retrieve_relevant_docs(query, embedding_model, collection, top_k=3):query_embedding = embedding_model.embed_query(query)results = collection.query(query_embeddings=[query_embedding],n_results=top_k,include=["documents", "metadatas"])# 返回文本块列表return results['documents'][0]# 6. 结合上下文调用DeepSeek-R1生成回答
def generate_answer(question, context, model="deepseek-r1:14b"):client = ollama.Ollama()prompt = f"Question: {question}\n\nContext: {context}\n\nAnswer:"response = client.chat(model=model,messages=[{"role": "user", "content": prompt}])answer = response['message']['content']# 清理DeepSeek可能的特殊标记answer = re.sub(r'<think>.*?</think>', '', answer, flags=re.DOTALL).strip()return answer# 7. RAG整体调用示例
if __name__ == "__main__":# 假设有一个大文本知识库knowledge_text = """这里放入你的知识库文本,比如从PDF提取的内容。"""# 初始化embedding模型和Chromaembedding_model = OllamaDeepSeekEmbeddings(model="deepseek-r1:14b")client, collection = init_chroma_collection()# 构建向量数据库(首次运行)build_vector_store(knowledge_text, embedding_model, collection)# 用户提问user_question = "什么是深度学习?"# 检索相关上下文relevant_chunks = retrieve_relevant_docs(user_question, embedding_model, collection, top_k=3)combined_context = "\n\n".join(relevant_chunks)# 生成回答answer = generate_answer(user_question, combined_context)print("回答:", answer)

总结

本文介绍了RAG的原理并给出代码示例,相信能够帮助读者快速熟悉RAG并上手开发应用.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/78657.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

努比亚Z70S Ultra 摄影师版将于4月28日发布,首发【光影大师990】传感器

4月22日消息&#xff0c;努比亚将在4月28日14:00召开努比亚AI双旗舰新品发布会&#xff0c;预计发布努比亚Z70S Ultra 摄影师版和努比亚首款平板产品。据悉&#xff0c;努比亚Z70S Ultra 摄影师版将搭载第七代真全面无孔屏、第五代原生35mm高定光学、6600mAh电池&#xff0c;可…

DAY7-C++进阶学习

模板 学习链接1&#xff1a;C模板入门学习 学习链接2&#xff1a;C模板进阶学习 STL的重要实现原理&#xff0c;模板的声明和定义建议放到一个文件 xxx.hpp 里面或者 xxx.h&#xff0c;防止编译错误。 函数模板特化 1.基础模板 2.template<> 3.函数名<特化类型>…

redis_Windows中安装redis

①Windows安装包下载地址&#xff1a;https://github.com/tporadowski/redis/releases 当前最新版本截图 ②根据自己系统平台的实际情况选择对应的安装包&#xff0c;如&#xff1a;64位win10系统可选择Redis-x64-5.0.14.msi ③下载完成后运行安装&#xff0c;没有特殊要求的话…

Windows 安装 MongoDB 教程

Windows 安装 MongoDB 教程 MongoDB 是一个开源的 NoSQL 数据库&#xff0c;它使用文档存储模型而不是传统的关系表格。它非常适合需要处理大量数据并且需要高性能、可扩展性的应用场景。下面是如何在 Windows 系统上安装 MongoDB 的详细步骤。 一、准备工作 确保你的 Windo…

Vue Router 核心指南:构建高效单页应用的导航艺术

Vue Router 是 Vue.js 官方路由管理器&#xff0c;为单页应用&#xff08;SPA&#xff09;提供了无缝的页面切换体验。本文将深入解析其核心功能与最佳实践。 一、基础配置 1. 安装与初始化 npm install vue-router // router/index.js import Vue from vue import Router …

基础学习:(9)vit -- vision transformer 和其变体调研

文章目录 前言1 vit 热点统计1.1 目标分类 / 基础与改进1.2 轻量化 ViT / 移动部署优化(移动端)1.3 密集预测&#xff08;语义分割 / 深度估计等&#xff09;1.4 目标/词汇 检测1.5 掩码改进1.6 多模态/ 通用大模型1.7 分布式训练 / 效果提升1.8 任务特化应用&#xff08;图表 …

同样开源的自动化工作流工具n8n和Dify对比

n8n和Dify作为两大主流工具&#xff0c;分别专注于通用自动化和AI应用开发领域&#xff0c;选择哪个更“好用”需结合具体需求、团队能力及业务场景综合判断。以下是核心维度的对比分析&#xff1a; 一、核心定位与适用场景 维度n8nDify核心定位开源全场景自动化工具&#xff…

网页设计规范:从布局到交互的全方位指南

网页设计规范看似繁杂&#xff0c;但其实都是为了给用户提供更好的体验。只有遵循这些规范&#xff0c;才能设计出既美观又实用的网页&#xff0c;让用户在浏览网页时感到舒适、愉悦。 一、用户体验至上 用户体验&#xff08;UX&#xff09;是网页设计的核心原则之一。设计师…

图神经网络(GNN)基本概念与核心原理

图神经网络(GNN)基本概念与核心原理 图神经网络(GNN)是一类专门处理图结构数据的神经网络模型 (GTAT: empowering graph neural networks with cross attention | Scientific Reports)。图结构数据由节点(表示实体)和边(表示实体间关系)构成,每个节点和边都可以带有特…

【双指针】专题:LeetCode 18题解——四数之和

四数之和 一、题目链接二、题目三、题目解析四、算法原理解法一&#xff1a;排序 暴力枚举 利用 set 去重解法二&#xff1a;排序 双指针 五、编写代码六、时间复杂度和空间复杂度 一、题目链接 四数之和 二、题目 三、题目解析 题目要求基本与三数之和一样。 四、算法原…

3.0/Q2,Charls最新文章解读

diseases and depressive symptoms comorbidity on the risk of cognitive impairment in middle-aged and older adults people based on the CHARLS database DOI&#xff1a;10.3389/fpubh.2025.1558430 中文标题&#xff1a;基于CHARLS数据库的慢性病与抑郁症状共病对中老年…

学习笔记—双指针算法—移动零

双指针算法 移动零 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进…

组件的基本知识

组件 组件的基本知识 组件概念组成步骤好处全局注册生命周期scoped原理 父子通信步骤子传父 概念 就是将要复用的标签&#xff0c;抽离放在一个独立的vue文件中&#xff0c;以供主vue文件使用 组成 三部分构成 template&#xff1a;HTML 结构 script: JS 逻辑 style: CSS 样…

将视频生成视频二维码步骤

如何将视频链接生成二维码 生成与视频关联的二维码通常涉及以下几个方面&#xff1a;选择合适的库或工具、准备视频链接以及将其转换为二维码图像。以下是详细的说明&#xff1a; 使用JavaScript/Vue框架生成二维码 在前端开发中&#xff0c;可以使用 qrcode 或者 vue-qrcod…

关系型数据库PostgreSQL for Mac 保姆级使用教程

第一部分&#xff1a;安装PostgreSQL 方法一&#xff1a;使用Postgres.app&#xff08;最简单&#xff09; 访问 Postgres.app官网 下载最新版本&#xff0c;将 Postgres.app 移动到 “Applications” 文件夹。 双击Postgres.app打开应用&#xff0c;点击"Initialize&q…

Redis超详细入门教程(基础篇)

一&#xff1a;Redis 简介 &#xff08;1&#xff09;Mysql: 将数据通过数据文件存在磁盘上 通过二维表存储数据 &#xff08;2&#xff09;Redis 定义&#xff1a; 优点&#xff1a; 热点数据&#xff1a;短时间内有大量用户访问 二&#xff1a;Redis下载与安装 Windows系统安…

【JS-Leetcode】2621睡眠函数|2629复合函数|2665计数器||

文章目录 2621睡眠函数2629复合函数2665计数器|| 这三个题目涉及setTimeout、promise、数组reduce方法&#xff0c;闭包。 2621睡眠函数 请你编写一个异步函数&#xff0c;它接收一个正整数参数 millis &#xff0c;并休眠 millis 毫秒。要求此函数可以解析任何值。 原理&am…

重塑编程体验边界:明基RD280U显示器深度体验

重塑编程体验边界&#xff1a;明基RD280U显示器深度体验 写在前面 本文将以明基RD280U为核心&#xff0c;通过技术解析、实战体验与创新案例&#xff0c;揭示专业显示器如何重构开发者的数字工作台。 前言&#xff1a;当像素成为生产力的催化剂 在GitHub的年度开发者调查中&…

如何通过挖掘需求、SEO优化及流量变现成功出海?探索互联网产品的盈利之道

挖掘需求&#xff0c;优化流量&#xff0c;实现变现&#xff1a;互联网出海产品的成功之路 在当今全球化的数字时代&#xff0c;越来越多的企业和个人选择将业务扩展到国际市场。这一趋势不仅为企业带来了新的增长机会&#xff0c;也为个人提供了通过互联网产品实现盈利的途径…

cuda学习2:cuda编程基本概念

CUDA基本概念 主机&#xff08;host&#xff09; 通常将起控制作用的CPU称为主机&#xff08;host&#xff09; 设备&#xff08;device&#xff09; 将起加速作用的 GPU 称为设备&#xff08;device&#xff09; 流处理器&#xff08;streaming processor&#xff09; 物…