LangChain基础知识

news2025/1/13 10:05:57

这篇文档介绍了LangChain大模型应用开发框架的入门知识和核心内容,包括LangChain是什么、为什么需要它、典型使用场景、基础概念与模块化设计等。同时,还详细阐述了该框架的核心模块如标准化的大模型抽象、大模型应用的最佳实践、赋予应用记忆的能力、框架原生的数据处理流等。

LangChain 简介

LangChain 是什么

LangChain:一个快速崛起的开源项目
LangChain
LangChain从最开始的开源社区的一个开源项目,引起广大人群的关注,逐步做起来变成公司型的项目,再逐步进新行多轮融资。最后从图中可以看出,其受关注度及影响力飞速增长。
LangChain: 通过组合模块和能力抽象来扩展 LLM 的助手
LangChain
大模型应用的开发框架怎么能够帮助我们快速开发大模型应用呢?主要基于LangChain的可组合性,具体体现在它有一堆组件,并且这些组件的核心主要包括六大模块:Model l/O、Data connection、Chains、Memory、Agents、Callbacks。
AIGC 应用开发生态
AIGC 应用开发生态
所有的开源项目或者开源框架主要分成三类。第一类是基础建设,简称“基建”。随着时代发展,机械类的操作技术都会逐步实现自动化、框架化但目前底层的基础设施建设还没有达到一个高度发达的程度。从云时代到来以后,越来越多基础设施被提出来,包括云原生下的K8S、Rancher等。但是云计算的时代不可能实现一台机器完成开发环境的开发部署,基于这个需求,就需要研究管理多个机器的工具,或者说云时代下的分布式操作系统。当成功让很多分布式的大批量的集群被管理起来并用起来后,而web时代又存在很多的流量,需要部署很多服务器实现弹性扩容的机制。可以说,云原生项目带来基础设施能力的跃升,让我们终于能够批量使用资源。

为什么需要 LangChain

Q:为什么开发者要用 LangChain 而不是直接使用 OpenAl 或者Hugging Face 上的模型?
A:Hugging Face、OpenAl、Cohere 可以提供底座模型和 API, 但是在产品中集成和使用它们仍然需要大量的工作。
可以理解为,LangChain 框架有利于应用开发者通过调用一个统一的接口,代替产品研发过程中模型、数据结构等变动因素,从而实现相同接口直接调用,而不是单一修改源代码或模型。为上面的应用开发者提供了便利,那对下面的模型也是一样啊,因为下面的模型不管你怎么迭代,你最终一个大模型。

LangChain 典型使用场景

产品示例1: OpenAI-Translator

产品示例
技术框架 :将一篇英文文档,基于大模型应用中的提示词模板和大模型对接的服务,输出为翻译后的中文文档。
技术路线
大模型应用的技术路线
大模型应用服务

LangChain 典型使用场景:RAG (Retrieval-Augmented Generation)

RAG
LangChain 处于一个最核心的位置,既跟用户去做人机交互,实现基于用户的提问提供最终答案的效果,同时,LangChain连接了三种不同的技术生态。

  • Embedding Model:将文本变成高维向量;
  • 向量数据库:存储高维向量,是大语言模型的第二大脑;
  • 大语言模型:解码向量数据库的内容后,可以通过prompt实现大语言模型来完成任务总结并返回用户的过程。

LangChain 基础概念与模块化设计

LangChain 核心模块入门与实战

LangChain实现抽象的模块化设计
图示 LangChain实现抽象的模块化设计
LLM
首先大语言模型LLM既有私有化的open AI,也有开源社区的HuggingFace等等。除了大模型以外,为了使大模型用起来,最重要的功能模块就是prompt提示词。一个真正的大模型应用,其实就是要不断地复用提示词。然后对于大模型来说,prompt又是大模型的输入。所以在LangChain内部设计了大量的prompt模版以供参考学习。
模型输入 Prompts
一个语言模型的提示是用户提供的一组指令或输入,用于引导模型的响应,帮助它理解上下文并生成相关和连贯的基于语言的输出,例如回答问题、完成句子或进行对话。

  • 提示模板(Prompt Templates):参数化的模型输入,Prompt Templates 提供了一种预定义、动态注入、模型无关和参数化的提示词生成方式,以便在不同的语言模型之间重用模板。一个模板可能包括指令、少量示例以及适用于特定任务的具体背景和问题。
  • 示例选择器(Example Selectors):动态选择要包含在提示中的示例

