LangChain基础知识入门

LangChain的介绍和入门


在这里插入图片描述

1 什么是LangChain

在这里插入图片描述

LangChain由 Harrison Chase 创建于2022年10月,它是围绕LLMs(大语言模型)建立的一个框架,LLMs使用机器学习算法和海量数据来分析和理解自然语言,GPT3.5、GPT4是LLMs最先进的代表,国内百度的文心一言、阿里的通义千问也属于LLMs。LangChain自身并不开发LLMs,它的核心理念是为各种LLMs实现通用的接口,把LLMs相关的组件“链接”在一起,简化LLMs应用的开发难度,方便开发者快速地开发复杂的LLMs应用。LangChain目前有两个语言的实现:Python和Node.js


我们从两个方面全面介绍LangChain:一个是LangChain组件的基本概念和应用;另一个是LangChain常见的使用场景。


2 LangChain主要组件

在这里插入图片描述

一个LangChain的应用是需要多个组件共同实现的,LangChain主要支持6种组件:

  • Models:模型,各种类型的模型和模型集成,比如GPT-4
  • Prompts:提示,包括提示管理、提示优化和提示序列化
  • Memory:记忆,用来保存和模型交互时的上下文状态
  • Indexes:索引,用来结构化文档,以便和模型交互
  • Chains:链,一系列对各种组件的调用
  • Agents:代理,决定模型采取哪些行动,执行并且观察流程,直到完成为止

2.1 Models

现在市面上的模型多如牛毛,各种各样的模型不断出现,LangChain模型组件提供了与各种模型的集成,并为所有模型提供一个精简的统一接口。

LangChain目前支持三种类型的模型:LLMs、Chat Models(聊天模型)、Embeddings Models(嵌入模型).

  • LLMs: 大语言模型接收文本字符作为输入,返回的也是文本字符.

  • 聊天模型: 基于LLMs, 不同的是它接收聊天消(一种特定格式的数据)作为输入,返回的也是聊天消息.

  • 文本嵌入模型: 文本嵌入模型接收文本作为输入, 返回的是浮点数列表.

LangChain支持的三类模型,它们的使用场景不同,输入和输出不同,开发者需要根据项目需要选择相应。


2.1.1 LLMs (大语言模型)

LLMs使用场景最多,常用大模型的下载库:https://huggingface.co/models:

接下来我们以GPT模型为例, 使用该类模型的组件:

  • 第一步:安装必备的工具包:langchain和openai
pip install openai==0.28
pip install langchain

注意,在使用openai模型之前,必须开通OpenAI API服务,需要获得API Token。

  • 第二步:申请API Token
  • 第三部:代码实现
# 导入OpenAI模型
from langchain.llms import OpenAI
import os
os.environ["OPENAI_API_KEY"] = "你的OpenAI API token"
llm = OpenAI(model_name="text-davinci-003", n=2, temperature=0.3)
llm("给我讲一个笑话")
# 答案:一个猴子去河里洗澡,洗完后他看见自己的影子,他觉得自己太瘦了,于是他又把头放进河里洗了一遍!

# 使用generate方法可以同时接收多个输入,并且返回token使用信息
llm.generate(["给我讲一个故事", "给我讲一个笑话"])
# 答案:# generations=[
#   [Generation(text='\n\n一个叫玛丽的小女孩,有一只叫毛毛的小猫。\n\n每天晚上,玛丽都会和毛毛一起玩耍,一起跳舞,一起唱歌,一起玩游戏。\n\n有一天,玛丽和毛毛一起去海边玩,突然,毛毛被一只海鸥抓走了。玛丽非常伤心,她跑到海边哭了起来,哭着喊着毛毛的', 
#       generation_info={'finish_reason': 'length', 'logprobs': None}),
#     Generation(text='\n\n一个叫小明的男孩,他很喜欢探险。有一天,他和他的朋友们一起去森林里玩,突然,他发现一个洞穴,他非常好奇,于是他决定去看看洞穴里面到底有什么。\n\n他走进洞穴,里面黑暗而又潮湿,他继续前行,突然,他看到一只大老虎,它正在吃一只小兔子。', 
#       generation_info={'finish_reason': 'length', 'logprobs': None})], 
#   [Generation(text='\n\n两个熊在森林里走,一个熊说:“嘿,你知道为什么树林里没有路吗?”另一个熊回答:“不知道,为什么?”第一个熊说:“因为它们都在绕树林跑!”', generation_info={'finish_reason': 'stop', 'logprobs': None}), Generation(text='\n\n两个熊在森林里拔萝卜,一个熊拔出一个萝卜,另一个熊说:“你拔的太慢了,我拔的快一点!”', 
#       generation_info={'finish_reason': 'stop', 'logprobs': None})]
2.1.2 Chat Models (聊天模型)

