Langchain和Faiss搭建本地知識庫對比

對比

對比維度及優缺點分析

對比維度LangChain(封裝 FAISS)直接使用 FAISS
易用性? 高,提供高級封裝,簡化開發流程? 中等,需要熟悉 FAISS API
學習成本? 低,適合快速開發? 高,需要掌握 FAISS 的索引類型、添加/查詢流程等
集成能力? 強,天然支持 LLM、Prompt、Chain 等模塊? 弱,需手動集成 LLM 相關邏輯
封裝程度? 高,隱藏底層實現細節? 低,需自己管理索引、內存、數據結構等
靈活性? 有限,依賴 LangChain 提供的封裝接口? 高,可完全控制 FAISS 行為
性能優化? 一般,封裝可能帶來額外開銷? 高,可針對特定場景進行優化
持久化支持? 有,LangChain 提供了 save_local / load_local 方法? 有,FAISS 也支持保存和加載索引文件
索引類型支持? 有限(通常使用 IndexFlatL2)? 豐富(支持 IndexFlatL2、IVFPQ、HNSW 等)
擴展性? 高,可輕松對接其他向量數據庫(如 Pinecone、Chroma)? 低,需手動切換數據庫
部署難度? 低,適合本地開發、小項目? 中等,適合中大型項目或生產環境優化
調試與維護? 簡單,封裝好日志、錯誤提示? 復雜,需自行處理底層錯誤、內存問題等

典型使用場景對比

使用場景推薦方式說明
快速搭建一個本地向量數據庫? LangChain + FAISS適合開發、測試、教學
需要高性能、大規模向量檢索? 直接使用 FAISS可選擇 IVFPQ、HNSW 等高效索引
與 LLM、Prompt、Chain 結合使用? LangChainLangChain 提供了統一接口,方便構建完整流程
需要切換向量數據庫(如從 FAISS 切換到 Pinecone)? LangChain封裝抽象,只需改配置
需要深度優化索引性能? 直接使用 FAISS可靈活配置索引類型、量化方式等
生產環境部署? LangChain + FAISS(簡單場景)
? 直接使用 FAISS(復雜場景)
根據規模和性能需求選擇

本地搭建embedding模型(Qwen3-Embedding-0.6B)

本文向量提取均使用本地embedding模型

vllm下載

conda create -n myenv python=3.12 -y
conda activate myenv
pip install --upgrade uv
uv pip install vllm --torch-backend=auto -i https://pypi.tuna.tsinghua.edu.cn/simple

下載模型

pip install modelscope
mkdir models
modelscope download --model Qwen/Qwen3-Embedding-0.6B --local_dir /models/Qwen3-Embedding-8B
modelscope download --model Qwen/Qwen3-Embedding-0.6B --local_dir /models/Qwen3-Reranker-8B

啟動命令

vllm serve Qwen/Qwen3-Embedding-0.6B

本地接口測試

curl --location 'http://localhost:8000/v1/embeddings' \
--header 'Content-Type: application/json' \
--data '{"input": "Follow the white rabbit.","model": "Qwen/Qwen3-Embedding-0.6B","encoding_format": "float"}'

在這里插入圖片描述

自封裝本地embedding模型

