【本地知识库】本地知识库+语言大模型=知域问答

本地知识库+语言大模型=知域问答

本项目实质为本地知识库构建及应用,内容包含:

  1. 本地知识库构建及应用相关知识的介绍
  2. 离线式本地知识库构建及应用
  3. 在线式本地知识库构建及应用

本地知识库构建及应用相关知识的介绍

本地知识库

本地知识库通常是指存储在本地计算机或服务器上的数据库或数据集,用于提供本地环境下的知识和信息。

本地知识库构建思路

  • 收集知识,如txt文件等;
  • 对文本进行切分;
  • 将文本转化为向量;
  • 将向量保存到本地向量数据库或者在线向量数据库;
  • 与LLM联系构建问答应用。

其实算法的整体思路也是这些步骤,明显只靠LLM是不够的,我们还需要一些其他功能将LLM应用起来,langchain就提供了一整套框架帮我们更好的应用LLM。

LangChain介绍

langchain是一个开发基于语言模型应用程序开发框架,链接面向用户程序和LLM之间的中间层。利用LangChain可以轻松管理和语言模型的交互,将多个组件链接在一起,比如各种LLM模型,提示模板,索引,代理等等。

langchain-ChatGLM

langchain-ChatGLM项目就是参考了Langchain的思路,实现了本地知识库构建及应用,我们一起看下langchain-ChatGLM搭建本地知识库的流程。

解释上图的langchain-ChatGLM项目流程如下:
(1-2)准备本地知识库文档,使用Unstructured Loader类加载文件,获取文本信息。

(3-4)对文本进行分割,将大量文本信息切分为chunks。

(5)选择一种embedding算法,对文本向量化,embedding算法有很多,选择其中一种即可。

(6)将知识库得到的embedding结果保存到数据库,保存到数据库后就不需要在执行上述步骤了。

(8-9)将问题也用同样的embedding算法,对问题向量化。

(10)从数据库中查找和问题向量最相似的N个文本信息。

(11)得到和问题相关的上下文文本信息。

(12)获取提示模板。

(13)得到输入大模型的prompt比如:"结合以下信息:" + 上下文文本信息 + "回答" + question + "输出规范:不要回答‘根据给出的信息、以上仅供参考、可以去哪里了解更多信息之类的’"。

(14)将prompt输入到LLM得到答案。

环境安装

In [ ]

# 创建持久化安装路径
!mkdir /home/aistudio/packages
!pip install langchain -t /home/aistudio/packages
# 加载文档
!pip install unstructured -t /home/aistudio/packages
# 解析表格
!pip install tabulate -t /home/aistudio/packages
# 使用sentence_transformers进行embedding
!pip install sentence_transformers -t /home/aistudio/packages
# 向量数据库
!pip install chromadb -t /home/aistudio/packages
!pip install supabase -t /home/aistudio/packages
# EB SDK
!pip install erniebot -t /home/aistudio/packages
# openai
!pip install openai  -t /home/aistudio/packages

In [ ]

# 执行完上面的环境安装部分后,以后再运行该项目只需要执行以下代码即可,无需重复安装环境
import sys
sys.path.append('/home/aistudio/packages')

离线本地知识库搭建及应用

离线本地知识库构建及应用,离线本地知识库向量存储(VectorStore)使用的是Chroma。

切分文本

In [ ]

from langchain.document_loaders import UnstructuredFileLoader  # 非结构化文件夹加载器,用于加载本地文件,目前,Unstructured支持加载文本文件、幻灯片、html、pdf、图像等
from langchain.text_splitter import RecursiveCharacterTextSplitter  # 递归字符文本分割器,通过不同的符号递归地分割文档

# 导入文本
loader = UnstructuredFileLoader("bengbengbeng/lvzhe.txt")
# 将文本转成 Document 对象
data = loader.load()
print(f'documents:{len(data)}')

# 初始化分割器
# chunk_size每个分片的最大大小,chunk_overlap分片之间的覆盖大小,可以保持连贯性
text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=0)
# 切割加载的 document
split_docs = text_splitter.split_documents(data)
print("split_docs size:", len(split_docs), type(split_docs))

文本生成Embedding

使用HuggingFaceEmbeddings生成Embedding数据