聊天消息包含下面几种类型,使用时需要按照约定传入合适的值:

  • AIMessage: 用来保存LLM的响应,以便在下次请求时把这些信息传回给LLM.
  • HumanMessage: 发送给LLMs的提示信息,比如“实现一个快速排序方法”.
  • SystemMessage: 设置LLM模型的行为方式和目标。你可以在这里给出具体的指示,比如“作为一个代码专家”,或者“返回json格式”.
  • ChatMessage: ChatMessage可以接收任意形式的值,但是在大多数时间,我们应该使用上面的三种类型.

LangChain支持的常见聊天模型有:

模型描述
ChatOpenAIOpenAI聊天模型
AzureChatOpenAIAzure提供的OpenAI聊天模型
PromptLayerChatOpenAI基于OpenAI的提示模版平台

举例说明:

from langchain.chat_models import ChatOpenAI
from langchain.schema import (
    AIMessage,
    HumanMessage,
    SystemMessage
)
import os
os.environ["OPENAI_API_KEY"] = "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"

chat = ChatOpenAI(temperature=0)

messages = [
        SystemMessage(content="返回json object,不要纯文本,按照每项参数拆分,不要说明和解释信息"),
        HumanMessage(content="告诉我model Y汽车的尺寸参数")
]

print(chat(messages))
# 答案:# content='{\n "车长": "4,750 mm",\n "车宽": "1,921 mm",\n "车高": "1,624 mm",\n "轴距": "2,890 mm",\n "最小离地间隙": "162 mm",\n "行李箱容积": "1,900 L"\n}' additional_kwargs={} example=False
2.1.3 提示模板

在上面的例子中,模型默认是返回纯文本结果的,如果需要返回json格式,需要不断优化SystemMessage。那么有什么简单的方式快速让模型返回想要的数据呢?就是提示模版。

提示模板就是把一些常见的提示整理成模板,用户只需要修改模板中特定的词语,就能快速准确地告诉模型自己的需求。我们看个例子:

第一步:导入依赖

from langchain.chat_models import ChatOpenAI
from langchain.prompts import (
    ChatPromptTemplate,
    PromptTemplate,
    SystemMessagePromptTemplate,
    AIMessagePromptTemplate,
    HumanMessagePromptTemplate,
)
from langchain.schema import (
    AIMessage,
    HumanMessage,
    SystemMessage
)

第二步:实现提示模板:

system_template="你是一个把{input_language}翻译成{output_language}的助手"
system_message_prompt = SystemMessagePromptTemplate.from_template(system_template)
human_template="{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)

chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
messages = chat_prompt.format_prompt(input_language="英语", output_language="汉语", text="I love programming.")

print(messages)
#messages=[SystemMessage(content='你是一个把英语翻译成汉语的助手', additional_kwargs={}), HumanMessage(content='I love programming.', additional_kwargs={}, example=False)]
chat = ChatOpenAI(temperature=0)

print(chat(messages.to_messages()))

# content='我喜欢编程。' additional_kwargs={} example=False
2.1.4 Embeddings Models(嵌入模型)

在这里插入图片描述

Embeddings Models特点:将字符串作为输入,返回一个浮动数的列表。在NLP中,Embedding的作用就是将数据进行文本向量化。

Embeddings Models可以为文本创建向量映射,这样就能在向量空间里去考虑文本,执行诸如语义搜索之类的操作,比如说寻找相似的文本片段。

接下来我们以一个OpenAI文本嵌入模型的例子进行说明:

from langchain.embeddings import OpenAIEmbeddings
open_embed = OpenAIEmbeddings()
text = "这是一个测试文档。"

query_result = open_embed.embed_query(text)
doc_result = open_embed.embed_documents([text])

