可视化FAISS矢量空间并调整RAG参数提高结果精度
随着开源大型语言模型的性能不断提高,编写和分析代码、推荐、文本摘要和问答(QA)对的性能都有了很大的提高。但是当涉及到QA时,LLM通常会在未训练数据的相关的问题上有所欠缺,很多内部文件都保存在公司内部,以确保合规性、商业秘密或隐私。当查询这些文件时,会使得LLM产生幻觉,产生不相关、捏造或不一致的内容。
一种处理这一挑战的可行技术是检索增强生成(RAG)。它涉及通过引用训练数据源之外的权威知识库来增强响应的过程,以提升生成的质量和准确性。RAG系统包括一个检索系统,用于从语料库中检索相关文档片段,以及一个LLM模型,利用检索到的片段作为上下文来生成响应。因此,语料库的质量和嵌入在向量空间中的表示对RAG的性能至关重要。
在本文中,我们将使用可视化库renumics-spotlight在2-D中可视化FAISS向量空间的多维嵌入,并通过改变某些关键的矢量化参数来寻找提高RAG响应精度的可能性。对于我们选择的LLM,将采用TinyLlama 1.1B Chat,这是一个紧凑的模型,与Llama 2相同的架构。它的优点是具有更小的资源占用和更快的运行时间,但其准确性没有成比例的下降,这使它成为快速实验的理想选择。
系统设计
QA系统有两个模块,如图所示。
LoadFVectorize模块用于加载PDF或Web文档,并进行初步测试和可视化。另一个模块负责加载LLM并实例化FAISS检索器,然后构建一个包含LLM、检索器和自定义查询提示的检索链。最后,我们对向量空间进行可视化处理。
代码实现
1、安装必要的库
renumics-spotlight库采用类似于umap的可视化方法,将高维嵌入减少为易于管理的2D可视化,同时保留关键属性。我们之前曾简单介绍过umap的用法,但仅限于基本功能介绍。这次,我们将其作为系统设计的一部分,将其整合到一个实际项目中。首先,需要安装必要的库。
pip install langchain faiss-cpu sentence-transformers flask-sqlalchemy psutil unstructured pdf2image unstructured_inference pillow_heif opencv-python pikepdf pypdf pip install renumics-spotlight CMAKE_ARGS="-DLLAMA_METAL=on" FORCE_CMAKE=1 pip install --upgrade --force-reinstall llama-cpp-python --no-cache-dir
上面的最后一行是安装带有Metal支持的llama- pcp -python库,该库将用于在M1处理器上加载带有硬件加速的TinyLlama。
2、LoadFVectorize模块
模块包括3个功能:
load_doc处理在线pdf文档的加载,每个块分割512个字符,重叠100个字符,返回文档列表。
vectorize调用上面的函数load_doc来获取文档的块列表,创建嵌入并保存到本地目录opdf_index,同时返回FAISS实例。
load_db检查FAISS库是否在目录opdf_index中的磁盘上并尝试加载,最终返回一个FAISS对象。
该模块代码的完整代码如下:
# LoadFVectorize.py from langchain_community.embeddings import HuggingFaceEmbeddings from langchain_community.document_loaders import OnlinePDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.vectorstores import FAISS # access an online pdf def load_doc() -> 'List[Document]':loader = OnlinePDFLoader("https://support.riverbed.com/bin/support/download?did=7q6behe7hotvnpqd9a03h1dji&versinotallow=9.15.0")documents = loader.load()text_splitter = RecursiveCharacterTextSplitter(chunk_size=512, chunk_overlap=100)docs = text_splitter.split_documents(documents)return docs # vectorize and commit to disk def vectorize(embeddings_model) -> 'FAISS':docs = load_doc()db = FAISS.from_documents(docs, embeddings_model)db.save_local("./opdf_index")return db # attempts to load vectorstore from disk def load_db() -> 'FAISS':embeddings_model = HuggingFaceEmbeddings()try:db = FAISS.load_local("./opdf_index", embeddings_model)except Exception as e:print(f'Exception: {e}\nNo index on disk, creating new...')db = vectorize(embeddings_model)return db
3、主模块
主模块最初定义了以下模板的TinyLlama提示符模板:
{context}{question}
另外采用来自TheBloke的量化版本的TinyLlama可以极大的减少内存,我们选择以GGUF格式加载量化LLM。
然后使用LoadFVectorize模块返回的FAISS对象,创建一个FAISS检索器,实例化RetrievalQA,并将其用于查询。
# main.py from langchain.chains import RetrievalQA from langchain.prompts import PromptTemplate from langchain_community.llms import LlamaCpp from langchain_community.embeddings import HuggingFaceEmbeddings import LoadFVectorize from renumics import spotlight import pandas as pd import numpy as np # Prompt template qa_template = """ You are a friendly chatbot who always responds in a precise manner. If answer is unknown to you, you will politely say so. Use the following context to answer the question below: {context} {question} """ # Create a prompt instance QA_PROMPT = PromptTemplate.from_template(qa_template) # load LLM llm = LlamaCpp(model_path="./models/tinyllama_gguf/tinyllama-1.1b-chat-v1.0.Q5_K_M.gguf",temperature=0.01,max_tokens=2000,top_p=1,verbose=False,n_ctx=2048 ) # vectorize and create a retriever db = LoadFVectorize.load_db() faiss_retriever = db.as_retriever(search_type="mmr", search_kwargs={'fetch_k': 3}, max_tokens_limit=1000) # Define a QA chain qa_chain = RetrievalQA.from_chain_type(llm,retriever=faiss_retriever,chain_type_kwargs={"prompt": QA_PROMPT} ) query = 'What versions of TLS supported by Client Accelerator 6.3.0?' result = qa_chain({"query": query}) print(f'--------------\nQ: {query}\nA: {result["result"]}') visualize_distance(db,query,result["result"])
向量空间可视化本身是由上面代码中的最后一行visualize_distance处理的:
visualize_distance访问FAISS对象的属性__dict__,index_to_docstore_id本身是值docstore-ids的关键索引字典,用于向量化的总文档计数由索引对象的属性ntotal表示。
vs = db.__dict__.get("docstore")index_list = db.__dict__.get("index_to_docstore_id").values()doc_cnt = db.index.ntotal
调用对象索引的方法reconstruct_n,可以实现向量空间的近似重建
embeddings_vec = db.index.reconstruct_n()
有了docstore-id列表作为index_list,就可以找到相关的文档对象,并使用它来创建一个包括docstore-id、文档元数据、文档内容以及它在所有id的向量空间中的嵌入的列表:
doc_list = list() for i,doc-id in enumerate(index_list):a_doc = vs.search(doc-id)doc_list.append([doc-id,a_doc.metadata.get("source"),a_doc.page_content,embeddings_vec[i]])
然后使用列表创建一个包含列标题的DF,我们最后使用这个DF进行可视化
df = pd.DataFrame(doc_list,columns=['id','metadata','document','embedding'])
在继续进行可视化之前,还需要将问题和答案结合起来,我们创建一个单独的问题以及答案的DF,然后与上面的df进行合并,这样能够显示问题和答案出现的地方,在可视化时我们可以高亮显示:
# add rows for question and answerembeddings_model = HuggingFaceEmbeddings()question_df = pd.DataFrame({"id": "question","question": question,"embedding": [embeddings_model.embed_query(question)],})answer_df = pd.DataFrame({"id": "answer","answer": answer,"embedding": [embeddings_model.embed_query(answer)],})df = pd.concat([question_df, answer_df, df])
这里使用使用np.linalg.norm在文件和问题嵌入上的进行距离大小的计算:
question_embedding = embeddings_model.embed_query(question)# add column for vector distancedf["dist"] = df.apply( lambda row: np.linalg.norm(np.array(row["embedding"]) - question_embedding),axis=1,)
因为spotlight可以对df进行可视化,所有我们直接调用即可
spotlight.show(df)
这一步将在浏览器窗口中启动spotlight。
运行测试
1、基本测试
下面是我们选择的样本问题:
What versions of TLS supported by Client Accelerator 6.3.0?
正确答案是:
Client Accelerator 6.3.0 supports TLS 1.1 or 1.2.
以下额外信息可能包含在响应中。
You must enable this capability using the following CLI command on the Client Accelerator:(config) # policy id
ssl backend client-tls-1.2Even though TLS 1.1 is not mentioned in the syntax of this command, using this command automatically enables support for both TLS 1.1 and 1.2.
然后我们看看TinyLlama对上述问题的回答:
Client Accelerator 6.3.0 supports TLS 1.1 or 1.2 as the default supported TLS versions with Client Accelerator. You must enable this capability using the following CLI command on the Client Accelerator:```(config) # policy id
ssl backend client-tlss1.2```Note that this command only applies to TLS 1.1 or TLS 1.2. If you need to support older TLS versions, you can use the ssl backend command with the client-tlss1.0 or client-tlss1.1 option instead.
看起来与实际答案非常相似,但它并不完全正确,因为这些TLS版本不是其默认值。
那么我们来看看他是从哪些段落中找到的答案呢?
在可以spotlight中使用visible 按钮来控制显示的列。按“dist”对表格进行排序,在顶部显示问题、答案和最相关的文档片段。查看我们文档的嵌入,它将几乎所有文档块描述为单个簇。这是合理的,因为我们原始pdf是针对特定产品的部署指南,所以被认为是一个簇是没有问题的。
单击Similarity Map选项卡中的过滤器图标,它只突出显示所选的文档列表,该列表是紧密聚集的,其余的显示为灰色,如图下所示。
2、测试块大小和重叠参数
由于检索器是影响RAG性能的关键因素,让我们来看看影响嵌入空间的几个参数。TextSplitter的块大小chunk size(1000,2000)和/或重叠overlap (100,200)参数在文档分割期间是不同的。
对所有组合的对于输出似乎相似,但是如果我们仔细比较正确答案和每个回答,准确答案是(1000,200)。其他回答中不正确的细节已经用红色突出显示。我们来尝试使用可视化嵌入来解释这一行为:
从左到右观察,随着块大小的增加,我们可以观察到向量空间变得稀疏且块更小。从底部到顶部,重叠逐渐增多,向量空间特征没有明显变化。在所有这些映射中整个集合仍然或多或少地呈现为一个单一的簇,并只有几个异常值存在。这种情况在生成的响应中是可以看到的因为生成的响应都非常相似。
如果查询位于簇中心等位置时由于最近邻可能不同,在这些参数发生变化时响应很可能会发生显著变化。如果RAG应用程序无法提供预期答案给某些问题,则可以通过生成类似上述可视化图表并结合这些问题进行分析,可能找到最佳划分语料库以提高整体性能方面优化方法。
为了进一步说明,我们将两个来自不相关领域(Grammy Awards和JWST telescope)的维基百科文档的向量空间进行可视化展示。
def load_doc():loader = WebBaseLoader(['https://en.wikipedia.org/wiki/66th_Annual_Grammy_Awards','https://en.wikipedia.org/wiki/James_Webb_Space_Telescope'])documents = loader.load()...
只修改了上面代码其余的代码保持不变。运行修改后的代码,我们得到下图所示的向量空间可视化。
这里有两个不同的不重叠的簇。如果我们要在任何一个簇之外提出一个问题,那么从检索器获得上下文不仅不会对LLM有帮助,而且还很可能是有害的。提出之前提出的同样的问题,看看我们LLM产生什么样的“幻觉”
Client Accelerator 6.3.0 supports the following versions of Transport Layer Security (TLS):
- TLS 1.2\2. TLS 1.3\3. TLS 1.2 with Extended Validation (EV) certificates\4. TLS 1.3 with EV certificates\5. TLS 1.3 with SHA-256 and SHA-384 hash algorithms
这里我们使用FAISS用于向量存储。如果你正在使用ChromaDB并想知道如何执行类似的可视化,renumics-spotlight也是支持的。
总结
检索增强生成(RAG)允许我们利用大型语言模型的能力,即使LLM没有对内部文档进行训练也能得到很好的结果。RAG涉及从矢量库中检索许多相关文档块,然后LLM将其用作生成的上下文。因此嵌入的质量将在RAG性能中发挥重要作用。
在本文中,我们演示并可视化了几个关键矢量化参数对LLM整体性能的影响。并使用renumics-spotlight,展示了如何表示整个FAISS向量空间,然后将嵌入可视化。Spotlight直观的用户界面可以帮助我们根据问题探索向量空间,从而更好地理解LLM的反应。通过调整某些矢量化参数,我们能够影响其生成行为以提高精度。
以上是可视化FAISS矢量空间并调整RAG参数提高结果精度的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