Memory
第三个重要功能模块就是Memory,实现记忆历史对话内容。大多数LLM应用都具有对话界面。对话的一个重要组成部分是能够引用先前在对话中介绍过的信息。至少,一个对话系统应该能够直接访问一些过去消息的窗口。更复杂的系统将需要拥有一个不断更新的世界模型,使其能够保持关于实体及其关系的信息。大模型本身是概率模型,基于前置条件,即输入和分布,即可得出对应输出。但是整个流程是一次性的,对于初始的且没有经过任何处理的大模型,是不具备记忆存储功能,这个功能模块是需要应用开发者进行开发的。
Agent
最后就是Agent,包括应用实际运行起来的运行时,典型的内置实现叫做Agent Executor。由于大模型只有一个大脑,成为真正的智能体应用就需要连接并调用外部的工具,Langchain也预定义了很多Toolkits。
对于data connection功能模块,实现了数据的连接转换。那怎么体现data connection呢?其实从上图可以看到主要的四个模块,包括chain和最终的应用。这些流动的链条实质是各种各样类型的数据,而不同格式、不同类型、形态等的数据转换其实就是data connection模块所解决的问题。那Chain应该怎么理解呢?就是提供数据流动的管道。

标准化的大模型抽象:Model I/O

Model I/O是LangChain 为开发者提供的一套面向 LLM 的标准化模型接口,包括模型输入(Prompts)、模型输出(Output Parsers)和模型本身(Models)。

  • Prompts:模板化、动态选择和管理模型输入;
  • Models:以通用接口调用语言模型;
  • Output Parser:从模型输出中提取信息,并规范化内容。
    Model I/O

Model I/O顾名思义就是模型的输入输出。上图前中后三部分就将模型分成了输入模型和输出模型。模型的输入就是自然语言。像左图有两个阶段,第一个阶段就是定义两个变量,x,y。第二个阶段是基于提示词模版,通过format方法传入变量。整体再传入到大模型,而模型又分成两种类型,LLM和Chat Model。

第一类是模型抽象Model语言模型(LLMs): LangChain 的核心组件。LangChain并不提供自己的LLMs,而是为与许多不同的LLMs(OpenAI、Cohere、Hugging Face等)进行交互提供了一个标准接口。LLMs属于较低层次的大语言模型,因为该阶段的大语言模型只有生成能力,还没有对话能力。

