1.FAISS与Langchain整合,搭配大模型实现本地知识库问答

ops/2025/1/1 5:30:30/

1.FAISS是什么?

FAISS向量数据库,是来自 Meta AI(原 Facebook Research)的开源项目,也是目前最流行的、效率比较高的相似度检索方案之一。

核心功能:

  • 相似性搜索:FAISS提供了多种算法来快速找到一个向量在大型数据集中的最近邻和近邻,这对于机器学习和数据挖掘任务非常有用。
  • 聚类功能:除了相似性搜索外,FAISS还支持向量的聚类操作。
  • 索引结构:FAISS支持多种索引结构,如HNSW(Hierarchical Navigable Small World)、IVF(Inverted Indexed Vector File)和PQ(ProductQuantization),这些结构可以针对不同的数据和查询需求进行优化。

LangChain有需要可以看看官网:
LangChain中文网:http://doc.cnlangchain.com/getting_started.html

2.开始代码实现

1.处理pdf文本

from PyPDF2 import PdfReader# 处理文件
class PdfEngine:# 初始化方法,用于创建对象时初始化属性def __init__(self, url):self.url = url# 获取pdf文件内容def get_pdf_text(self):text = ""pdf_reader = PdfReader(self.url)for page in pdf_reader.pages:text += page.extract_text()return text

2.进行文本保存和加载

我这里使用的 智普的embedding-2
faisst 是文件夹名字。通过 FAISS 保存到本地,后续就不需要再执行向量化,直接读取即可

from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import ZhipuAIEmbeddingsclass FaissEngine:# 保存def save_vector_store(self,textChunks):embeddings = ZhipuAIEmbeddings(model="embedding-2",api_key="")print(embeddings)db = FAISS.from_texts(textChunks, embeddings)db.save_local('faisst')# 加载def load_vector_store(self):embeddings = ZhipuAIEmbeddings(model="embedding-2",api_key="")return FAISS.load_local('faisst', embeddings,allow_dangerous_deserialization=True)

3.配置文本处理与大模型交互

大模型交互 我使用的是 阿里的千问

from langchain.chains.conversational_retrieval.base import ConversationalRetrievalChain
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplateclass LlmEngine():# 拆分文本 RecursiveCharacterTextSplitterdef get_text_chunks(self,text):text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000,# chunk_size=768,chunk_overlap=200,length_function=len)chunks = text_splitter.split_text(text)return chunks# 获取检索型问答链def get_qa_chain(self,vector_store):prompt_template = """基于以下已知内容,简洁和专业的来回答用户的问题。如果无法从中得到答案,选择默认信息答案请使用中文,格式整洁好看一些。已知内容:{context}问题:{question}"""prompt = PromptTemplate(template=prompt_template,input_variables=["context", "question"])chat = ChatOpenAI(model="qwen-plus",temperature=0.3,max_tokens=200,api_key="",base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",)return RetrievalQA.from_llm(llm=chat, retriever=vector_store.as_retriever(),prompt=prompt)def get_qa_chain_history(self, vector_store):prompt_template = """基于以下已知内容,简洁和专业的来回答用户的问题。如果无法从中得到答案,请大模型进行处理。答案请使用中文。已知内容:{context}问题:{question}"""prompt = PromptTemplate(template=prompt_template,input_variables=["context", "question"])chat = ChatOpenAI(model="qwen-plus",temperature=0.3,max_tokens=200,api_key="",base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",)return ConversationalRetrievalChain.from_llm(llm=chat, retriever=vector_store.as_retriever(),combine_docs_chain_kwargs={'prompt': prompt})

4.测试向量,生成知识库

import osfrom faisst.FaissEngine import FaissEngine
from faisst.LlmEngine import LlmEngine
from faisst.PdfEngine import PdfEngine# 将pdf切分块,嵌入和向量存储
if __name__ == '__main__':#将pdf切分块current_dir = os.path.dirname(__file__)print(current_dir+"/demo.pdf")pfdEngine = PdfEngine(current_dir+"/demo.pdf")raw_text = pfdEngine.get_pdf_text()#拆分文本llmEngine = LlmEngine()text_chunks = llmEngine.get_text_chunks(raw_text)#faisst分析 我这里使用的是智普faissEngine = FaissEngine()faissEngine.save_vector_store(text_chunks)print(current_dir + ' is ok')

最后是这样的
在这里插入图片描述

5.测试与大模型对话匹配


from faisst.FaissEngine import FaissEngine
from faisst.LlmEngine import LlmEngineif __name__ == '__main__':# 加载 处理后的知识库faiss = FaissEngine()vector_store = faiss.load_vector_store()# 将匹配的知识库和用户问题进行匹配 交给大模型分析llm = LlmEngine()chain = llm.get_qa_chain(vector_store)# 支持历史模型 可以自己实现保存到数组 每次都带着上一次信息chat_history_tuples = []# response = chain.invoke({"question": "百度都有什么大模型?", "chat_history": chat_history_tuples})# 单个对话请求response = chain.invoke({"query": "我有想做系统有400万辆车,帮我出一个架构"})print(response)