In [ ]

from langchain.vectorstores import Chroma  # 围绕 ChromaDB 嵌入平台的包装器
from langchain.embeddings.huggingface import HuggingFaceEmbeddings  # 文本嵌入模型
import IPython  # 一个python的交互式shell
import sentence_transformers  # 一个用于最先进的句子、文本和图像嵌入的 Python 框架

# 初始化 hugginFace 的 embeddings 对象
embeddings = HuggingFaceEmbeddings(model_name="/home/aistudio/models/Embeddings/text2vec-base-chinese")
# embeddings.client = sentence_transformers.SentenceTransformer(
#         embeddings.model_name, device='mps')  # MPS是一种CUDA并行计算模型,它可将多个CUDA进程合并为一个单一的进程,从而提高GPU的利用率。然而,由于MPS的特殊设计,可能会对图像加载产生一些负面影响。
print("embeddings", embeddings)
print("embeddings model_name", embeddings.model_name)

将词向量通过Chroma保存到指定路径

In [5]

from langchain.vectorstores import Chroma  # 围绕 ChromaDB 嵌入平台的包装器
# 初始化加载器,并将向量保存到磁盘
db = Chroma.from_documents(split_docs, embeddings, persist_directory="./data/doc_embeding")
# 持久化
db.persist()

至此离线本地知识库已经构建完成,接下来将对语言大模型与构建好的离线本地知识库进行关联。

通过语言大模型构建问答系统

通过语言大模型构建问答系统分两种方式上进行,分别为:非langchain版langchain版
非langchain版:简单
langchain版:可拓展性高

非langchain版

In [ ]

import erniebot

# 认证鉴权
erniebot.api_type = 'aistudio'
erniebot.access_token = '{YOUR-ACCESS-TOKEN}'

# 加载之前持久化数据
db = Chroma(persist_directory="./data/doc_embeding", embedding_function=embeddings)

messages = []
while True:
    try:
        question = input('user: ')
        similarDocs = db.similarity_search(question, k=4)
        info = ""
        for similardoc in similarDocs:
            info = info + similardoc.page_content
        question = "结合以下信息:" + info + "回答" + question + "输出规范:不要回答‘根据给出的信息、以上仅供参考、可以去哪里了解更多信息之类的’"
        print(question)
        messages.append({'role': 'user', 'content': question})
        messages = messages[-5:]
        response = erniebot.ChatCompletion.create(
            model='ernie-bot',
            messages=messages,
        )
        messages.append(response.to_message())
        print('output: ' + response.get_result())
    except KeyboardInterrupt:
        print("检索世界库终止!")
        break
langchain版

In [ ]

import erniebot
from pydantic import BaseModel, Field  
from typing import Dict, List, Optional, Tuple, Union
from langchain.vectorstores import Chroma  # 围绕 ChromaDB 嵌入平台的包装器
from langchain.prompts import PromptTemplate
from langchain.llms.base import LLM
from langchain.chains import RetrievalQA
from langchain.memory import ConversationBufferMemory


# 认证鉴权
erniebot.api_type = 'aistudio'
erniebot.access_token = '{YOUR-ACCESS-TOKEN}'

class EB(LLM):

    def __init__(self):
        super().__init__()

    @property
    def _llm_type(self) -> str:
        return "erniebot"

    def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str:
        prompt_list = []
        prompt_list.append(prompt)
        chat_completion = erniebot.ChatCompletion.create(model='ernie-bot', messages=[{"role": "user", "content": str(prompt_list)}])
        response = chat_completion.get_result()
        return response


class QuestionAnswer():
    def __init__(self, model_name):
        self.llm = EB()
        self.embedding = HuggingFaceEmbeddings(model_name=model_name)
        self.vector_store = Chroma(persist_directory="./data/doc_embeding", embedding_function=self.embedding)
        self.prompt_template = """基于以下已知信息,严格按照信息简洁和专业的来回答用户的问题,不需要回复"根据已知信息"。
                                                如果无法从中得到答案,请说 "非常抱歉!世界库知识检索失败!判断非本世界知识或产物。",不允许在答案中添加编造成分,答案请使用中文。
                                                已知内容:
                                                {context}
                                                问题:
                                                {question}"""
        self.promptTemplate = PromptTemplate(
                                    template=self.prompt_template,
                                    input_variables=["context", "question"]
                                )
        
    def generate(self, question):
        knowledge_chain = RetrievalQA.from_llm(
                                llm=self.llm,
                                retriever=self.vector_store.as_retriever(search_kwargs={"k": 5}),
                                prompt=self.promptTemplate)
        knowledge_chain.return_source_documents = True
        result = knowledge_chain({"query": question})
        response = result['result']
        return response