print(query_result)
# [-0.009422866627573967, 0.004315766040235758, 0.002380653750151396,  ...]

上述代码中,我们分别使用了两种方法来进行文本的向量表示,他们最大不同在于:embed_query()接收一个字符串的输入,而embed_documents可以接收一组字符串。

LangChain集成的文本嵌入模型有:

  • AzureOpenAI、Cohere、Hugging Face Hub、OpenAI、Llama-cpp、SentenceTransformers

2.2 Prompts

Prompt是指当用户输入信息给模型时加入的提示,这个提示的形式可以是zero-shot或者few-shot等方式,目的是让模型理解更为复杂的业务场景以便更好的解决问题。

提示模板:如果你有了一个起作用的提示,你可能想把它作为一个模板用于解决其他问题,LangChain就提供了PromptTemplates组件,它可以帮助你更方便的构建提示。

zero-shot提示方式:

from langchain import PromptTemplate
from langchain.llms import OpenAI

template = "我的邻居姓{lastname},他生了个儿子,给他儿子起个名字"

prompt = PromptTemplate(
    input_variables=["lastname"],
    template=template,
)

prompt_text = prompt.format(lastname="王")
# result: 我的邻居姓王,他生了个儿子,给他儿子起个名字

# 调用OpenAI
llm = OpenAI(temperature=0.9)
print(llm(prompt_text))

# 叫王爱慕。

few-shot提示方式:

from langchain import PromptTemplate, FewShotPromptTemplate
from langchain.llms import OpenAI

examples = [
    {"word": "开心", "antonym": "难过"},
    {"word": "高", "antonym": "矮"},
]

example_template = """
单词: {word}
反义词: {antonym}\\n
"""

example_prompt = PromptTemplate(
    input_variables=["word", "antonym"],
    template=example_template,
)

few_shot_prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=example_prompt,
    prefix="给出每个单词的反义词",
    suffix="单词: {input}\\n反义词:",
    input_variables=["input"],
    example_separator="\\n",
)

prompt_text = few_shot_prompt.format(input="粗")
print(prompt_text)

# 给出每个单词的反义词
# 单词: 开心
# 反义词: 难过

# 单词: 高
# 反义词: 矮

# 单词: 粗
# 反义词:

# 调用OpenAI
llm = OpenAI(temperature=0.9)
print(llm(prompt_text))

# 细

2.3 Chains(链)

在LangChain中,Chains描述了将LLM与其他组件结合起来完成一个应用程序的过程.

针对上一小节的提示模版例子,zero-shot里面,我们可以用链来连接提示模版组件和模型,进而可以实现代码的更改:

from langchain import PromptTemplate
from langchain.llms import OpenAI
from langchain.chains import LLMChain
# 定义模板
template = "我的邻居姓{lastname},他生了个儿子,给他儿子起个名字"

prompt = PromptTemplate(
    input_variables=["lastname"],
    template=template,
)
llm = OpenAI(temperature=0.9)

chain = LLMChain(llm = llm, 
                  prompt = prompt)
# 执行链
print(chain.run("王"))
# 可以叫王子,也可以叫小王或者小王子等。。

如果你想将第一个模型输出的结果,直接作为第二个模型的输入,还可以使用LangChain的SimpleSequentialChain, 代码如下:

from langchain import PromptTemplate
from langchain.llms import OpenAI
from langchain.chains import LLMChain, SimpleSequentialChain
# 创建第一条链
template = "我的邻居姓{lastname},他生了个儿子,给他儿子起个名字"

first_prompt = PromptTemplate(
    input_variables=["lastname"],
    template=template,
)
llm = OpenAI(temperature=0.9)

first_chain = LLMChain(llm = llm, prompt = first_prompt)

# 创建第二条链
second_prompt = PromptTemplate(
    input_variables=["child_name"],
    template="邻居的儿子名字叫{child_name},给他起一个小名",
)

second_chain = LLMChain(llm=llm, prompt=second_prompt)


# 链接两条链 
overall_chain = SimpleSequentialChain(chains=[first_chain, second_chain], verbose=True)

# 执行链,只需要传入第一个参数
catchphrase = overall_chain.run("王")

2.4 Agents (代理)

