对比

对比维度及优缺点分析

对比维度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 命令时,都遇到过这样的困扰:输入密码时光标一动不动,屏幕上没有任何提示(没有星号 *,也没有任何字符)?就像在黑暗中摸索钥匙孔一样,心里…