【可能是全网最丝滑的LangChain教程】二十一、LangChain进阶之Memory

news2024/11/18 1:44:19

人生和电影不一样,人生要辛苦多了。

01 Memory介绍

Memory(记忆)是LangChain中的一个重要组成部分,它允许模型在处理请求时能够访问历史对话记录或其他相关上下文信息,从而使得对话更加连贯和自然。

LangChain Memory 的作用

  • 上下文管理:通过保存历史对话,模型可以基于之前的对话内容来生成更相关的响应。
  • 状态跟踪:对于需要持续跟踪用户状态的应用程序来说,Memory 可以帮助维护会话的状态信息。
  • 个性化体验:通过记录用户的偏好或历史选择,可以提供更加个性化的用户体验。
    在这里插入图片描述

02 如何使用

这里以ConversationBufferMemory为例,ConversationBufferMemory 是一种非常简单的内存形式,它只是将聊天消息列表保存在缓冲区中,并将它们传递到提示模板中。

from langchain.memory import ConversationBufferMemory

memory = ConversationBufferMemory()
memory.chat_memory.add_user_message("hi!")
memory.chat_memory.add_ai_message("what's up?")

在进入链之前,会从内存中读取各种变量。它们有特定的名称,需要与链预期的变量对齐。可以通过调用 memory.load_memory_variables({}) 来查看这些变量是什么。

memory.load_memory_variables({})

"""
{'history': "Human: hi!\nAI: what's up?"}
"""

在上面的示例中,可以看到 load_memory_variables 返回单个键 history。这意味着我们Prompt应该需要一个名为 history 的输入占位符。但是,也可以通过内存类上的参数(memory_key)来控制此变量。

memory = ConversationBufferMemory(memory_key="chat_history")
memory.chat_memory.add_user_message("hi!")
memory.chat_memory.add_ai_message("what's up?")

memory.load_memory_variables({})

"""
{'chat_history': "Human: hi!\nAI: what's up?"}
"""

默认情况下,memory 作为单个字符串返回。为了作为消息列表返回,您可以设置 return_messages=True

memory = ConversationBufferMemory(return_messages=True)
memory.chat_memory.add_user_message("hi!")
memory.chat_memory.add_ai_message("what's up?")

memory.load_memory_variables({})

"""
{'history': [HumanMessage(content='hi!'), AIMessage(content="what's up?")]}
"""

完整示例如下:

from langchain_core.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, MessagesPlaceholder, \
    HumanMessagePromptTemplate
from langchain_core.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory


# 使用LLM用如下格式的模板
# llm_model = OpenAI(temperature=0)
template = """You are a nice chatbot having a conversation with a human.

Previous conversation:
{chat_history}

New human question: {question}
Response:"""
prompt = PromptTemplate.from_template(template)

# 使用ChatModel用如下格式的模板
# chat_model = ChatOpenAI(temperature=0)
"""
prompt = ChatPromptTemplate(
    messages=[
        SystemMessagePromptTemplate.from_template(
            "You are a nice chatbot having a conversation with a human."
        ),
        # The `variable_name` here is what must align with memory
        MessagesPlaceholder(variable_name="chat_history"),
        HumanMessagePromptTemplate.from_template("{question}")
    ]
)
"""


# Notice that we need to align the `memory_key`
memory = ConversationBufferMemory(memory_key="chat_history",return_messages=True)
conversation = LLMChain(
    llm=llm_model,
    prompt=prompt,
    verbose=True,
    memory=memory
)

# Notice that we just pass in the `question` variables - `chat_history` gets populated by memory
conversation({"question": "hi"})

"""
{'question': 'hi',
 'chat_history': [HumanMessage(content='hi'),
  AIMessage(content='Hello! How can I help you today?')],
 'text': 'Hello! How can I help you today?'}
"""

conversation({"question": "I am learning about LangChain."})