在 LangChain 中 Agents 的作用就是根据用户的需求,来访问一些第三方工具(比如:搜索引擎或者数据库),进而来解决相关需求问题。

为什么要借助第三方库?

  • 因为大模型虽然非常强大,但是也具备一定的局限性,比如不能回答实时信息、处理数学逻辑问题仍然非常的初级等等。因此,可以借助第三方工具来辅助大模型的应用。

几个重要的概念:

  • 代理:

    • 负责控制整段代码的逻辑和执行,代理暴露了一个接口,用来接收用户输入,并返回AgentAction或AgentFinish。
    • AgentAction决定使用哪个工具
    • AgentFinish意味着代理的工作完成了,返回给用户结果。
  • 工具:

    • 第三方服务的集成,比如谷歌、bing等等
  • 工具包:

    • 一些集成好了代理包,比如create_csv_agent 可以使用模型解读csv文件。

    • 模型解决csv文件示例:

    from langchain.agents import create_csv_agent
    from langchain.llms import OpenAI
    agent = create_csv_agent(OpenAI(temperature=0), 'data.csv', verbose=True)
    agent.run("一共有多少行数据?")
    
  • 代理执行器:

    • 负责迭代运行代理的循环,直到满足停止的标准。

现在我们实现一个使用代理的例子:假如我们在北京,想让大语言模型告诉我们明天穿什么衣服,由于大语言模型不知道明天的天气,我们借助于serpapi 来查询天气,并传递给模型,代码如下:

from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.llms import OpenAI

llm = OpenAI(temperature=0)
tools = load_tools(["serpapi"], llm=llm)
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)

agent.run("明天在北京穿什么衣服合适?")

要注意的是,运行这个示例需要申请serpapi token,并且设置到环境变量SERPAPI_API_KEY ,然后安装依赖包google-search-results

LangChain支持的工具如下:

工具描述
Bing SearchBing搜索
Google SearchGoogle搜索
Google Serper API一个从google搜索提取数据的API
Python REPL执行python代码
Requests执行python代码

2.5 Memory

大模型本身不具备上下文的概念,它并不保存上次交互的内容,ChatGPT之所以能够和人正常沟通对话,因为它进行了一层封装,将历史记录回传给了模型。

因此 LangChain 也提供了Memory组件, Memory分为两种类型:短期记忆和长期记忆。短期记忆一般指单一会话时传递数据,长期记忆则是处理多个会话时获取和更新信息。

目前的Memory组件只需要考虑ChatMessageHistory。举例分析:

from langchain.memory import ChatMessageHistory

history = ChatMessageHistory()
history.add_user_message("在吗?")
history.add_ai_message("有什么事?")

print(history.messages)

# [HumanMessage(content='在吗?', additional_kwargs={}), AIMessage(content='有什么事?', additional_kwargs={})]

和OpenAI结合,直接使用ConversationChain

from langchain import ConversationChain
from langchain.llms import OpenAI

llm = OpenAI(temperature=0)
conversation = ConversationChain(llm=llm, verbose=True)
conversation.predict(input="小明有1只猫")
conversation.predict(input="小刚有2只狗")
conversation.predict(input="小明和小刚一共有几只宠物?")

如果要像chatGPT一样,长期保存历史消息,,可以使用messages_to_dict 方法

from langchain.memory import ChatMessageHistory
from langchain.schema import messages_from_dict, messages_to_dict

history = ChatMessageHistory()
history.add_user_message("hi!")
history.add_ai_message("whats up?")

dicts = messages_to_dict(history.messages)

print(dicts)
# [{'type': 'human', 'data': {'content': 'hi!', 'additional_kwargs': {}}},
# {'type': 'ai', 'data': {'content': 'whats up?', 'additional_kwargs': {}}}]
# 读取历史消息
new_messages = messages_from_dict(dicts)

print(new_messages)
#[HumanMessage(content='hi!', additional_kwargs={}),
# AIMessage(content='whats up?', additional_kwargs={})]

2.6 Indexes (索引)

在这里插入图片描述

Indexes组件的目的是让LangChain具备处理文档处理的能力,包括:文档加载、检索等。注意,这里的文档不局限于txt、pdf等文本类内容,还涵盖email、区块链、视频等内容。

