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

news2024/11/16 13:35:52

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

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

  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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

免费悬浮翻译器都有哪些?看剧学习都适配的翻译器分享~

不知道大家有没有设想过&#xff0c;当我们在查阅外文文档或是观看外语电影时&#xff0c;要是能够借助翻译工具来同步获取译文&#xff0c;那得有多快乐~ 不瞒大家说&#xff0c;现在想要实现这种快乐其实很简单&#xff01;只要手里头备好几个趁手的免费悬浮翻译器就可以搞定…

为冲刺IPO,喜马拉雅曝裁员20%?钉钉叶军吐槽百度搜索;美国制裁俄罗斯安全软件12名高管;华为自研语言仓颉力战Java

一、商业圈 1.钉钉总裁叶军吐槽百度搜索&#xff1a;前十条都是广告 钉钉总裁叶军在亚布力中国企业家论坛第十届创新年会上发表了演讲&#xff0c;期间他直言不讳地对百度搜索提出了批评。叶军指出&#xff0c;在OpenAI推出智能聊天机器人ChatGPT之后&#xff0c;百度的传统搜…

昇思25天学习打卡营第1天|基本介绍

今天的课程内容是MindSpore和昇腾AI全栈的整体介绍。 MindSpore 介绍 全场景深度学习框架 架构结构 扩展部分 Model Zoo 模型库Extend 扩展库&#xff08;强化学习/GNN&#xff09;Sciene 科学计算 开放部分MindExpression 统一API第三方前端 运行部分Data 数据处理AI编译…

k8s知识点

Kubernetes中Service、Ingress与Ingress Controller的作用与关系 Service 是对一组提供相同功能的 Pods 的抽象&#xff0c;并为它们提供一个统一的入口。借助 Service&#xff0c;应用可以方便的实现服务发现与负载均衡。Ingress 是反向代理规则&#xff0c;管理外部流量进入集…

环境安装-GIT

下载 git官网下载 https://git-scm.com/ 安装 点击下载的安装包&#xff0c;并点击下一步 选择安装路径&#xff0c;照例改选自定义路径 选择默认的即可 选择GIT编辑器&#xff0c;默认选择vim即可 设置初始化新项目(本地仓库)的主分支名&#xff0c;按默认即可&#xff0c;点…

web前端:作业四

1.编写一个函数&#xff0c;形参是一个数组&#xff0c;返回数组中所有数字的平均值 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><script>// 1.编写一个函数&#xff0…

基于Pytorch框架构建AlexNet模型

Pytorch 一、判断环境1.导入必要的库2.判断环境 二、定义字典1.定义字典 三、处理图像数据集1.导入必要的模块2.定义变量3.删除隐藏文件/文件夹 四、加载数据集1.加载训练数据集2.加载测试数据集3.定义训练数据集和测试集路径4.加载训练集和测试集5.创建训练集和测试集数据加载…

自定义User-Agent:使用Python Requests进行网络请求

在网络编程和数据采集领域&#xff0c;HTTP请求是与服务器交互的基本方式。User-Agent&#xff08;用户代理&#xff09;是HTTP请求中的一个重要字段&#xff0c;它告诉服务器发起请求的客户端类型和版本信息。在某些情况下&#xff0c;自定义User-Agent可以帮助我们模拟不同的…

Web 项目自动化测试主流框架都有哪些?

摘要&#xff1a;本文将详细介绍Web项目自动化测试的主流框架&#xff0c;包括Selenium、Cypress和Puppeteer。从零开始&#xff0c;我们将一步步引导您了解这些框架的使用和规范的书写。 引言&#xff1a;Web项目自动化测试是现代软件开发过程中不可或缺的一部分。它可以提高…

常微分方程算法之编程示例二(梯形法)

目录 一、研究问题 二、C代码 三、计算结果 一、研究问题 本节我们采用梯形法&#xff08;即隐式Eluer法&#xff09;求解算例。 梯形法的原理及推导请参考&#xff1a; 常微分方程算法之梯形法&#xff08;隐式Eluer法&#xff09;_梯形法求解常微分方程-CSDN博客https://…

Day12 单调栈 下一个最大元素

503. 下一个更大元素 II 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更大的数…

ES6+Vue

ES6Vue ES6语法 ​ VUE基于是ES6的&#xff0c;所以在使用Vue之前我们需要先了解一下ES6的语法。 1.什么是ECMAScript6 ECMAScript是浏览器脚本语言的规范&#xff0c;基于javascript来制定的。为什么会出现这个规范呢&#xff1f; 1.1.JS发展史 1995年&#xff0c;网景工…

linux上git的使用

目录 1.测试是否安装有git 2.下载项目到本地 3.三板斧 1.将代码放在创建的目录中 2.提交改动到本地 3.提交代码到远端 4.注意点 以及补充内容 1.测试是否安装有git 如果输入git --help 会显示下面一大串那么就是已经安装&#xff0c;否则需要自行手动安装 yum install g…

JavaScript的学习之DOM简介

目录 一、DOM是什么 二、节点是什么&#xff08;Node&#xff09; 三、代码示例 一、DOM是什么 DOM全称Document Object Model文档对象模型 文档&#xff1a;表示整个HTML网页文档 对象&#xff1a;表示网页中的每一个部分转换为一个对象 模型&#xff1a;表示对象之间的关系…

【计算机毕业设计】基于Springboot的网页时装购物系统【源码+lw+部署文档】

包含论文源码的压缩包较大&#xff0c;请私信或者加我的绿色小软件获取 免责声明&#xff1a;资料部分来源于合法的互联网渠道收集和整理&#xff0c;部分自己学习积累成果&#xff0c;供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者…

TDengine 3.2.3.0 集成英特尔 AVX512!快来看看为你增添了哪些助力

在当今的 IoT 和智能制造领域&#xff0c;海量时序数据持续产生&#xff0c;对于这些数据的实时存储、高效查询和分析已经成为时序数据库&#xff08;Time Series Database&#xff0c;TSDB&#xff09;的核心竞争力。作为一款高性能的时序数据库&#xff0c;TDengine 不仅采用…

Spring容器启动流程——refresh()单个方法分析

文章目录 Spring启动过程this()方法refresh()prepareRefresh()obtainFreshBeanFactory()prepareBeanFactory()postProcessBeanFactory()invokeBeanFactoryPostProcessorsregisterBeanPostProcessorsinitMessageSource()initApplicationEventMulticaster()onRefresh()registerLi…

面向对象六大设计原则--依赖倒置

目录 六大原则 定义 概念 Java语言中的表现 优点 在设计模式中体现 工厂方法模式 观察者模式 状态模式 示例 手机模块设计 五个示例 一、读取数据 二、发送消息 三、支付方式 四、日志记录 五、数据持久化 使用汽车驾驶进行说明 依赖的三种写法 1.构造函数…

从0开始C++(一):从C到C++

目录 c的基本介绍 C语言和C 的区别 面向过程和面向对象的区别 引用 引用使用的注意事项 赋值 终端输入 cin getline string字符串类 遍历方式 字符串和数字转换 函数 内联函数 函数重载overload 小练习&#xff1a; 参考代码 c的基本介绍 C是一种通用的高级编…

学习金字塔模型

学习金字塔模型由美国缅因州巴特尔教育研究所&#xff08;National Training Laboratories, Bethel, Maine&#xff09;开发&#xff0c;它展示了不同学习活动的平均知识保留率。这种方法可以帮助人们理解不同学习方式的有效性&#xff0c;从而更好地选择适合的学习方法。学习金…