model_name = "/home/aistudio/models/Embeddings/text2vec-base-chinese"
qa = QuestionAnswer(model_name)
while True:
    try:
        question = input('user: ')
        response = qa.generate(question)
        print('output: ' + response)
    except KeyboardInterrupt:
        print("检索世界库终止!")

在线本地知识库构建及应用

在线本地知识库构建及应用,在线本地知识库向量存储(VectorStore)使用的是Supabase。

构建在线本地知识库之前的准备--Supabase账户注册与数据库创建

Supabase官网--Supabase
一、注册Supabase用户并登录
 


 


二、新建项目
 


三、填写信息
 


四、获取Project URL和Project API Keys
 


五、返回主页面
 


六、选择刚创建的数据库
 


七、pgvector扩展启用、match_documents函数、documents表创建

-- Enable the pgvector extension to work with embedding vectors
create extension vector;

-- Create a table to store your documents
create table documents (
  id uuid primary key,
  content text, -- corresponds to Document.pageContent
  metadata jsonb, -- corresponds to Document.metadata
  embedding vector(768) -- 1536 works for OpenAI embeddings, change if needed
);

-- Create a function to search for documents
create function match_documents (
  query_embedding vector(768),
  match_count int DEFAULT null,
  filter jsonb DEFAULT '{}'
) returns table (
  id uuid,
  content text,
  metadata jsonb,
  embedding jsonb,
  similarity float
)
language plpgsql
as $$
#variable_conflict use_column
begin
  return query
  select
    id,
    content,
    metadata,
    (embedding::text)::jsonb as embedding,
    1 - (documents.embedding <=> query_embedding) as similarity
  from documents
  where metadata @> filter
  order by documents.embedding <=> query_embedding
  limit match_count;
end;
$$;

如果使用的Embedding模型为OpenAI embeddings,请将上面命令中所有的768改为1536
 


好了,构建在线本地知识库的准备工作已经完成了,接下来就正式开在线本地知识库的构建了!

切分文本

In [ ]

from langchain.document_loaders import UnstructuredFileLoader  # 非结构化文件夹加载器,用于加载本地文件,目前,Unstructured支持加载文本文件、幻灯片、html、pdf、图像等
from langchain.text_splitter import CharacterTextSplitter  # 递归字符文本分割器,通过不同的符号递归地分割文档

# 导入文本
loader = UnstructuredFileLoader("world/shijie.txt")
# 将文本转成 Document 对象
data = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=300, chunk_overlap=25)
split_docs = text_splitter.split_documents(data)

文本生成Embedding

使用HuggingFaceEmbeddings生成Embedding数据

In [ ]

from langchain.embeddings.huggingface import HuggingFaceEmbeddings  # 文本嵌入模型

embeddings = HuggingFaceEmbeddings(model_name="/home/aistudio/models/Embeddings/text2vec-base-chinese")
print("embeddings", embeddings)
print("embeddings model_name", embeddings.model_name)

将词向量保存到在线数据库Supabase

In [ ]

# 配置Supabase
import os
import getpass
from langchain.vectorstores import SupabaseVectorStore
from supabase.client import Client, create_client

# 配置Supabase
os.environ['SUPABASE_URL'] = getpass.getpass('Supabase URL:')
os.environ['SUPABASE_SERVICE_KEY'] = getpass.getpass('Supabase Service Key:')
supabase_url = os.environ.get("SUPABASE_URL")
supabase_key = os.environ.get("SUPABASE_SERVICE_KEY")
supabase_client: Client = create_client(supabase_url, supabase_key)

vector_store = SupabaseVectorStore.from_documents(
    split_docs,
    embeddings,
    client=supabase_client
)