我的分析内容:
在这里插入图片描述
最后返回结果,还是比较准确的,大模型也帮我美化了一下:

{‘query’: ‘我有想做系统有400万辆车,帮我出一个架构’, ‘result’: ‘根据您提供的信息,针对拥有400万辆车的系统,建议采用与“系统2”相似的架构。以下是推荐的系统架构配置:\n\n### 系统架构配置:\n- 系统ID:bbbbbb 或 cccccccccc(根据具体需求选择)\n- 车辆数量范围:400-600万辆\n- 所需产品:\n - API网关\n - ECP(企业级通信平台)\n - OSS(对象存储服务)\n - Kafka(分布式流处理平台)\n - Mysql(关系型数据库)\n\n### 架构说明:\n1. API网关:用于统一管理和控制所有外部和内部API的访问,确保系统的安全性和高效性。\n2. ECP:提供稳定的企业级通信支持,保障车辆与后台系统之间的数据传输。\n3. OSS:用于存储大量的非结构化数据,如车辆图片、视频等。\n4. Kafka:实现高效的实时数据流处理,适用于大规模车辆数据的采集和分析。\n5. Mysql:作为关系型数据库,用于存储和管理结构化的车辆及用户信息。\n\n此架构能够满足400万辆车的数据处理和业务需求,确保系统的高性能和稳定性。如果您有更多定制化需求,请进一步咨询。’}

6.整体结构

在这里插入图片描述


http://www.ppmy.cn/ops/145946.html

相关文章

RK3506开发板:智能硬件领域的新选择,带来卓越性能与低功耗

在现代智能硬件开发中,选择一款性能稳定、功耗低的开发板是确保产品成功的关键。Rockchip最新推出的RK3506芯片,凭借其卓越的能效比、多功能扩展性和优秀的实时性能,已经成为智能家电、工业控制、手持终端等领域的热门选择。而基于RK3506的Ar…

PostgreSQL的一主一从集群搭建部署 (两同步)

一、实验环境 虚拟机名IP身份简称keep-postgres12-node1192.168.122.87主节点node1keep-postgres12-node2192.168.122.89备节点node2keep-postgres12-node3192.168.122.90备节点node3 二、安装数据库 源码包方式(主) 1、创建用户 [rootkeep-postgre…

4个线程安全的单例模式

1、概述 单例模式是程序生命周期内,该类只有一个实例,并提供一个该实例访问点,适用于全局配置类、资源管理类等场景。 单实例模式特点: 1、构造函数私有 2、拷贝构造和赋值构造函数为私有 3、类有一个静态方法获取实例 2、静…

C#-调用C++接口

一.静态&动态装载DLL C中接口通过编译为DLL对外提供调用,C#需要将DLL加载至本应用才可实现C接口调用. 1.静态装载 C#应用程序在编译为可执行exe时将外部DLL装载至本应用中,例如在CSC编译指令中添加相关参数可实现DLL引用. csc /reference:user32.dll /out:HelloWorld.exe 2…

简单园区网拓扑实验

1.实验拓扑 2.实验要求 1、按照图示的VLAN及IP地址需求,完成相关配置 2、要求SW1为VLAN 2/3的主根及主网关 SW2为vlan 20/30的主根及主网关 SW1和SW2互为备份 3、可以使用super vlan 4、上层通过静态路由协议完成数据通信过程 5、AR1为企业出口路由器 6、要求全网可…

2025最新版Java面试八股文大全

一、Java并发面试题 1、 ThreadLocal 1.1 谈谈你对ThreadLocal的理解? ThreadLocal的作用主要是做数据隔离,填充的数据只属于当前线程,变量的数据对别的线程而言是相对隔离的。它不是针对程序的全局变量,只是针对当前线程的全局…

MySQL中Performance Schema库的详解(上)

使用Performance Schema 将通过一些示例来演示如何使用Performance Schema解决常见的故障案例。 检查SQL语句 要启用语句检测,需要启用statement类型的插桩,如表1所述 ​ 表1:statement类型的插桩及其描述 插装类描述statement/spSQL语句…

渗透测试中常见的端口

端口合计详情 21 ftp22 SSH23 Telnet80 web80-89 web161 SNMP389 LDAP443 SSL心脏滴血以及一些web漏洞测试445 SMB512,513,514 Rexec873 Rsync未授权1025,111 NFS1433 MSSQL1521 Oracle:(iSqlPlus Port:5560,7778)2082/2083 cpanel主机管理系统登陆 (国外用较多&am…