class LocalEmbeddings(Embeddings):def __init__(self, api_url: str = "http://localhost:8000/v1/embeddings"):self.api_url = api_urldef embed_documents(self, texts: List[str]) -> List[List[float]]:payload = {"input": texts,"model": "Qwen/Qwen3-Embedding-0.6B",  # 替換為你實際使用的模型名"encoding_format": "float"}response = requests.post(self.api_url, json=payload)if response.status_code != 200:raise Exception(f"API request failed with status code {response.status_code}: {response.text}")result = [item["embedding"] for item in response.json()["data"]]return resultdef embed_query(self, text: str) -> List[float]:return self.embed_documents([text])[0]

Langchain實現

安裝faiss(https://github.com/facebookresearch/faiss/blob/main/INSTALL.md)

conda install -c pytorch faiss-cpu=1.11.0

進行向量存儲和檢索

from langchain.embeddings.base import Embeddings
import requests
from typing import List
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain_text_splitters import RecursiveCharacterTextSplitter# 初始化本地 embeddings
embeddings = LocalEmbeddings()# 示例文本
# texts = ["這是一個測試句子", "這是另一個測試句子"]
#
# # 使用 embeddings 構建向量數據庫
# vectorstore = FAISS.from_texts(texts=texts, embedding=embeddings)# 加載本地文檔,并進行切分
raw_documents = TextLoader('xxx.txt').load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
documents = text_splitter.split_documents(raw_documents)
print(len(documents))# 對切分后的文檔進行提取特征和入庫向量庫
db = FAISS.from_documents(documents, embedding=embeddings)# 查詢相似文本
query = "測試句子"
docs = db.similarity_search(query, 4)
print(docs)

在這里插入圖片描述

langchain調用qwen文章參考:https://qwen.readthedocs.io/zh-cn/latest/framework/Langchain.html

Faiss實現

直接上代碼

import faiss
from langchain.embeddings.base import Embeddings
import requests
from typing import Listdef read_and_split_file(filepath, chunk_size=500):with open(filepath, 'r', encoding='utf-8') as file:data = file.read()# Split the text into chunks of 500 characters.chunks = [data[i:i + chunk_size] for i in range(0, len(data), chunk_size)]return chunks# 初始化本地 embeddings
embeddings = LocalEmbeddings()index = faiss.index_factory(1024, "Flat")chunks = read_and_split_file('/Users/admin/Downloads/error.log')
print(len(chunks))
vectors = embeddings.embed_documents(chunks)
print(vectors)# 轉成 numpy array,并確保是 float32 類型(Faiss 默認要求)
vectors_np = np.array(vectors).astype("float32")index.add(vectors_np)# 查詢相似文本
query = "測試句子"
query_vector = embeddings.embed_query(query)
# 同樣要轉成 numpy array 并 reshape 成 (1, d)
query_vector_np = np.array([query_vector]).astype("float32")
D, I = index.search(query_vector_np, 4)
print("Top 4 最相似的向量索引:", I)
print("對應的距離:", D)

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89319.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89319.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89319.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java常用命令匯總

JDK 工具命令jps(Java Virtual Machine Process Status Tool)命令示例:jps -l 應用場景:列出當前系統中所有Java進程的PID和主類名,常用于快速定位Java應用的進程ID。javac(Java Compiler)命令示…

Llama 2:開放基礎模型與微調聊天模型

溫馨提示: 本篇文章已同步至"AI專題精講" Llama 2:開放基礎模型與微調聊天模型 摘要 在本研究中,我們開發并發布了 Llama 2,一組預訓練和微調的大型語言模型(LLMs),其規模從 70 億參…

ThinkPHP 8 在 Apache 下啟用偽靜態

ThinkPHP 8 在 Apache 下啟用偽靜態,需要配置 .htaccess 文件并確保 Apache 支持 URL 重寫。以下是詳細設置步驟:1. 啟用 Apache 重寫模塊首先確保 Apache 的 mod_rewrite 模塊已啟用。編輯 Apache 配置文件(通常是 /etc/apache2/apache2.con…

Android開發中Retrofit使用方法與底層原理詳解

Retrofit 是 Android 開發中一個 類型安全、基于注解、高度解耦 的 RESTful HTTP 客戶端庫,由 Square 公司開發。它極大地簡化了 Android 應用與 Web 服務進行網絡交互的過程。 核心價值: 聲明式 API 定義: 使用 Java/Kotlin 接口和注解描述 …

基于FPGA的IIC控制EEPROM讀寫(2)

基于FPGA的IIC控制EEPROM讀寫 文章目錄基于FPGA的IIC控制EEPROM讀寫一、EEPROM簡介二、代碼實現——個人理解1、狀態機2、仿真效果3、上板驗證4、代碼top.viic_master.vuart三、代碼實現——復用性較高的IIC模塊1、框架設計2、狀態機設計3、仿真效果4、上板驗證5、代碼top.viic…

C# 界面程序在23H2型號系統中無法退出

20250716記錄 環境:c# winform問題描述:主界面退出直接使用了Environment.Exit(0); 程序假死,無法關閉解決措施://使用 this.Close();以下代碼目標:執行完程序自身后,刪除指定文件(可用于程序文…

Kafka——集群核心參數配置

引言在分布式系統中,Kafka 憑借其高吞吐量、低延遲和強大的擴展性,成為數據管道和流處理的首選解決方案。然而,要充分發揮 Kafka 的性能和穩定性,正確配置集群參數至關重要。為什么參數配置如此重要?Kafka 的參數配置直…

單臂路由實現VLAN互通實驗

實驗拓撲圖實驗需求:按照圖示為 PC3 和 PC4 配置 IP 地址和網關PC3 屬于 Vlan10,PC4 屬于 Vlan20,配置單臂路由實現 Vlan10 和 Vlan20 三層互通PC3 和 PC4 可以互通實驗步驟:1.PC 配置 IP 地址2.PC3 屬于 Vlan10,PC4 屬…

基于漸進式遷移學習網絡(PTLN)?的小樣本故障診斷模型

目錄 一、研究背景與挑戰? ?二、創新方法:漸進式遷移學習網絡(PTLN)?? ?1. 核心架構?編輯 ?2. 訓練優化? 三、核心代碼 四、實驗結果與優勢? ?1. 數據集? ?2. 性能對比? ?3. 關鍵驗證? 五、工程價值與未來方向? 六、補充信息? 一、研究背景與挑…

網絡原理 —— HTTP

通過網絡初識,我們認識了網絡的協議棧,TCP/IP 分為五層:應用層,傳輸層,網絡層,數據鏈路層,物理層。也介紹了其中的關鍵協議。而這些協議的理解,是我們寫網絡代碼的基礎。 應用層&…

docker--安裝--原理

安裝 鏈接 啟動之后,docker狀態查看: sudo systemctl status docker 添加普通用戶到docker用戶組: sudo usermod -aG docker $USER# 重啟或者使用以下命令刷新組權限:newgrp docker 原理

Java并發第一篇(從零開始:一文讀懂Java并發編程核心基礎)

從零開始:一文讀懂Java并發編程核心基礎一. 為什么需要并發編程?二. 并發編程的“另一面”:挑戰與代價2.1 頻繁的上下文切換2.2 線程安全問題(如:死鎖)三. 夯實基礎:必須掌握的核心概念與操作3.…

【刪庫跑路】一次刪除pip的所有第三方庫

進入命令行,先list看下庫存pip list導出所有的第三方庫至一文件列表pip freeze >requirements.txt按照列表卸載所有庫pip uninstall -r requirements.txt -y再list看下,可見庫存已清空

python 【技術面試題和HR面試題】?列表操作、條件判斷、循環、函數定義編程題

1.技術面試題 (1)解釋Linux中的進程、線程和守護進程的概念,以及如何管理它們? 答: 進程 概念:程序運行的實例,有獨立資源(如內存),是系統調度的基本單位。 管…

Debian 12中利用dpkg命令安裝MariaDB 11.8.2

MariaDB 11.8解決了2038問題,即在32位系統中將timestamp從2038-01-19 03:14:07 UTC擴展到2106-02-07 06:28:15 UTC,向后延長了68年。由于寫此文時Debian 12的源中還沒有MariaDB 11.8,采用源碼編譯又太費時,可用二進制碼或dpkg安裝 .下面簡要記…

Go語言高并發聊天室(三):性能優化與壓力測試

Go語言高并發聊天室(三):性能優化與壓力測試 🎯 本篇目標 在前兩篇文章中,我們完成了聊天室的基礎功能。本篇將深入性能優化,實現真正的高并發: 🔍 性能瓶頸分析? 關鍵優化技術&…

【leetcode】852. 山脈數組的封頂索引

文章目錄題目題解1. 遍歷2. 二分查找題目 852. 山脈數組的封頂索引 給定一個長度為 n 的整數 山脈 數組 arr ,其中的值遞增到一個 峰值元素 然后遞減。 返回峰值元素的下標。 你必須設計并實現時間復雜度為 O(log(n)) 的解決方案。 示例 1: 輸入&a…

Java期末考試準備

文章目錄Java期末考試準備一、Java的輸入.next()輸入.nextLine()輸入區別補充二、Java的輸出三、類中常寫方法toString()equals()其他四、容器/數組五、繼承六、靜態屬性、方法.七、抽象類八、接口九、初始化模塊十、泛型考完結束語Java學習歷程注:這篇文章本來是寫給同學的&am…

飛算JavaAI進階:重塑Java開發范式的AI革命

引言:當代碼生成進入"自動駕駛"時代 在2025年的Java開發領域,一場由AI驅動的革命正在重塑傳統開發范式。當GitHub Copilot還在通過代碼補全提升效率時,飛算JavaAI已實現從需求分析到完整工程代碼生成的"端到端"閉環。這款…

如何在銀河麒麟桌面系統中啟用 sudo 密碼的星號反饋

引文 我們在銀河麒麟桌面操作系統上使用 sudo 命令時,都遇到過這樣的困擾:輸入密碼時光標一動不動,屏幕上沒有任何提示(沒有星號 *,也沒有任何字符)?就像在黑暗中摸索鑰匙孔一樣,心里…