"""
{'question': 'I am learning about LangChain.',
 'chat_history': [HumanMessage(content='hi'),
  AIMessage(content='Hello! How can I help you today?'),
  HumanMessage(content='I am learning about LangChain.'),
  AIMessage(content="That's great! LangChain is a powerful tool for building applications that interact with language models in complex ways. What aspects of LangChain are you exploring or do you have any specific questions about it?")],
 'text': "That's great! LangChain is a powerful tool for building applications that interact with language models in complex ways. What aspects of LangChain are you exploring or do you have any specific questions about it?"}
"""

03 LangChain中的内置Memory

Conversation Buffer

ConversationBufferMemory。此内存允许存储消息,然后在变量中提取消息。

Conversation Buffer Window

ConversationBufferWindowMemory。ConversationBufferWindowMemory 保留一段时间内对话的交互列表。它只使用最后的 K 个交互。这对于保持最新交互的滑动窗口非常有用,因此缓冲区不会变得太大。

ConversationBufferWindowMemory 是 LangChain 中的一种 Memory 类型,它通过维护一个固定大小的对话历史窗口来管理对话上下文。这种 Memory 类型特别适用于需要控制对话历史长度以避免内存过度消耗的场景。

ConversationBufferWindowMemory 的工作原理

  1. 对话缓冲区:它会存储最近的对话历史记录。
  2. 窗口大小:设置一个固定的窗口大小来限制对话历史的长度。
  3. 循环:随着新对话的进行,最新的对话会被添加到缓冲区,而最早的对话记录会被移除以保持窗口大小不变。
from langchain.chat_models import ChatOpenAI
from langchain.memory import ConversationBufferWindowMemory
from langchain.chains import ConversationChain

# 初始化大模型
llm = ChatOpenAI(temperature=0)

# 创建记忆实例
memory = ConversationBufferWindowMemory(k=5)  # 设置窗口大小为 5

# 创建对话链并设置记忆
conversation = ConversationChain(
    llm=llm,
    memory=memory,
    verbose=True
)

# 开始对话
response = conversation.predict(input="你好!")
print(response)

response = conversation.predict(input="你能帮我查一下天气吗?")
print(response)

参数说明

  • k: 控制对话历史的窗口大小。一旦达到这个限制,最早的对话记录会被移除,以保证窗口大小不变。

优点

  • 节省内存:通过限制对话历史的长度来减少内存占用。
  • 保持上下文:即使对话历史中的部分记录被移除,也能确保模型了解最新的对话背景。

注意事项

  • 窗口大小的选择:合理设置窗口大小以平衡内存使用和上下文保留的需求。
  • 对话连贯性:虽然这种方法可以有效控制内存使用,但在某些情况下可能会影响对话的连贯性,特别是当对话跨越多个会话且涉及多个主题时。

通过使用 ConversationBufferWindowMemory,可以构建出既能处理长时间对话又能有效管理资源的应用程序。这对于需要控制内存使用同时保持对话上下文连贯性的场景非常有用。

Entity