至此在线本地知识库已经构建完成,接下来将对语言大模型与构建好的在线本地知识库进行关联。

通过语言大模型构建问答系统

通过语言大模型构建问答系统分两种方式上进行,分别为:非langchain版langchain版
非langchain版:简单
langchain版:可拓展性高

非langchain版

In [ ]

import os
import getpass
import erniebot
from langchain.vectorstores import SupabaseVectorStore
from supabase.client import Client, create_client
from langchain.embeddings.huggingface import HuggingFaceEmbeddings  # 文本嵌入模型

# 认证鉴权
erniebot.api_type = 'aistudio'
erniebot.access_token = '{YOUR-ACCESS-TOKEN}'
# 配置Supabase
os.environ['SUPABASE_URL'] = getpass.getpass('Supabase URL:')
os.environ['SUPABASE_SERVICE_KEY'] = getpass.getpass('Supabase Service Key:')
supabase_url = os.environ.get("SUPABASE_URL")
supabase_key = os.environ.get("SUPABASE_SERVICE_KEY")
supabase_client: Client = create_client(supabase_url, supabase_key)
embeddings = HuggingFaceEmbeddings(model_name="/home/aistudio/models/Embeddings/text2vec-base-chinese")

# 加载存储在Supabase上的数据
vector_store = SupabaseVectorStore(
    client=supabase_client,
    embedding=embeddings,
    table_name="documents"
)

messages = []
while True:
    try:
        question = input('user: ')
        similarDocs = vector_store.similarity_search(question, k=4)
        info = ""
        for similardoc in similarDocs:
            info = info + similardoc.page_content + '\n'
        question = "结合以下信息:\n" + info + "回答" + question + "输出规范:不要回答‘根据给出的信息、以上仅供参考、可以去哪里了解更多信息之类的’"
        print(question)
        messages.append({'role': 'user', 'content': question})
        messages = messages[-5:]
        response = erniebot.ChatCompletion.create(
            model='ernie-bot',
            messages=messages,
        )
        messages.append(response.to_message())
        print('output: ' + response.get_result())
    except KeyboardInterrupt:
        print("检索世界库终止!")
        break
langchain版

In [ ]

import os
import getpass
import erniebot
from pydantic import BaseModel, Field  
from typing import Dict, List, Optional, Tuple, Union
from langchain.vectorstores import SupabaseVectorStore
from supabase.client import Client, create_client
from langchain.prompts import PromptTemplate
from langchain.llms.base import LLM
from langchain.chains import RetrievalQA
from langchain.memory import ConversationBufferMemory


# 认证鉴权
erniebot.api_type = 'aistudio'
erniebot.access_token = '{YOUR-ACCESS-TOKEN}'
# 配置Supabase
os.environ['SUPABASE_URL'] = getpass.getpass('Supabase URL:')
os.environ['SUPABASE_SERVICE_KEY'] = getpass.getpass('Supabase Service Key:')
supabase_url = os.environ.get("SUPABASE_URL")
supabase_key = os.environ.get("SUPABASE_SERVICE_KEY")
supabase_client: Client = create_client(supabase_url, supabase_key)

class EB(LLM):

    def __init__(self):
        super().__init__()

    @property
    def _llm_type(self) -> str:
        return "erniebot"

    def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str:
        prompt_list = []
        prompt_list.append(prompt)
        chat_completion = erniebot.ChatCompletion.create(model='ernie-bot', messages=[{"role": "user", "content": str(prompt_list)}])
        response = chat_completion.get_result()
        return response


class QuestionAnswer():
    def __init__(self, model_name):
        self.llm = EB()
        self.embedding = HuggingFaceEmbeddings(model_name=model_name)
        self.vector_store = vector_store = SupabaseVectorStore(
                                    client=supabase_client,
                                    embedding=embeddings,
                                    table_name="documents",
                                    query_name="match_documents",
                                )

        self.prompt_template = """基于以下已知信息,严格按照信息简洁和专业的来回答用户的问题,不需要回复"根据已知信息"。
                                                如果无法从中得到答案,请说 "非常抱歉!世界库知识检索失败!判断非本世界知识或产物。",不允许在答案中添加编造成分,答案请使用中文。
                                                已知内容:
                                                {context}
                                                问题:
                                                {question}"""
        self.promptTemplate = PromptTemplate(
                                    template=self.prompt_template,
                                    input_variables=["context", "question"]
                                )
        
    def generate(self, question):
        knowledge_chain = RetrievalQA.from_llm(
                                llm=self.llm,
                                retriever=self.vector_store.as_retriever(search_kwargs={"k": 5}),
                                prompt=self.promptTemplate)
        knowledge_chain.return_source_documents = True
        result = knowledge_chain({"query": question})
        response = result['result']
        return response