谷歌浏览器安全性高、稳定性强,受到广大用户的喜欢。但是有用户发现自己一打开谷歌浏览器就闪退,这是怎么回事?可能是打开了过多的标签页,也可能是浏览器版本过旧,下面就来看看详细的解决办法。 如何解决谷歌浏览器闪退问题? 1、关闭一些不必要的标签页 如果打开的标签页过多,尝试关闭一些不必要的标签页,可以有效地缓解谷歌浏览器的资源压力,减少闪退的可能性。 2、更新谷歌浏览器 如果谷歌浏览器版本太旧,那也会导致闪退等错误,建议大家将Chrome更新到最新版。点选右上角【自定义及控制】-【设

近期,OpenAITranslator和NextChat都开始支持Ollama本地运行的大型语言模型了,这对「新手上路」的爱好者来说,又多了一种新玩法。而且OllamaonWindows(预览版)的推出,完全颠覆了在Windows设备上进行AI开发的方式,它为AI领域的探索者和普通的「试水玩家」指引了一条明确的道路。什么是Ollama?Ollama是一款开创性的人工智能(AI)和机器学习(ML)工具平台,它极大地简化了AI模型的开发和使用过程。在技术社区里,AI模型的硬件配置和环境搭建一直是个棘

PyCharm 闪退的解决方法包括:检查内存使用情况并增加 PyCharm 的内存限制;更新 PyCharm 至最新版本;检查插件并禁用或卸载不必要的插件;重置 PyCharm 设置;禁用硬件加速;重新安装 PyCharm;联系支持人员寻求帮助。

