【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.pswp.cn/bicheng/78657.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78657.shtml
英文地址,請注明出處:http://en.pswp.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; 物…