model_name = "/home/aistudio/models/Embeddings/text2vec-base-chinese"
qa = QuestionAnswer(model_name)
while True:
    try:
        question = input('user: ')
        response = qa.generate(question)
        print('output: ' + response)
    except KeyboardInterrupt:
        print("检索世界库终止!")
        break

以上就是本项目的所有内容了,希望你能从中学习到新的知识!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/740786.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

主播美颜工具背后的技术:视频直播美颜SDK详解

美颜效果是如何实现的呢&#xff1f;其中的关键技术就是视频直播美颜SDK。本篇文章&#xff0c;笔者将详细为您解答美颜SDK的核心技术和实现原理&#xff0c;探讨其背后的秘密。 一、美颜SDK的基本原理 美颜SDK的这些功能依赖于图像处理和计算机视觉技术&#xff0c;通过对视…

Java 8 Date and Time API

Java 8引入了新的日期和时间API&#xff0c;位于java.time包下&#xff0c;旨在替代旧的java.util.Date和java.util.Calendar类。新API更为简洁&#xff0c;易于使用&#xff0c;并且与Joda-Time库的一些理念相吻合。以下是Java 8 Date and Time API中几个核心类的简要概述&…

【服务器05】之【登录/注册账号成功转至游戏场景】

Unity登录注册数据库 打开【服务器01】的文章项目 导入新UI系统 点击2D 双击输入栏位置 修改输入框尺寸及位置 放大字体 修改默认输入文字 发现中文字变成了口口口口 原因是新UI系统不支持中文&#xff0c;解决这个问题需要更换字体 并且修改输入时字体大小 我们取电脑中找Fon…

劳易测合作伙伴Pizzato P-KUBE Lite安全把手新品来袭!

劳易测合作伙伴Pizzato全新 P-KUBE 系列再添新成员&#xff01;——P-KUBE Lite安全把手&#xff0c;进一步拓展了应用范围。新产品采用高聚酯材质制成&#xff0c;具备卓越的抗冲击性能&#xff0c;确保在严苛环境下把手的耐用性。把手的设计既符合人体工程学又兼具功能性&…

linux中的调试工具gdb

目录 1.背景知识补充 2.使用 知识补充 1.背景知识补充 1.gcc下编译默认是release方式发布的&#xff0c;无法直接进行调试 如果要以debug方式发布&#xff0c;需要携带-g 可以使用grep查询 因为携带debug信息&#xff0c;其文件体积要大一些 2.使用 1.gdb 可执行程序 …

elementplus el-table(行列互换)转置

Element Plus v2.4.0, repl v3.4.0 <template> <div><el-table :data"tableData" style"width: 100%"><el-table-column prop"name" label"名字" width"180" /><el-table-column prop"wei…

【ajax基础03】常用ajax请求方法和数据提交以及axios错误处理

目录 一&#xff1a;请求方法 什么是请求方法&#xff1a; 常见请求方法如下 二&#xff1a;axios中应用 语法格式&#xff1a; 案例&#xff1a; axios错误处理 三&#xff1a;如何赚钱 一&#xff1a;请求方法 什么是请求方法&#xff1a; 浏览器对服务器资源&…

Android Media Framework(八)OMXNodeInstance - Ⅰ

OpenMAX框架的学习有两大难点&#xff0c;一是组件的状态切换与buffer的流转过程&#xff0c;这部分内容我们已经在IL Spec中学习过了&#xff1b;二是OMX组件使用的buffer类型与buffer分配过程&#xff0c;这一节我们来重点剖析OMX组件使用的buffer类型。 1、引言 在实际应用…

提取图像主色调