Indexes组件主要包含类型:

  • 文档加载器
  • 文本分割器
  • VectorStores
  • 检索器

2.6.1 文档加载器

文档加载器主要基于Unstructured 包,Unstructured 是一个python包,可以把各种类型的文件转换成文本。

文档加载器使用起来很简单,只需要引入相应的loader工具:

from langchain.document_loaders import TextLoader
loader = TextLoader('../state_of_the_union.txt', encoding='utf8')
documents = loader.load()

LangChain支持的文档加载器 (部分):

文档加载器描述
CSVCSV问价
JSON Files加载JSON文件
Jupyter Notebook加载notebook文件
Markdown加载markdown文件
Microsoft PowerPoint加载ppt文件
PDF加载pdf文件
Images加载图片
File Directory加载目录下所有文件
HTML网页
2.6.2 文档分割器

由于模型对输入的字符长度有限制,我们在碰到很长的文本时,需要把文本分割成多个小的文本片段。

文本分割最简单的方式是按照字符长度进行分割,但是这会带来很多问题,比如说如果文本是一段代码,一个函数被分割到两段之后就成了没有意义的字符,所以整体的原则是把语义相关的文本片段放在一起。

LangChain中最基本的文本分割器是CharacterTextSplitter ,它按照指定的分隔符(默认“\n\n”)进行分割,并且考虑文本片段的最大长度。我们看个例子:

from langchain.text_splitter import CharacterTextSplitter

# 初始字符串
state_of_the_union = "..."

text_splitter = CharacterTextSplitter(        
    separator = "\\n\\n",
    chunk_size = 1000,
    chunk_overlap  = 200,
    length_function = len,
)

texts = text_splitter.create_documents([state_of_the_union])

除了CharacterTextSplitter分割器,LangChain还支持其他文档分割器 (部分):

文档加载器描述
LatexTextSplitter沿着Latex标题、标题、枚举等分割文本。
MarkdownTextSplitter沿着Markdown的标题、代码块或水平规则来分割文本。
TokenTextSplitter根据openAI的token数进行分割
PythonCodeTextSplitter沿着Python类和方法的定义分割文本。
2.6.3 VectorStores

VectorStores是一种特殊类型的数据库,它的作用是存储由嵌入创建的向量,提供相似查询等功能。我们使用其中一个Chroma 组件作为例子:

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma

# pku.txt内容:<https://www.pku.edu.cn/about.html>
with open('./pku.txt') as f:
    state_of_the_union = f.read()
text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=0)
texts = text_splitter.split_text(state_of_the_union)

embeddings = OpenAIEmbeddings()

docsearch = Chroma.from_texts(texts, embeddings)

query = "1937年北京大学发生了什么?"
docs = docsearch.similarity_search(query)
print(docs)

LangChain支持的VectorStore如下:

VectorStore描述
Chroma一个开源嵌入式数据库
ElasticSearchElasticSearch
Milvus用于存储、索引和管理由深度神经网络和其他机器学习(ML)模型产生的大量嵌入向量的数据库
Redis基于redis的检索器
FAISSFacebook AI相似性搜索服务
Pinecone一个具有广泛功能的向量数据库
2.6.4 检索器

检索器是一种便于模型查询的存储数据的方式,LangChain约定检索器组件至少有一个方法get_relevant_texts,这个方法接收查询字符串,返回一组文档。

from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings

loader = TextLoader('../../../state_of_the_union.txt')
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
embeddings = OpenAIEmbeddings()

db = FAISS.from_documents(texts, embeddings)
retriever = db.as_retriever()
docs = retriever.get_relevant_documents("what did he say about ketanji brown jackson")

LangChain支持的检索器组件如下:

检索器介绍
Azure Cognitive Search RetrieverAmazon ACS检索服务
ChatGPT Plugin RetrieverChatGPT检索插件
DataberryDataberry检索
ElasticSearch BM25ElasticSearch检索器
MetalMetal检索器
Pinecone Hybrid SearchPinecone检索服务
SVM RetrieverSVM检索器
TF-IDF RetrieverTF-IDF检索器
VectorStore RetrieverVectorStore检索器
Vespa retriever一个支持结构化文本和向量搜索的平台
Weaviate Hybrid Search一个开源的向量搜索引擎
Wikipedia支持wikipedia内容检索