第二类聊天模型(Chat Models): 语言模型的一种变体。虽然聊天模型在内部使用了语言模型,但它们提供的接口略有不同。与其暴露一个“输入文本,输出文本”的API不同,它们提供了一个以“聊天消息”作为输入和输出的接口。该模型是优化了模型对话能力的提升后的大模型,例如Open AI的GPT系列。该模型存在角色概念以及Memory存储功能,将这些功能进行抽象后在最终应用层面体现为不同类型的Agents。当下游获取大模型的反馈结果后,其输出结果是一个统一格式,以便于后续基于结果再加工处理。针对该问题引入了一个抽象功能,即output parser。这个功能是根据输出parser类型转变为一预期特定的数据结构,例如json、key-value以及字符串模版等形式。

  • Chat Models类继承关系:
    BaseLanguageModel --> BaseChatModel --> name(Examples: ChatOpenAI, ChatGooglePalm
  • Chat Models主要抽象:
    AIMessage, BaseMessage, HumanMessage

输出解析器 Output Parser
语言模型的输出是文本。
但很多时候,用户可能希望获得比纯文本更结构化的信息。这就是输出解析器的价值所在。
输出解析器是帮助结构化语言模型响应的类。它们必须实现两种主要方法:

  • “获取格式指令”:返回一个包含有关如何格式化语言模型输出的字符串的方法。
  • “解析”:接受一个字符串(假设为来自语言模型的响应),并将其解析成某种结构。

然后还有一种可选方法:

  • “使用提示进行解析”:接受一个字符串(假设为来自语言模型的响应)和一个提示(假设为生成此响应的提示),并将其解析成某种结构。在需要重新尝试或修复输出,并且需要从提示中获取信息以执行此操作时,通常会提供提示。

LangChain 设计:实现联网查询

实现联网查询
第二代New Bing的搜索引擎原理。整个过程可以概述为一个大语言模型的应用基于提示词模板,输入信息后通过format得到一个输出,再把这个输出结果利用output parser转变成了一个特定的格式作为搜索引擎检索关键词后的反馈。搜索引擎基于反馈的搜索结果,补充完善到下一个Prompt模板里,再经过多次反馈形成第二个阶段的大模型,每次反馈到用户的内容都是最优结果。整个流程就会发现,model I/O内的输入、输出和提示词模板大模型共同组成了一个最基础的单元。

LangChain 设计:结合联网与向量数据库

结合向量数据库
为了实现数据持久化,引入了向量数据库,成功实现了存储大模型生成的结果以及检索结果等。

大模型应用的最佳实践:Chains

LLMChain: 整合语言模型和提示模板的最简单链

LLMChain 是 LangChain 中最简单的链,作为其他复杂 Chains 和 Agents 的内部调用,被广泛应用。
一个LLMChain由PromptTemplate和语言模型(LLM or Chat Model)组成。它使用直接传入(或 memory 提供)的 key-value 来规范化生成 Prompt Template(提示模板),并将生成的 prompt (格式化后的字符串)传递给大模型,并返回大模型输出。
整合语言模型和提示模板的最简单链
Chains可以整合一个语言模型和一个提示词模版,从而将每一次大语言模型生成的结果得以复用。
示例:给LLMChain公司取名
给LLMChain公司取名

SequentialChain: 串联式调用语言模型链

串联式调用语言模型(将一个调用的输出作为另一个调用的输入)。
顺序链(Sequential Chain)允许用户连接多个链并将它们组合成执行特定场景的流
水线(Pipeline)。有两种类型的顺序链:

  • SimpleSequentialChain:最简单形式的顺序链,每个步骤都具有单一输入/输出,
    并且一个步骤的输出是下一个步骤的输入。
  • SequentialChain:更通用形式的顺序链,允许多个输入/输出。

SimpleSequentialChain: 单输入/输出串联调用
单输入/输出串联调用
Sequential chain就是调用一个LLMChain A的输出作为另一个的输入LLMChain B。
LLMChain 实战:synopsis_chain 根据剧目的标题撰写简介
图示 输入一个变量并基于Prompt模版,通过大语言模型处理后输出简介。
synopsis_chain 根据剧目的标题撰写简介
review_chain 戏剧评论
下图为当用户将基于第一次输出的标题简介结果作为输入变量后,并提供新的提示词模版,在大语言模型应用时反馈给用户新的生成内容reviews。
review_chain 戏剧评论
整个过程的原理即为下图,SequntialChain: 语言模型串联式调用链。
SequntialChain: 语言模型串联式调用链
SimpleSequentialChain 戏剧评论代码实现
SimpleSequentialChain 戏剧评论

SequentialChain: 多输入/输出串联调用

多输入/输出串联调用
多输入/输出串联调用本质是不局限于将第一次生成的结果作为第二次的输入变量,也可以将第一生成的中间结果抽象成最终输出结果。
代码实现

TransformChain: 处理超长文本的转换链

对于简单的大模型应用,单独使用语言模型(LLMs)是可以的。但更复杂的大模型应用需要将 LLMs 和 Chat Models 链接在一起 - 要么彼此链接,要么与其他组件链接。LangChain 为这种“链式”应用程序提供了 Chain 接口。LangChain 以通用方式定义了 Chain,它是对组件进行调用序列的集合,其中可以包含其他链。
转换链本质是将各种各样python的函数嵌套到transformChain内使其具备处理超文本的能力,然后transformChain与LLMChain以流水线的方式内化为SequentialChain的一部分,共同完成Summary。
超文本转化链

RouterChain: 实现条件判断的大模型调用

RouterChain实现条件判断的方式就是通过LLMRouterChain对不同输入进行条件判断,LLMChain A和LLMChain B就类似于条件判断的If ,else等实现不同功能的判断,然后将不同的输出结果作为output A和output B进行存储。
主要逻辑: 从prompt_infos创建多个LLMChain对象,并将它们保存在一个字典中,然后创建一个默认的ConversationChain,最后创建一个带有路由功能的MultiPromptChain。
实现条件判断的大模型调用
示例:实现文本摘要和翻译聊天助手
SequentialChain实现不同功能的视实现工作流。
技术路线

赋予应用记忆的能力:Memory

LangChain提供了许多用于向应用/系统中添加 Memory 的实用工具。这些工具可以单独使用,也可以无缝地集成到链中。
一个记忆系统(Memory System)需要支持两个基本操作:读取(READ)和写入(WRITE)。
每个链都定义了一些核心执行逻辑,并期望某些输入。其中一些输入直接来自用户,但有些输入可能来自 Memory。
在一个典型 Chain 的单次运行中,将与其 Memory System 进行至少两次交互:

  1. 在接收到初始用户输入之后,在执行核心逻辑之前,链将从其 Memory 中读取并扩充用户输入。
  2. 在执行核心逻辑之后但在返回答案之前,一个链条将把当前运行的输入和输出写入 Memory ,以便在未来的运行中可以引用它们。

Memory分为长期和短期记忆,短期记忆内容存储在内存和buffer中,表现出的特征为占用较小内存,记忆很少信息,而长期记忆就存储到向量数据库或其它数据库等位置。存储后就需要了解什么时候存储,什么时候调用存储内容?以及从哪里进行调用?主要基于相关内容的检索能力和存储路径等回调功能,例如关键词等。
Memory System
Memory System: 高度定制化
大模型模型内置了Memory的功能后,就可以实现将系统能力加以扩展,实现基于应用场景设置自定义的Memory 系统。
定制化的Memory系统

框架原生的数据处理流:Data Connection

框架原生的数据处理流的整个过程可以概括为:加载各种各样的数据源,然后通过Transform转化进入到Embedding Model,对于长文本处理,则这个转化过程可以理解为文本切割来满足输入内容的颗粒度在embedding model tokenizer的范围内,或未超过Embedding Model输入上限。然后将embedding model处理后的数据转变为向量并存储在向量数据库中以供用户检索。
框架原生的数据处理流Document Loaders: 快速接入各类数据源
使用文档加载器从源中加载数据作为文档。一个文档是一段文字和相关的元数据。
快速接入各类数据源
在快速接入各类数据源的过程中,数据源的格式多样化,包括:
典型数据格式:

  • CSV
  • HTML
  • JSON
  • Markdown
  • PDF
  • File Directory

部分典型数据源:

  • ArXiv
  • BiiBii
  • Discord
  • Figma
  • GitHub
  • Reddit
  • TensorFlow Datasets

加载好数据后,就需要两个重要的抽象BaseLoader 和 Document实现加载内容变成Document的列表。
Document类允许用户与文档的内容进行交互,可以查看文档的段落、摘要,以及使用查找功能来查询文档中的特定字符串。
BaseLoader 类定义了如何从不同的数据源加载文档,并提供了一个可选的方法来分割加载的文档。使用这个类作为基础,开发者可以为特定的数据源创建自定义的加载器,并确保所有这些加载器都提供了加载数据的方法。load_and_split方法还提供了一个额外的功能,可以根据需要将加载的文档分割为更小的块。
ArxivLoader 类专门用于从Arxiv平台获取文档。用户提供一个搜索查询,然后加载器与Arxiv API交互,以检索与该查询相关的文档列表。这些文档然后以标准的Document格式返回。
UnstructuredURLLoader 加载网页内容:使用非结构化分区函数(Unstructured)来检测MIME类型并将文件路由到适当的分区器(partitioner)。支持两种模式运行加载程序:“single"和"elements”。如果使用"single"模式,文档将作为单个langchain Document对象返回。如果使用"elements"模式,非结构化库将把文档拆分成标题和叙述文本等元素。
向量数据库
向量数据库的价值和定位主要体现在两个最常见的场景,一个是作为第二大脑提供需要补充的知识,第二个就是提供一个缓存能力。从而在LangChain生态中可以很好对接到其他功能模块形成一种应用,比如RAG。其本质为存储和搜索非结构化数据最常见的方法之一是将其嵌入并存储生成的嵌入向量,然后在查询时将非结构化查询进行嵌入,并检索与嵌入查询“最相似”的嵌入向量。可以理解为在Load、transform、Embedding过程中将各种各样的数据源从原始数据转变为向量库内的数据。从而将实际使用场景里的Query转变为Embedding的结果并作为语义信息存储在向量数据库,再通过高维空间的数学方法将语义信息解码为一种概率,检索时计算相似度的相关概率定位及反馈对应语义信息。
向量数据库最佳实践
Text Embedding Models
Embeddings类是一个专门用于与文本嵌入模型进行交互的类。有许多嵌入模型提供者(OpenAI、Cohere、Hugging Face等)

  • 这个类旨在为所有这些提供者提供一个标准接口。

嵌入将一段文本创建成向量表示。这非常有用,因为它意味着我们可以在向量空间中思考文本,并且可以执行语义搜索等操作,在向量空间中寻找最相似的文本片段。
LangChain中基础的Embeddings类公开了两种方法:一种用于对文档进行嵌入,另一种用于对查询进行嵌入。前者输入多个文本,而后者输入单个文本。之所以将它们作为两个独立的方法,是因为某些嵌入提供者针对要搜索的文件和查询(搜索查询本身)具有不同的嵌入方法。

  1. Document 类:Document的类,允许用户与文档的内容进行交互,可以查看文档的段落、摘要,以及使用查找功能来查询文档中的特定字符串。
  2. 使用 OpenAIEmbeddings 调用 OpenAI 嵌入模型
  • 使用 embed_documents 方法嵌入文本列表
  • 使用 embed_query 方法嵌入问题

Retrieves: 数据检索器
从向量数据库中检索信息关键在于检索效率和检索方法。

  • Amazon Kendra
  • Arxiv
  • Azure Cognitive Search
  • BM25
  • Chaindesk
  • ChatGPT Plugin
  • Cohere Reranker
  • DocArray Retriever
  • KNN
  • LOTR (Merger Retriever)
  • Metal
  • Pinecone Hybrid Search
  • PubMed
  • RePhraseQueryRetriever
  • SVM
  • TF-IDF
  • Vespa
  • Weaviate Hybrid Search
  • Wikipedia
  • Zep
    Retrieves: 数据检索器

LangChain Data 生态

LangChain Data 生态

LangChain 基于知识库的对话机器人最佳实践

LangChain 基于知识库的对话机器人

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

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

相关文章

JDBC |封装JDBCUtils|PreparedStatement|事务|批处理|数据库连接池| Blob类型数据的读写|Apache—DBUtils简介

一.概述 在Java中,数据库存取技术可分为如下几类: JDBC直接访问数据库JDO技术(Java Data Object)第三方O/R工具,如Hibernate, Mybatis 等 JDBC是java访问数据库的基石,JDO, Hibernate等只是更好的封装了J…

计算多图的等价无向图的邻接链表表示

计算多图的等价无向图的邻接链表表示 摘要:一、引言二、算法思路三、伪代码实现四、C代码实现五、算法分析六、结论摘要: 在图论中,多图(Multigraph)是一种允许边重复以及存在自循环边(即一个顶点到其自身的边)的图。给定一个多图的邻接链表表示,本文旨在探讨如何构造…

用EA和SysML一步步建模(03)创建包图和包的关系

用EA和SysML一步步建模的操作指南(01) 用EA和SysML一步步建模(02)导入ISO-80000 接下来,按照下图添加上其他的包: 步骤 2.2 选中Browser中的“蒸馏器项目”,点击New Package(Br…

windows C++ 并行编程-C++ AMP 图形(二)

文中的"显存"还没有找到合适的中文翻译,它的英文名称是texture, 在应用开发者来看,texture是一个名词,在物理上指的是 GPU显存中一段连续的空间。 读取显存对象 可以使用 texture::operator[]、texture::operator() 运算符或 texture::get 方…

物流需求回复势头稳定,目前全国社会物流总额达197.7万亿元

中国物流与采购联合会29日公布今年1-7月份物流运行数据。数据显示,物流需求恢复势头基本稳定,7月份虽受部分地区高温多雨等短期因素扰动,但物流总额增速环比有所提升,呈现温和回升态势。 今年1-7月份,全国社会物流总额…

数据仓库系列17:元数据管理在数据仓库中的作用是什么?

想象一下,你正在管理一个巨大的图书馆,里面存放着数以万计的书籍。但是,这个图书馆没有任何目录、索引或分类系统。你能想象找到特定的一本书会有多困难吗?这就是没有元数据管理的数据仓库的真实写照。 目录 什么是元数据?元数据管理的重要性元数据在数据仓库中的类型1. 技术…

Open3D mesh Taubin滤波

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 参数详解 返回值 2.2完整代码 三、实现效果 3.1加入噪声的mesh 3.2Taubin迭代10次 3.3Taubin迭代100次 Open3D点云算法汇总及实战案例汇总的目录地址: Open3D点云算法与点云…

【学习笔记】卫星通信发展趋势

卫星通信系统是融合现代通信技术、航天技术与计算机技术的综合应用,已成为国际与国内通信、国防、移动通信及广播电视领域的关键基础设施。基于其频带宽度大、通信容量高、业务兼容性强、覆盖范围广、性能稳定、地理条件适应性高及成本与距离无关等特性,…

猫咪浮毛不再乱飞 希喂、霍尼韦尔、352宠物空气净化器功能实测

“你真的养猫了吗?为什么一点也看不出来?”养宠以来我经常收到这样的提问,原因是另一位铲屎官身上总会时不时出现猫咪毛发,标记着他的身份。哪有不会掉毛的猫咪呢,何况到了夏天,换毛季的掉毛量更是惊人。其…

KTV开台源码--SAAS本地化及未来之窗行业应用跨平台架构

一、ktv开台源码 function 未来之窗_人工智能_KTV开台(title,桌台id,类型id,类型名称){var 未来之窗app_通用ID"未来之城激光加工机";var 未来之窗_人工智能_内容 tpl_未来之窗_模板_KTV开单;CyberWin_Dialog.layer(未来之窗_人工智能_内容,{type:"frame",…

Kubernetes 网关流量管理:Ingress 与 Gateway API

引言 随着 Kubernetes 在云原生领域的广泛使用,流量管理成为了至关重要的一环。为了有效地管理从外部流入集群的流量,Kubernetes 提供了多种解决方案,其中最常见的是 Ingress 和新兴的 Gateway API。 Ingress 随着微服务架构的发展&#x…

【手撕数据结构】二叉树的性质

目录 叶子节点和边的性质概念小试牛刀 叶子节点和边的性质 概念 可以看到度为0的节点如F没有边,度为1的节点如C有一条边,而度为2的节点如B有两条边。那么设度为2的节点为a个,度为1的节点为b个。二叉树边 2ab另⼀⽅⾯,由于共有 a…

反激式开关电源(硬件面试86题 电源专栏)

在硬件面试经典中的第 86 题中提到的反激式开关电源,是通过开关通断将交流转变成直流的 AD-DC 开关电源的一种,并且反激式开关电源是由 BUCK-BOOST 电路演变而来,所以博客由浅入深一步一步讲解完反激式开关的知识,让我们开始吧&am…

未使用CMSIS之前的stm32标准库中SystemHandler的宏定义

背景: 在stm32的标准库还叫STM32F10xxx_FWLib_V2.0.3的那个年代 文件 STM32F10xFWLib_V2.0.3/FWLib/library/inc/stm32f10x_nvic.h 中有对System Handlers的定义。具体内容如下: /* System Handlers -------------------------------------------------…

【Python】2.基础语法(2)

文章目录 1.顺序语句2.条件语句2.1语法格式2.1.1 if2.1.2 if - else2.1.3 if - elif - else 2.2缩进和代码块2.3 空语句 pass 3. 循环语句3.1 while 循环3.2 for 循环3.3 continue3.4 break 4. 综合案例4.1 设置初始属性4.2 设置性别4.3 设置出生点4.4 针对每一岁, 生成人生经历…

【MySQL】主键优化原理篇——【数据组织方式&主键顺序插入&主键乱序插入&页分裂&页分裂】

前言 大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎! 本章主要内容面向接触过C Linux的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的…

AI搜索:重塑信息获取的新纪元

在信息爆炸的时代,如何快速、准确地获取所需信息成为了每个人面临的挑战。传统的搜索引擎虽然在一定程度上解决了这一问题,但广告干扰、结果冗余、内容质量参差不齐等问题仍让用户体验大打折扣。随着AI技术的不断发展,AI搜索产品以其独特的优…

【软件测试】bug以及测试用例的设计方法

系列文章目录 第一章 【软件测试】常见的开发模型和测试模型 文章目录 系列文章目录前言一、bug的基本要素。二、bug的处理流程三、弱网测试四、设计方法1.基于需求的设计方法2.具体的测试方法(1)等价类划分法(2)边界值分析法&am…

Serilog文档翻译系列(三) - 基础配置

Serilog 使用简单的 C# API 来配置日志记录。当需要外部配置时,可以(慎用)通过使用 Serilog.Settings.AppSettings 包或 Serilog.Settings.Configuration 包进行混合配置。 创建日志记录器 日志记录器是通过 LoggerConfiguration 对象创建的…

STM32硬件篇:W25Q64

W25Q64简介 W25Qxx系列是一种低成本、小型化、使用简单(使用SPI通信协议)的非易失性(掉电不丢失)存储器,常用于数据存储、字库存储、固件程序存储等场景。 【注意】W25Qxx芯片只支持SPI的模式0和模式3。 存储介质&am…