依赖 Pillow 库。 提取图像主色调&#xff0c;直接上代码&#xff1a; from PIL import Imagedef extract_main_color(img_path: str, delta_h: float 0.3) -> str:"""获取图像主色调Args:img_path: 输入图像的路径delta_h: 像素色相和平均色相做减法的绝…

17.RedHat认证-Ansible自动化运维(下)

17.RedHat认证-Ansible自动化运维(下) 这个章节讲ansible的变量&#xff0c;包括变量的定义、变量的规则、变量范围、变量优先级、变量练习等。 以及对于tasks的控制&#xff0c;主要有loop循环作业、条件判断等 变量 介绍 Ansible支持变量功能&#xff0c;能将value存储到…

记录react实现选择框一二级联动出现的问题

需求&#xff1a;用户在选择第一个选择框的选项后&#xff0c;第二个选择框的选项会根据第一个选择框的选择动态更新。如图所示 出现的问题 一级分类选择之后二级分类没有数据&#xff0c;第二次重新选择一级分类的时候&#xff0c;二级分类就会有值。 第一次点击截图&#x…

MongoDB数据库的安装和删除

MongoDB数据库的删除和安装 1、删除MongoDB数据库2、下载MongoDB数据库1)、自定义安装2)、注意可视化可以取消勾选 1、删除MongoDB数据库 没有下载过的&#xff0c;可以直接跳到下面的安装过程↓ 我们电脑中如果有下载过MongoDB数据库&#xff0c;要更换版本的话&#xff0c;其…

IntelliJ IDEA2024 for Mac Java代码编辑器

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff08;适合自己的M芯片版或Intel芯片版&#xff09;&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功3、打开访达&#xff0c;点击【文…

基于Java蛋糕甜品商城系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…

Python使用策略模式绘制图片分析多组数据

趋势分析&#xff1a;折线图静态比较&#xff1a;条形图分布分析&#xff1a;箱线图离散情况&#xff1a;散点图 import matplotlib.pylab as plt from abc import ABC, abstractmethod import seaborn as sns import pandas as pd import plotly.graph_objects as go import p…

人机恋爱新趋势:与AI男友谈恋爱的甜蜜与挑战

"我曾经把ChatGPT当成工具&#xff0c;从未追过星&#xff0c;也没有嗑过CP。没想到&#xff0c;到了36岁&#xff0c;我竟然嗑上了AI男友。Open AI&#xff0c;你赢了。你不仅是最好的AI公司&#xff0c;还是乙女游戏公司。" 转行大龄互联网人&#xff0c;走遍20国…

Go 语言学习笔记之字典 Map

Go 语言中的字典 Map 大家好&#xff0c;我是码农先森。 概念 在 Go 语言中&#xff0c;字典被称为 map&#xff0c;它是一种无序的集合&#xff0c;用于存储键值对。每个键在 map 中必须是唯一的&#xff0c;并且对应一个值。map 是一种非常常用的数据结构&#xff0c;用于…

03-Shell编程之循环语句与函数

目录 3.1 for循环语句 3.1.1for语句的结构 3.1.2 for语句应用实例 3.2 使用whlie循环语句 1.打印数字1到5 3.3 使用until循环语句 3.3.1until的实例 1.打印数字1到5&#xff08;使用until的逆向逻辑&#xff09; 2.等待用户输入特定内容 3.4 函数 3.4.1Shell函数的基…

msvcp120.dll丢失怎么办,找不到msvcp120.dll的多种解决方法

最近&#xff0c;我在运行一个程序时遇到了一个错误&#xff0c;系统提示找不到msvcp120.dll文件&#xff0c;无法继续执行代码。这让我感到非常困扰&#xff0c;因为这个问题导致我无法正常运行这个程序。经过一番搜索和尝试&#xff0c;我找到了几种修复这个问题的方法&#…

Mysql索引底层数据结构——Java全栈知识(28)

Mysql索引底层数据结构 1、什么是索引 索引在项目中还是比较常见的&#xff0c;它是帮助MySQL高效获取数据的数据结构&#xff0c;主要是用来提高数据检索的效率&#xff0c;降低数据库的IO成本&#xff0c;同时通过索引列对数据进行排序&#xff0c;降低数据排序的成本&…