ConversationEntityMemory。实体内存会记住对话中有关特定实体的给定事实。它提取有关实体的信息(使用 LLM),并随着时间的推移积累有关该实体的知识(也使用 LLM)。(会多次调用LLM做结构化提取,这个memory用的很少

Conversation Knowledge Graph

ConversationKGMemory。顾名思义,这种类型的内存使用知识图谱来重新创建内存。

ConversationKGMemory 在 LangChain 中是一个用于管理对话历史的高级 Memory 类型,它通过构建知识图谱(Knowledge Graph, KG)的方式来维护对话上下文。这种方法不仅能够捕捉对话中的实体和关系,还能够利用这些信息来增强对话模型的理解能力和响应质量。

ConversationKGMemory 的工作原理

  1. 实体识别:从对话中提取实体(如人名、地点、时间等)。
  2. 关系抽取:识别实体之间的关系。
  3. 图谱构建:将实体及其关系构建成知识图谱。
  4. 查询和推理:利用图谱进行查询和推理,以便更好地理解和响应用户的请求。
from langchain.chat_models import ChatOpenAI
from langchain.memory import ConversationKGMemory
from langchain.chains import ConversationChain

# 初始化大模型
llm = ChatOpenAI(temperature=0)

# 创建记忆实例
memory = ConversationKGMemory(llm=llm)

# 创建对话链并设置记忆
conversation = ConversationChain(
    llm=llm,
    memory=memory,
    verbose=True
)

# 开始对话
response = conversation.predict(input="你好!")
print(response)

response = conversation.predict(input="我想知道明天北京的天气怎么样?")
print(response)

参数说明

  • llm: 大模型实例,用于生成摘要或执行其他文本处理任务。
  • graph: 可选参数,用于指定知识图谱的实现方式,默认情况下使用默认的知识图谱实现。

优点

  • 增强理解能力:通过构建知识图谱,模型能够更好地理解对话中的实体和它们之间的关系。
  • 上下文管理:能够有效地管理对话的历史上下文,使对话更加连贯。
  • 推理能力:利用知识图谱进行推理,可以提供更准确和相关的响应。

注意事项

  • 性能考虑:构建和维护知识图谱可能会消耗较多的计算资源,特别是在处理大规模对话数据时。
  • 准确性:实体识别和关系抽取的准确性对最终的对话质量有重要影响。

通过使用 ConversationKGMemory,可以构建出具有更强理解和推理能力的对话系统,尤其是在涉及复杂实体和关系的场景中。这有助于提升对话系统的智能水平和用户体验。

Conversation Summary

ConversationSummaryMemory。这种类型的内存会随着时间的推移创建对话的摘要。这对于随着时间的推移浓缩对话中的信息非常有用。对话摘要内存在对话发生时对其进行摘要,并将当前摘要存储在内存中。然后,可以使用此内存将迄今为止的对话摘要注入到提示/链中。此内存对于较长的对话最有用,因为在较长的对话中,逐字保留过去的消息历史记录会占用太多令牌。

ConversationSummaryMemory 是 LangChain 中的一种 Memory 类型,它通过定期生成对话摘要来管理对话历史。这种 Memory 类型特别适合于需要长期记忆但又希望避免内存消耗过大的场景。

ConversationSummaryMemory 的工作原理

  1. 对话缓冲区:它会暂时保存最近的对话历史。
  2. 对话摘要:当对话历史达到一定长度后,会生成一次摘要,并将摘要存储起来。
  3. 循环:随着新对话的进行,上述过程会不断重复,即新的对话会被添加到缓冲区,当达到阈值时再次生成摘要并清空缓冲区。
from langchain.chat_models import ChatOpenAI
from langchain.memory import ConversationSummaryMemory
from langchain.chains import ConversationChain

# 初始化大模型
llm = ChatOpenAI(temperature=0)

# 创建记忆实例
memory = ConversationSummaryMemory(llm=llm, max_token_limit=200)  # 设置最大 token 数限制

# 创建对话链并设置记忆
conversation = ConversationChain(
    llm=llm,
    memory=memory,
    verbose=True
)

# 开始对话
response = conversation.predict(input="你好!")
print(response)

response = conversation.predict(input="你能帮我查一下天气吗?")
print(response)

参数说明

  • max_token_limit: 控制对话历史的最大 token 数量。一旦达到这个限制,就会生成一次摘要,并将摘要存入 Memory 中,同时清空当前的对话历史。

优点

  • 节省内存:通过定期生成摘要来减少内存占用。
  • 保持上下文:即使对话历史被清空,摘要也能确保模型了解之前的对话背景。

注意事项

  • 摘要的质量:摘要的质量直接影响后续对话的理解。因此,选择合适的大模型来生成摘要非常重要。
  • token 限制:合理设置 max_token_limit 以平衡内存使用和上下文保留的需求。

通过使用 ConversationSummaryMemory,您可以构建出既能处理长时间对话又能有效管理资源的应用程序。

Conversation Summary Buffer

ConversationSummaryBufferMemory。ConversationSummaryBufferMemory 是 LangChain 中的一种 Memory 类型,它结合了对话缓冲区(buffer)和对话摘要(summary)两种机制的优点。这种 Memory 类型特别适合于需要长期记忆但又希望避免内存消耗过大的场景。

ConversationSummaryBufferMemory 的工作原理

  1. 对话缓冲区:它会暂时保存最近的对话历史。
  2. 对话摘要:当对话历史达到一定长度后,会生成一次摘要,并将摘要存储起来。之后的对话历史会被清空。
  3. 循环:随着新对话的进行,上述过程会不断重复,即新的对话会被添加到缓冲区,当达到阈值时再次生成摘要并清空缓冲区。
from langchain.chat_models import ChatOpenAI
from langchain.memory import ConversationSummaryBufferMemory
from langchain.chains import ConversationChain

# 初始化大模型
llm = ChatOpenAI(temperature=0)

# 创建记忆实例
memory = ConversationSummaryBufferMemory(llm=llm, max_token_limit=200)  # 设置最大 token 数限制

# 创建对话链并设置记忆
conversation = ConversationChain(
    llm=llm,
    memory=memory,
    verbose=True
)

# 开始对话
response = conversation.predict(input="你好!")
print(response)

response = conversation.predict(input="你能帮我查一下天气吗?")
print(response)

参数说明

  • max_token_limit: 控制对话历史的最大 token 数量。一旦达到这个限制,就会生成一次摘要,并将摘要存入 Memory 中,同时清空当前的对话历史。

优点

  • 节省内存:通过定期生成摘要来减少内存占用。
  • 保持上下文:即使对话历史被清空,摘要也能确保模型了解之前的对话背景。

注意事项

  • 摘要的质量:摘要的质量直接影响后续对话的理解。因此,选择合适的大模型来生成摘要非常重要。
  • token 限制:合理设置 max_token_limit 以平衡内存使用和上下文保留的需求。

通过使用 ConversationSummaryBufferMemory,您可以构建出既能处理长时间对话又能有效管理资源的应用程序。

Conversation Token Buffer

ConversationTokenBufferMemory。ConversationTokenBufferMemory 在内存中保留最近交互的缓冲区,并使用令牌长度而不是交互数来确定何时刷新交互。

ConversationTokenBufferMemory 是 LangChain 中的一种 Memory 类型,它主要用于管理对话历史记录,特别适用于需要控制对话历史长度和 token 数量的场景。这种 Memory 类型通过限制存储的 token 数量来优化内存使用,同时确保对话上下文的连贯性。

ConversationTokenBufferMemory 的工作原理

  1. 对话缓冲区:它会存储最近的对话历史记录。
  2. token 限制:当对话历史中的 token 数量超过设定的上限时,最旧的对话记录会被移除,以保证总 token 数不超过限制。
  3. 循环:随着新对话的进行,上述过程会不断重复,即新的对话会被添加到缓冲区,当达到 token 限制时,最早的对话记录会被移除。
from langchain.chat_models import ChatOpenAI
from langchain.memory import ConversationTokenBufferMemory
from langchain.chains import ConversationChain

# 初始化大模型
llm = ChatOpenAI(temperature=0)

# 创建记忆实例
memory = ConversationTokenBufferMemory(llm=llm, max_token_limit=200)  # 设置最大 token 数限制

# 创建对话链并设置记忆
conversation = ConversationChain(
    llm=llm,
    memory=memory,
    verbose=True
)

# 开始对话
response = conversation.predict(input="你好!")
print(response)

response = conversation.predict(input="你能帮我查一下天气吗?")
print(response)

参数说明

  • max_token_limit: 控制对话历史的最大 token 数量。一旦达到这个限制,最旧的对话记录会被移除,以保证总 token 数不超过限制。

优点

  • 节省内存:通过限制 token 数量来减少内存占用。
  • 保持上下文:即使对话历史中的部分记录被移除,也能确保模型了解最新的对话背景。

注意事项

  • token 限制的选择:合理设置 max_token_limit 以平衡内存使用和上下文保留的需求。
  • 对话连贯性:虽然这种方法可以有效控制内存使用,但在某些情况下可能会影响对话的连贯性,特别是当对话跨越多个会话且涉及多个主题时。

通过使用 ConversationTokenBufferMemory,可以构建出既能处理长时间对话又能有效管理资源的应用程序。这对于需要控制内存使用同时保持对话上下文连贯性的场景非常有用。

Backed by a Vector Store

VectorStoreRetrieverMemory。VectorStoreRetrieverMemory 将内存存储在向量存储中,并在每次调用时查询前 K 个最“突出”的文档。这与大多数其他 Memory 类的不同之处在于它不显式跟踪交互的顺序。

VectorStoreRetrieverMemory 是 LangChain 中一种高级 Memory 类型,它通过结合向量存储(Vector Store)和检索器(Retriever)来管理对话历史。这种 Memory 类型特别适合于需要处理大量对话历史记录的场景,因为它能够高效地检索相关信息而不会导致内存过度膨胀。

VectorStoreRetrieverMemory 的工作原理

  1. 向量存储:将对话历史转换为向量,并存储在向量数据库中。
  2. 检索器:当接收到新的输入时,使用检索器从向量数据库中查找最相关的对话历史记录。
  3. 上下文提供:将找到的相关对话历史作为上下文提供给模型,以便生成更相关的响应。
from langchain.chat_models import ChatOpenAI
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.memory import VectorStoreRetrieverMemory
from langchain.chains import ConversationChain

# 初始化大模型
llm = ChatOpenAI(temperature=0)

# 初始化向量存储
embedding = OpenAIEmbeddings()
vectorstore = Chroma(embedding_function=embedding)

# 创建记忆实例
memory = VectorStoreRetrieverMemory(vectorstore=vectorstore, k=2)  # 设置检索 top-k 相关文档

# 创建对话链并设置记忆
conversation = ConversationChain(
    llm=llm,
    memory=memory,
    verbose=True
)

# 开始对话
response = conversation.predict(input="你好!")
print(response)

response = conversation.predict(input="你能帮我查一下天气吗?")
print(response)

参数说明

  • vectorstore: 向量数据库实例,用于存储对话历史的向量表示。
  • k: 检索时返回的最相关文档数量。

优点

  • 高效检索:通过向量检索技术快速找到最相关的对话历史记录。
  • 节省内存:向量存储可以有效地管理大量的对话历史,避免内存过度膨胀。
  • 上下文管理:能够提供相关的上下文信息,使模型能够生成更准确的响应。

注意事项

  • 向量存储的选择:根据具体需求选择合适的向量存储库,例如 Chroma、Pinecone 等。
  • 嵌入模型:选择合适的嵌入模型来生成高质量的向量表示,这对于检索结果的质量至关重要。
  • 检索参数:合理设置检索参数(如 k 值),以平衡检索速度和相关性。

通过使用 VectorStoreRetrieverMemory,可以构建出既能处理大量对话历史记录又能高效管理资源的应用程序。这对于需要处理大规模数据集的场景非常有用。

04 总结

本质上,Memory 是存储对话历史(至于存在哪里,无所谓),然后对历史消息做处理(至于怎么处理,无所谓),最后将处理后的数据填充到 Prompt 中一起提交给 LLM 做问答。

如果能帮我点个免费的关注,那就是对我个人的最大的肯定。如果觉得写的还行,分享一下也是我生活的小确幸~

在这里插入图片描述

以上内容依据官方文档编写,官方地址:https://python.langchain.com/docs/modules/memory

Peace Guys~

在这里插入图片描述

  • 【LangChain进阶教程】十三、LangChain进阶之Chains
  • 【LangChain进阶教程】十二、LangChain进阶之Agents
  • 【LangChain进阶教程】十一、LangChain进阶之Tools
  • 【LangChain进阶教程】十、LangChain进阶之Retrievers

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

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

相关文章

STM32标准库学习笔记-5.定时器-输出比较

参考教程:【STM32入门教程-2023版 细致讲解 中文字幕】 输出比较OC OC(Output Compare)输出比较输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波…

vue使用海康视频web插件如何实现自适应

如果要实现自适应的话&#xff0c;就需要在不同的分辨率内设置不同的宽度和高度&#xff0c;可以监听当前屏幕的宽度和高度(可视区域的宽高)&#xff0c;划分不同的显示阶段 通过设置父级元素的宽度和高度实现子级视频的自适应 index.vue <template><div class&quo…

《机器学习》一元、多元线性回归的实现 No.4

一、一元线性回归实现 先直接看完整代码&#xff1a; import pandas as pd import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegressiondate pd.read_csv(data.csv) #导入数据plt.scatter(date[广告投入],date[销售额]) # 用散点图展示数据 plt.sh…

【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(一)

前言 终于到了之前C语言没有讲过的数据结构了&#xff0c;那就是二叉树了&#xff0c;关于二叉树的学习难度确实比前面学习的数据结构都要难一点&#xff0c;所以我们这个关于二叉树的博客大概率是有好几篇的。如有哪里出现错误也欢迎指出唔。 二叉树的概念 Java 中的二叉树是…

【Oracle点滴积累】解决ORA-20000: ORA-12899: value too large for column错误的方法

广告位招租&#xff01; 知识无价&#xff0c;人有情&#xff0c;无偿分享知识&#xff0c;希望本条信息对你有用&#xff01; 今天和大家分享ORA-20000: ORA-12899: value too large for column错误的解决方法&#xff0c;本文仅供参考&#xff0c;谢谢&#xff01; A fatal…

【C语言】二叉树的深度理解

&#x1f36c;个人主页&#xff1a;Yanni.— &#x1f308;数据结构&#xff1a;Data Structure.​​​​​​ &#x1f382;C语言笔记&#xff1a;C Language Notes 前言 在之前学习了二叉树的基本概念&#xff0c;但二叉树有着更深入知识理解&#xff0c;这篇文章可以帮助大…

2 种方式申请免费 SSL 证书,阿里云 Certbot

如何使用免费的 SSL 证书&#xff0c;有时在项目中需要使用免费的 SSL 证书&#xff0c;Aliyun 提供免费证书&#xff0c;三个月有效期&#xff0c;可以直接在aliyun 申请&#xff0c;搜索 SSL 证书&#xff0c;选择测试证书。 Aliyun 证书需要每三月来来换一次&#xff0c;页…

ubuntu中python 改为默认使用python3,pip改为默认使用pip3

一、安装pip和python&#xff08;有的话可跳过&#xff09; 更新软件源 sudo apt update !!!apt和apt-get apt apt-get、apt-cache 和 apt-config 中最常用命令选项的集合。 部分截图为apt-get&#xff0c;建议直接用apt 安装pip和python ubuntu 18.04和更高版本默认安…

申请中的专利可以用来申报高企吗

申请中的专利可以用来申报高企吗&#xff1f; 申请中的专利是否可以用于高新技术企业&#xff08;简称“高企”&#xff09;申报时&#xff0c;我们需要深入了解高企认定的具体条件和要求&#xff0c;以及专利在其中的角色和地位。 高新技术企业认定的基本条件 高新技术企业认定…

图像分类数据集|新冠肺炎|3类

新冠肺炎图像分类数据集&#xff0c;总共三类&#xff0c;获取地址在最后&#xff1a; 训练集&#xff1a; 251 测试集&#xff1a; 66 类别名&#xff1a; [‘Covid’, ‘Normal’, ‘Viral Pneumonia’] 数据集整理不易&#xff0c;获取地址如下&#xff1a; https://ite…

VM虚拟机-Ubuntu莫名其妙断网及解决

问题解决 由于Ubuntu下访问GitHub总是很慢&#xff0c;所以在鼓捣解决方法时不知怎么的直接给干的没法访问互联网了&#xff0c;虽然之前保存了快照&#xff0c;但恢复了几个快照都是没网&#xff08;ping不通&#xff09;&#xff0c;后续的解决方法如下。 在命令行中输入 …

EchoMimic—语音驱动图像

简介 EchoMimic是阿里巴巴达摩院推出的一个AI驱动的口型同步技术项目。通过一段音频和一张人物的面部照片&#xff0c;生成一个看起来像是在说话的视频&#xff0c;其中的人物口型动作与音频中的语音完美匹配。   EchoMimic优点&#xff1a; 1.口型同步生成&#xff1a;能根据…

WebRTC音视频开发读书笔记(六)

数据通道不仅可以发送文本消息, 还可以发送图片、二进制文件,将其类型binaryType属性设置成arraybuffer类型即可. 九\、文件传输 1、文件传输流程 &#xff08;1&#xff09;使用表单file打开本地文件 &#xff08;2&#xff09;使用FileReader读取文件的二进制数据 &#…

【PyCharm】配置“清华镜像”地址

文章目录 前言一、清华镜像是什么&#xff1f;二、pip是什么&#xff1f;三、具体步骤1.复制镜像地址2.打开PyCharm&#xff0c;然后点击下图红框的选项3.在弹出的新窗口点击下图红框的选项进行添加4.在URL输入框中粘贴第一步复制的地址&#xff0c;名字可以不更改&#xff0c;…

电力调度控制台作为智能电网的中枢大脑,引领能源高效调度新时代

在当今这个能源需求日益增长、电力网络日益复杂的时代&#xff0c;电力调度控制台作为智能电网的核心组成部分&#xff0c;正扮演着至关重要的角色。它不仅是电力系统中信息汇聚与决策输出的中枢大脑&#xff0c;更是实现电力资源优化配置、保障电网安全稳定运行的关键所在。 智…

MYSQL查询规范:索引

前言 工作有段时间了&#xff0c;现在看以前写的代码、sql之类的&#xff0c;实属辣眼睛。 这里将给出一些目前遇到的MYSQL查询规范&#xff08;索引&#xff09;&#xff0c;并长期更新 索引 众所周知&#xff0c;索引能提高数据查询效率&#xff08;前提是该字段被用在WHERE、…

Springboot邮件发送:如何配置SMTP服务器?

Springboot邮件发送集成方法&#xff1f;如何提升邮件发送性能&#xff1f; 对于使用Springboot的开发者来说&#xff0c;配置SMTP服务器来实现邮件发送并不是一件复杂的事情。AokSend将详细介绍如何通过配置SMTP服务器来实现Springboot邮件发送。 Springboot邮件发送&#x…

【SpringBoot】SpringBoot中的异常处理和异常跳转页面

目录 1.异常跳转页面 1.1 概念 1.2 使用 2.异常处理 2.1 概念 2.2 通过ExceptionHandler 注解处理异常&#xff08;局部处理&#xff09; 2.3 通过ControllerAdvice 注解处理异常&#xff08;全局处理&#xff09; 2.4 通过 SimpleMappingExceptionResolver 对象处理…

AI大模型达人秘籍:豆瓣9.2分推荐必读!

有很多程序员正在AIGC赛道中默默发财&#xff0c;有通过短视频做内容爆火&#xff0c;接广告的&#xff1b;有卖AI解决方案的&#xff1b;有卖AI课程的&#xff1b;也有卖AI产品&#xff0c;慢慢做大做强的…更不必说&#xff0c;那些拿下“人均年薪100万”大模型相关岗位的“赢…

多模态 AI 是零售业的未来吗?使用 GPT-4 Vision 和 MongoDB 矢量搜索探索智能产品发现

生成式人工智能如何重新定义零售盈利能力 欢迎来到雲闪世界。想象一下这样的购物体验&#xff1a;您上传了一张心仪服装或商品的照片。片刻之后&#xff0c;您便会收到来自您喜爱的商店的个性化、AI 驱动的类似商品推荐。这是一种革命性的零售体验&#xff0c;由一款创新应用实…