3 LangChain使用场景

在这里插入图片描述

  • 个人助手
  • 基于文档的问答系统
  • 聊天机器人
  • Tabular数据查询
  • API交互
  • 信息提取
  • 文档总结

小结

主要对LangChain框架基础知识介绍,我们对LangChain有一个初步认识,了解LangChain的使用场景。

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

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

相关文章

打字侠是一款PWA网站,如何下载到电脑桌面?

嘿&#xff0c;亲爱的键盘侠们&#xff01; 你是否还在为寻找一款好用的打字练习工具而烦恼&#xff1f;别担心&#xff0c;今天我要给大家介绍一位超级英雄——打字侠&#xff01;它不仅是一个超级酷的打字练习网站&#xff0c;还是一款PWA&#xff08;渐进式网页应用&#x…

汇编:结构体

在32位汇编中&#xff0c;结构体&#xff08;structures&#xff09;用于组织和管理复杂的数据类型&#xff0c;结构体可以包含多个不同类型的数据项&#xff08;成员&#xff09;&#xff1b;在MASM&#xff08;Microsoft Macro Assembler&#xff09;中&#xff0c;使用结构体…

stm32编写Modbus步骤

1. modbus协议简介&#xff1a; modbus协议基于rs485总线&#xff0c;采取一主多从的形式&#xff0c;主设备轮询各从设备信息&#xff0c;从设备不主动上报。 日常使用都是RTU模式&#xff0c;协议帧格式如下所示&#xff1a; 地址 功能码 寄存器地址 读取寄存器…

电子设计入门教程硬件篇之集成电路IC(二)

前言&#xff1a;本文为手把手教学的电子设计入门教程硬件类的博客&#xff0c;该博客侧重针对电子设计中的硬件电路进行介绍。本篇博客将根据电子设计实战中的情况去详细讲解集成电路IC&#xff0c;这些集成电路IC包括&#xff1a;逻辑门芯片、运算放大器与电子零件。电子设计…

汇编语言LDS指令

在8086架构的实模式下&#xff0c;LDS指令&#xff08;Load Pointer Using DS&#xff09;用于从内存中加载一个32位的指针到指定寄存器和DS寄存器。我们来详细解释一下这条指令为什么会修改DS段寄存器。 LDS指令的功能 LDS指令格式如下&#xff1a; LDS destination, sourc…

Python中报错提示:TypeError: Student() takes no arguments

Python中报错提示&#xff1a;TypeError: Student() takes no arguments 在Python编程中&#xff0c;类是创建对象的蓝图。每个类都可能包含一个特殊的方法__init__&#xff0c;我们称之为构造函数&#xff0c;它在创建新实例时被调用。如果你在尝试创建一个类的实例时遇到了Ty…

找寻窗口句柄

FindWindow FindWindow这个函数检索顶级窗口的类名和窗口名称匹配指定的字符串。这个函数不搜索子窗口。 该函数是个宏&#xff0c;定义如下 #ifdef UNICODE #define FindWindow FindWindowW #else #define FindWindow FindWindowA #endif // !UNICODE ​​​​​​FindW…

SpringBoot快速整合MyBatisPlus

文章目录 创建项目配置pom.xml配置数据源创建实体类创建Mapper接口配置MyBatis Plus MyBatis Plus 是 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上进行扩展和增强&#xff0c;主要目标是简化开发、提高效率。它提供了一系列功能&#xff0c;包括 CRUD 封装、条件构造器…

#01 Stable Diffusion基础入门:了解AI图像生成

文章目录 前言什么是Stable Diffusion?Stable Diffusion的工作原理如何使用Stable Diffusion?Stable Diffusion的应用场景结论 前言 在当今迅速发展的人工智能领域&#xff0c;AI图像生成技术以其独特的魅力吸引了广泛的关注。Stable Diffusion作为其中的一项前沿技术&#…

k8s概述

文章目录 一、什么是Kubernetes1、官网链接2、概述3、特点4、功能 二、Kubernetes架构1、架构图2、核心组件2.1、控制平面组件&#xff08;Control Plane Components&#xff09;2.1.1、kube-apiserver2.1.2、etcd2.1.3、kube-scheduler2.1.4、kube-controller-manager 2.2、No…