如果你一直在关注大型语言模型的架构,你可能会在最新的模型和研究论文中看到“SwiGLU”这个词。SwiGLU可以说是在大语言模型中最常用到的激活函数,我们本篇文章就来对它进行详细的介绍。SwiGLU其实是2020年谷歌提出的激活函数,它结合了SWISH和GLU两者的特点。SwiGLU的中文全称是“双向门控线性单元”,它将SWISH和GLU两种激活函数进行了优化和结合,以提高模型的非线性表达能力。SWISH是一种非常普遍的激活函数,它在大语言模型中得到广泛应用,而GLU则在自然语言处理任务中表现出

译者|布加迪审校|重楼本文介绍了如何使用GroqLPU推理引擎在JanAI和VSCode中生成超快速响应。每个人都致力于构建更好的大语言模型(LLM),例如Groq专注于AI的基础设施方面。这些大模型的快速响应是确保这些大模型更快捷地响应的关键。本教程将介绍GroqLPU解析引擎以及如何在笔记本电脑上使用API和JanAI本地访问它。本文还将把它整合到VSCode中,以帮助我们生成代码、重构代码、输入文档并生成测试单元。本文将免费创建我们自己的人工智能编程助手。GroqLPU推理引擎简介Groq

它能够给用户提供更好的游戏体验和使用体验,安卓模拟器是一种可以在电脑上模拟安卓系统运行的软件。市面上的安卓模拟器种类繁多,品质参差不齐,然而。帮助读者选择最适合自己的模拟器、本文将重点介绍一些流畅且好用的安卓模拟器。一、BlueStacks:运行速度飞快具有出色的运行速度和流畅的用户体验、BlueStacks是一款备受欢迎的安卓模拟器。使用户能够畅玩各类移动游戏和应用,它能够在电脑上以极高的性能模拟安卓系统。二、NoxPlayer:支持多开,玩游戏更爽可以同时在多个模拟器中运行不同的游戏、它支持

硬件加速GPU有必要开吗?随着科技的不断发展与进步,GPU(GraphicsProcessingUnit)作为计算机图形处理的核心组件,扮演着至关重要的角色。然而,一些用户或许对于是否需要开启硬件加速功能持有疑问。本文将探讨硬件加速GPU的必要性,以及开启硬件加速对计算机性能和使用体验的影响。首先,我们需要了解硬件加速GPU的工作原理。GPU是一种专门用

WPS某个表格反应很慢怎么办?用户们可以尝试着关闭其他的程序或者是更新软件来进行操作,下面就让本站来为用户们来仔细的介绍一下wps表格卡顿反应慢怎么回事吧。 wps表格卡顿反应慢怎么回事 1、关闭其他程序:关闭其他正在运行的程序,特别是占用大量系统资源的程序。这样可以为WPSOffice提供更多的计算资源,减少卡顿和延迟。 2、更新WPSOffice:确保你使用的是最新版本的WPSOffice。在WPSOffice官方网站上下载并安装最新版可以解决一些已知的性能问题。 3、减少文件大