计算机操作系统基础知识:操作系统体系结构图,操作系统的内核,大内核与微内核的区别和优缺点,时钟管理,原语

1.操作系统体系结构图&#xff1a; 2.操作系统的内核&#xff1a; 时钟管理&#xff1a;利用时钟中断实现计时功能。 原语&#xff1a;原语是一种特殊的程序&#xff0c;具有原子性。也就是说&#xff0c;这段程序运行必须一气呵成&#xff0c;不能被中断。 ubuntu、centos的…

计算机毕业设计 | SpringBoot+vue的教务管理系统

1&#xff0c;绪论 1.1 项目背景 在这个资讯高度发展的时代&#xff0c;资讯管理变革已经是一个更为宽泛、更为全面的潮流。为了保证中国的可持续发展&#xff0c;随着信息化技术的不断进步&#xff0c;教务管理体系也在不断完善。与此同时&#xff0c;伴随着信息化的飞速发展…

FastAPI系列 4 -路由管理APIRouter

FastAPI系列 -路由管理APIRouter 文章目录 FastAPI系列 -路由管理APIRouter一、前言二、APIRouter使用示例1、功能拆分2、users、books模块开发3、FastAPI主体 三、运行结果 一、前言 未来的py开发者请上座&#xff0c;在使用python做为后端开发一个应用程序或 Web API&#x…

jmeter性能优化之mysql配置

一、连接数据库和grafana 准备&#xff1a;连接好数据库和启动grafana并导入mysql模板 大批量注册、登录、下单等&#xff0c;还有过节像618&#xff0c;双11和数据库交互非常庞大&#xff0c;都会存在数据库的某一张表里面&#xff0c;当用户在登录或者查询某一个界面时&…

心链14-----项目功能完善补坑+自动跳转登录页 + 重复加入队伍问题(分布式锁) 并发请求问题解决 + 项目部署上线

心链 — 伙伴匹配系统 一、todo 1、强制登录&#xff0c;自动跳转到登录页 解决&#xff1a;axios 全局配置响应拦截、并且添加重定向 1.在myAxios里配置响应拦截 这里我们要改变history 模式的实现&#xff0c;在main.ts里修改 当登录成功后&#xff0c;重定向到个人用户页…

LangChain + ChatGLM 实现本地知识库问答

基于LangChain ChatGLM 搭建融合本地知识的问答机器人 1 背景介绍 近半年以来&#xff0c;随着ChatGPT的火爆&#xff0c;使得LLM成为研究和应用的热点&#xff0c;但是市面上大部分LLM都存在一个共同的问题&#xff1a;模型都是基于过去的经验数据进行训练完成&#xff0c;无…

《精通ChatGPT:从入门到大师的Prompt指南》附录C:专业术语表

附录C&#xff1a;专业术语表 本附录旨在为读者提供一本全面的术语表&#xff0c;帮助理解《精通ChatGPT&#xff1a;从入门到大师的Prompt指南》中涉及的各种专业术语。无论是初学者还是高级用户&#xff0c;这些术语的定义和解释将为您在使用ChatGPT时提供重要参考。 A AI&…

【数据结构与算法】使用单链表实现队列:原理、步骤与应用

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​ 目录 一、引言 &#x1f384;队列的概念 &#x1f384;为什么要用单链表实现队列 二、单…

深圳中赢娱乐控股集团至江西省宜春市袁州区访问交流

2024年6月7日&#xff0c;深圳中赢娱乐控股集团受邀来到江西省宜春市袁州区就“短剧文旅”项目展开深度座谈&#xff0c;并与飞剑潭乡达成合作意向。 下午2:30&#xff0c;深圳中赢控股集团董事李平进带团队一行12人&#xff0c;访问宜春市袁州区&#xff0c;宜春市副市长谢萍、…

《C++ Primer Plus》第十三章复习题和编程练习

目录 一、复习题**二、编程练习 一、复习题** 1. 派生类从基类那里继承了什么&#xff1f; 答&#xff1a;在类的继承和派生中&#xff0c;C中的派生类能够继承基类的所有数据成员和大部分成员函数。但是基类中不同访问控制权限的成员在派生中的访问权限也不相同。公有成员直…