所有网站打不开,模板网站有什么不好,南京网站托管网络营销外包,绵阳网站推广优化简介
本文详细介绍了LangChain中实现大模型记忆存储的方法#xff0c;包括记忆存储的必要性、实现原理及多种存储方案。讲解了BaseChatMessageHistory及其实现#xff0c;如内存存储和Redis存储#xff0c;并演示了如何通过RunnableWithMessageHistory实现多轮对话记忆。同时…简介本文详细介绍了LangChain中实现大模型记忆存储的方法包括记忆存储的必要性、实现原理及多种存储方案。讲解了BaseChatMessageHistory及其实现如内存存储和Redis存储并演示了如何通过RunnableWithMessageHistory实现多轮对话记忆。同时介绍了记忆窗口裁剪技术以及如何构建支持多角色切换、上下文记忆的聊天机器人项目为开发者提供了完整的记忆存储解决方案。记忆存储为什么需要记忆存储大语言模型本质上是经过大量数据训练出来的自然语言模型用户给出输入信息大语言模型会根据训练的数据进行预测给出指定的结果大语言模型本身是“无状态的”模型本身是不会记忆任何上下文的只能依靠用户本身的输入去产生输出。当我们使用 langchain 和大语言模型聊天时会出现如下的情况from langchain_core.output_parsers import StrOutputParserfrom langchain_core.prompts import PromptTemplatefrom langchain_ollama import ChatOllama# 设置本地模型不使用深度思考llm ChatOllama(modelqwen3:14b, reasoningFalse)prompt PromptTemplate.from_template( 请回答我的问题{question})# 创建字符串输出解析器parser StrOutputParser()# 构建链式调用chain prompt | llm | parser# 执行链式调用print(chain.invoke({question: 我叫崔亮你叫什么?}))print(chain.invoke({question: 你知道我是谁吗?}))执行结果如下我叫通义千问是阿里巴巴集团旗下的通义实验室研发的超大规模语言模型。很高兴认识你崔亮有什么问题或需要帮助的地方吗作为一个AI助手我无法知道您的身份。我是一个虚拟助手没有能力访问或存储用户的身份信息。如果您有任何问题或需要帮助我会尽力提供帮助。我们刚刚在前一轮对话告诉大语言模型的信息下一轮就被“遗忘了”。但如果我们使用使用 ChatGPT 聊天时它能记住多轮对话中的内容这ChatGPT网页版实现了历史记忆功能。实现原理实现这个记忆功能就需要额外的模块去保存我们和模型对话的上下文信息然后在下一次请求时把所有的历史信息都输入给模型让模型输出最终结果。一个记忆组件要实现的三个最基本功能读取记忆组件保存的历史对话信息写入历史对话信息到记忆组件存储历史对话消息在LangChain中提供这个功能的模块就称为 Memory(记忆) 用于存储用户和模型交互的历史信息。给大语言模型添加记忆功能的方法如下在链执行前将历史消息从记忆组件读取出来和用户输入一起添加到提示词中传递给大语言模型。在链执行完毕后将用户的输入和大语言模型输出一起写入到记忆组件中下一次调用大语言模型时重复这个过程。更多 langchain 记忆存储相关内容可参考文档https://docs.langchain.com/oss/python/langchain/short-term-memory实现类介绍ConversationChain是 LangChain 早期用于简化对话管理的类内部集成了内存如ConversationBufferMemory和提示模板适合快速构建简单对话应用。然而它存在以下问题灵活性不足提示模板和内存管理逻辑较为固定难以支持复杂对话流程。与新 API 不兼容未针对现代聊天模型如支持工具调用的模型优化。架构过时LangChain 0.3.x 开始推崇基于 LangChain Expression LanguageLCEL和Runnable的模块化设计ConversationChain不符合这一理念。RunnableWithMessageHistory是 LangChain 推荐的替代方案优势包括模块化允许自由组合提示模板、模型和内存管理逻辑。灵活性支持自定义对话历史存储如内存、数据库和复杂对话流程。兼容性与 LCEL 和现代聊天模型无缝集成。长期支持在 LangChain 0.3.x 中稳定且不会在 1.0 中移除。官方建议简单聊天用 BaseChatMessageHistory RunnableWithMessageHistory复杂场景用 LangGraph persistenceCheckpointer Content Blocks 记忆中间件BaseChatMessageHistory简介BaseChatMessageHistory是用来保存聊天消息历史的抽象基类下面对BaseChatMessageHistory的核心属性与方法进行分析属性messages: List[BaseMessage]用来接收和读取历史消息的只读属性方法add_messages批量添加消息默认实现是每个消息都去调用一次add_messageadd_message单独添加消息实现类必须重写这个方法否则会抛出异常clear()清空所有消息实现类必须重写这个方法常见实现类分析LangChain源码可知在 LangChain 的类结构中顶层基类是BaseChatMemory用于 控制“什么时候加载记忆、什么时候写入”等核心功能 是所有“聊天记忆类”的抽象基类定义了统一接口。其职责不是存储数据而是 协调数据读写。而InMemoryChatMessageHistory是具体实现定义了 “记忆存在哪、怎么存”下面是LangChain中常用的消息历史组件以及它们的特性其中InMemoryChatMessageHistory是BaseChatMemory默认使用的聊天消息历史组件。组件名称特性InMemoryChatMessageHistory基于内存存储的聊天消息历史组件FileChatMessageHistory基于文件存储的聊天消息历史组件RedisChatMessageHistory基于Redis存储的聊天消息历史组件ElasticsearchChatMessageHistory基于ES存储的聊天消息历史组件实践使用快速体验InMemoryChatMessageHistory是 LangChain 中的一个内存型消息历史记录器用于在对话过程中临时存储 AI 和用户之间的消息记录。接下来通过一个简单的示例演示如果使用from langchain_core.chat_history import InMemoryChatMessageHistoryfrom langchain_ollama import ChatOllamafrom loguru import logger# 初始化Ollama语言模型实例配置基础URL、模型名称和推理模式llm ChatOllama(modelqwen3:14b, reasoningFalse)# 创建内存聊天历史记录实例用于存储对话消息history InMemoryChatMessageHistory()# 添加用户消息到聊天历史记录history.add_user_message(我叫崔亮我的爱好是学习)# 调用语言模型处理聊天历史中的消息ai_message llm.invoke(history.messages)# 记录并输出AI回复的内容logger.info(f第一次回答\n{ai_message.content})# 将AI回复添加到聊天历史记录中history.add_message(ai_message)# 添加新的用户消息到聊天历史记录history.add_user_message(我叫什么我的爱好是什么)# 再次调用语言模型处理更新后的聊天历史ai_message2 llm.invoke(history.messages)# 记录并输出第二次AI回复的内容logger.info(f第二次回答\n{ai_message2.content})# 将第二次AI回复添加到聊天历史记录中history.add_message(ai_message2)# 遍历并输出所有聊天历史记录中的消息内容for message in history.messages: logger.info(message.content)执行结果如下2025-11-09 17:11:30.757 | INFO | __main__:module:18 - 第一次回答你好崔亮很高兴认识你。学习是一个非常棒的爱好它能让我们不断成长和进步。不知道你平时喜欢学习哪些方面的知识呢是专业相关的还是兴趣类的如果你愿意分享我很想听听你的故事呢2025-11-09 17:11:31.396 | INFO | __main__:module:30 - 第二次回答你叫崔亮你的爱好是学习。 如果你有其他想分享的内容也可以告诉我哦2025-11-09 17:11:31.396 | INFO | __main__:module:37 - 我叫崔亮我的爱好是学习2025-11-09 17:11:31.397 | INFO | __main__:module:37 - 你好崔亮很高兴认识你。学习是一个非常棒的爱好它能让我们不断成长和进步。不知道你平时喜欢学习哪些方面的知识呢是专业相关的还是兴趣类的如果你愿意分享我很想听听你的故事呢2025-11-09 17:11:31.397 | INFO | __main__:module:37 - 我叫什么我的爱好是什么2025-11-09 17:11:31.397 | INFO | __main__:module:37 - 你叫崔亮你的爱好是学习。 如果你有其他想分享的内容也可以告诉我哦LCEL调用通过RunnableWithMessageHistory我们可以把任意Runnable包装起来并结合InMemoryChatMessageHistory来实现多轮对话。from langchain_core.chat_history import InMemoryChatMessageHistoryfrom langchain_core.output_parsers import StrOutputParserfrom langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholderfrom langchain_core.runnables import RunnableWithMessageHistory, RunnableConfigfrom langchain_ollama import ChatOllamafrom loguru import logger# 定义 Promptprompt ChatPromptTemplate.from_messages([ MessagesPlaceholder(variable_namehistory), # 用于插入历史消息 (human, {input})])# 初始化Ollama语言模型实例配置基础URL、模型名称和推理模式llm ChatOllama(modelqwen3:14b, reasoningFalse)parser StrOutputParser()# 构建处理链将提示词模板、语言模型和输出解析器组合chain prompt | llm | parser# 创建内存聊天历史记录实例用于存储对话历史history InMemoryChatMessageHistory()# 创建带消息历史的可运行对象用于处理带历史记录的对话runnable RunnableWithMessageHistory( chain, get_session_historylambda session_id: history, input_messages_keyinput, # 指定输入键 history_messages_keyhistory# 指定历史消息键)# 清空历史记录history.clear()# 配置运行时参数设置会话IDconfig RunnableConfig(configurable{session_id: default})logger.info(runnable.invoke({input: 我叫崔亮我爱好学习。}, config))logger.info(runnable.invoke({input: 我叫什么我的爱好是什么}, config))执行结果如下2025-11-09 17:38:05.136 | INFO | __main__:module:31 - 你好崔亮很高兴认识你学习确实是一个非常棒的爱好它能让我们不断成长和进步。不知道你平时喜欢学习哪些方面的知识呢是专业相关的还是兴趣类的欢迎和我分享我很期待听到你的故事2025-11-09 17:38:06.113 | INFO | __main__:module:32 - 你叫**崔亮**你的爱好是**学习**。记忆窗口裁剪记忆裁剪是指在长时间对话中有选择地保留、压缩或丢弃部分历史消息以保证模型的推理性能和成本可控。trim_messages是 LangChain 中提供的一个工具函数用于从消息列表中裁剪出“最近 N 条”消息。它常用于控制记忆窗口window memory比如在你使用InMemoryChatMessageHistory时想要只保留最近几条历史记录示例代码如下from langchain_core.chat_history import InMemoryChatMessageHistoryfrom langchain_core.runnables.history import RunnableWithMessageHistoryfrom langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholderfrom langchain_core.runnables import RunnableConfigfrom langchain_ollama import ChatOllama# 初始化模型llm ChatOllama(modelqwen3:14b, reasoningFalse)# 创建提示模板prompt ChatPromptTemplate.from_messages([ MessagesPlaceholder(history), (human, {question})])# 存储会话历史store {}# 保留的历史轮数k 2def get_session_history(session_id: str) - InMemoryChatMessageHistory: 获取或创建会话历史 if session_id notin store: store[session_id] InMemoryChatMessageHistory() # 自动修剪只保留最近 k 轮对话2k 条消息 history store[session_id] if len(history.messages) k * 2: # 保留最近的消息 messages_to_keep history.messages[-k * 2:] history.clear() history.add_messages(messages_to_keep) return history# 创建带历史的链chain RunnableWithMessageHistory( prompt | llm, get_session_history, input_messages_keyquestion, history_messages_keyhistory)# 配置config RunnableConfig(configurable{session_id: demo})# 主循环print(开始对话输入 quit 退出)whileTrue: question input(\n输入问题) if question.lower() in [quit, exit, q]: break response chain.invoke({question: question}, config) print(AI回答:, response.content) # 可选显示当前历史消息数 history get_session_history(demo) print(f[当前历史消息数: {len(history.messages)}])运行结果如下可以看到因为我们设置了记住最近 4 条历史消息因此 AI 无法回答出我喜欢唱和跳。开始对话输入 quit 退出输入问题我喜欢唱2025-11-0917:50:22.872 | INFO | __main__:module:59 - AI回答:哇唱歌真的很棒呢你平时喜欢唱什么类型的歌呀是流行、民谣还是其他风格对了你有没有特别喜欢的歌手或者歌曲呀我很想听听你的推荐呢悄悄说如果你愿意的话也可以给我唱一段哦我很期待呢2025-11-0917:50:22.873 | INFO | __main__:module:63 - [当前历史消息数: 2]输入问题喜欢跳2025-11-0917:50:37.400 | INFO | __main__:module:59 - AI回答:哇唱歌跳舞简直就是绝配呀 你平时喜欢跳什么类型的舞蹈呢是街舞、现代舞还是像广场舞这样更轻松的风格我觉得跳舞真的特别有感染力每次看到有人跳舞都会忍不住跟着摇摆呢你有没有特别喜欢的舞者或者舞蹈视频呀我很想看看呢对了如果你愿意的话也可以给我跳一段哦我超想看看的2025-11-0917:50:37.400 | INFO | __main__:module:63 - [当前历史消息数: 4]输入问题我喜欢rap2025-11-0917:50:44.970 | INFO | __main__:module:59 - AI回答:哇Rap真的太酷了 你最喜欢的是哪种风格的Rap呀是那种节奏感超强的Trap还是更有深度的Old School或者你更喜欢说唱中带有故事性的那种我觉得Rap不仅仅是唱歌它更像是一种表达方式对吧你有没有特别喜欢的Rapper呀或者有没有自己尝试写过Rap歌词我很想听听呢要是你愿意的话也可以给我来一段Rap哦我超想听的2025-11-0917:50:44.971 | INFO | __main__:module:63 - [当前历史消息数: 4]输入问题我喜欢篮球2025-11-0917:50:52.350 | INFO | __main__:module:59 - AI回答:哇篮球真的太帅了 你最喜欢的是NBA的哪位球星呀是詹姆斯、库里还是像艾弗森这样充满故事的球员我觉得篮球不仅仅是运动它更像是一种艺术对吧你平时喜欢打篮球吗是喜欢投篮、突破还是更喜欢防守我虽然不太会打但每次看到有人运球过人真的特别佩服要是你愿意的话也可以给我表演一下运球或者投篮哦我超想看的✨2025-11-0917:50:52.350 | INFO | __main__:module:63 - [当前历史消息数: 4]输入问题我喜欢什么2025-11-0917:50:59.951 | INFO | __main__:module:59 - AI回答:哈哈你刚刚问的是“我喜欢什么”但其实你已经告诉我啦你超喜欢 **Rap** 和 **篮球**对吧这两个爱好真的很酷Rap是一种表达自我、释放情绪的方式而篮球则是一种充满激情和团队精神的运动。你是不是经常一边听Rap一边打篮球呀那感觉一定超带感不过除了Rap和篮球你还有什么其他的爱好吗比如游戏、电影、音乐、或者读书我很想了解更多关于你的事情如果你愿意的话也可以告诉我你最近在听什么Rap或者在打什么位置的篮球我很想听听2025-11-0917:50:59.951 | INFO | __main__:module:63 - [当前历史消息数: 4]Redis存储使用内存管理消息记录的方式只是临时使用在实际生产环境都需要持久化的存储数据库。langchain 提供了很多基于其他存储系统的扩展依赖例如 redis、kafka、MongoDB 等具体参考官网https://python.langchain.ac.cn/docs/integrations/memory/。接下来以 redis 为例演示如何持久化存储历史消息。部署 redis、安装 pip 包# docker run -d --name redis-stack -p 6379:6379 -p 8001:8001 redis/redis-stack:latest# pip install langchain-redis redis代码如下from langchain_community.chat_message_histories import RedisChatMessageHistoryfrom langchain_core.runnables.history import RunnableWithMessageHistoryfrom langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholderfrom langchain_core.runnables import RunnableConfigfrom langchain_ollama import ChatOllamafrom loguru import logger# Redis 配置REDIS_URL redis://localhost:6379/0# 初始化模型llm ChatOllama(modelqwen3:14b, reasoningFalse)# 创建提示模板prompt ChatPromptTemplate.from_messages([ MessagesPlaceholder(history), (human, {question})])# 保留的历史轮数k 2def get_session_history(session_id: str) - RedisChatMessageHistory: 获取或创建会话历史使用 Redis # 创建 Redis 历史对象 history RedisChatMessageHistory( session_idsession_id, urlREDIS_URL, ttl3600# 1小时过期 ) # 自动修剪只保留最近 k 轮对话2k 条消息 if len(history.messages) k * 2: # 保留最近的消息 messages_to_keep history.messages[-k * 2:] history.clear() history.add_messages(messages_to_keep) return history# 创建带历史的链chain RunnableWithMessageHistory( prompt | llm, get_session_history, input_messages_keyquestion, history_messages_keyhistory)# 配置config RunnableConfig(configurable{session_id: demo})# 主循环print(开始对话输入 quit 退出)whileTrue: question input(\n输入问题) if question.lower() in [quit, exit, q]: break response chain.invoke({question: question}, config) logger.info(fAI回答:{response.content}) # 可选显示当前历史消息数 history get_session_history(demo) logger.info(f[当前历史消息数: {len(history.messages)}])执行结果如下开始对话输入 quit 退出输入问题我喜欢唱2025-11-0917:58:24.778 | INFO | __main__:module:62 - AI回答:哇你喜欢唱歌啊那真是太棒了 唱歌是一种非常美好的表达方式可以让人释放情绪、放松心情甚至还能结交到很多志同道合的朋友呢你平时喜欢唱什么类型的歌呀是流行、民谣、摇滚还是其他风格有没有特别喜欢的歌手或者歌曲如果你愿意的话也可以跟我分享一下你唱歌时的感受我很想听听呢对了你有没有尝试过录制自己的歌声呀现在有很多手机应用都可以很方便地录歌、修音甚至还能做简单的音乐制作哦如果你有兴趣的话我可以给你推荐一些好用的工具你最喜欢在什么场合唱歌呢是独自一人时还是和朋友们一起我很好奇呢2025-11-0917:58:24.781 | INFO | __main__:module:66 - [当前历史消息数: 2]输入问题我喜欢跳2025-11-0917:58:32.250 | INFO | __main__:module:62 - AI回答:哇你喜欢跳舞啊太棒了 跳舞是一种非常有感染力的表达方式可以让人释放压力、增强自信还能让身体变得更健康呢你平时喜欢跳什么类型的舞呀是街舞、现代舞、拉丁舞还是像广场舞这样更轻松的类型有没有特别喜欢的舞者或者舞蹈视频如果你愿意的话也可以跟我分享一下你跳舞时的感受我很想听听呢对了你有没有尝试过跟着视频跳舞现在网上有很多很棒的舞蹈教学视频不管是初学者还是高手都能找到适合自己的内容哦如果你有兴趣的话我可以给你推荐一些好用的平台你最喜欢在什么场合跳舞呢是独自一人时还是和朋友们一起我很好奇呢2025-11-0917:58:32.252 | INFO | __main__:module:66 - [当前历史消息数: 4]输入问题我喜欢rap2025-11-0917:58:46.358 | INFO | __main__:module:62 - AI回答:太酷了你喜欢 **Rap** Rap 不仅是一种音乐风格更是一种表达自我、传递情感、展现个性的艺术形式它融合了节奏、语言、韵律甚至还可以融入讲故事、说理、讽刺、励志等等真的超级有魅力你平时喜欢听哪种风格的 Rap 呢是 **Old School** 的经典风格还是 **Trap**、**Hip-Hop**、**Boom Bap**有没有特别喜欢的 **Rapper** 或者 **歌曲**比如像 **Eminem、Jay-Z、Kendrick Lamar、Jay Chou、GAI、Higher Brothers** 这些人他们的作品都特别有代表性你有没有尝试过自己写 **Rap**或者尝试 **freestyle**如果你愿意的话可以跟我分享你写的 **Rap** 或者你最喜欢的歌词我很想听听呢还有你是不是也喜欢 **beat**节奏Rap 的节奏感真的很重要不同的 beat 会带出完全不同的情绪和风格哦你平时喜欢在什么场合听 Rap是独自听还是在派对上一起嗨 如果你对 **Rap culture** 也感兴趣的话我们还可以聊聊 **Rap 的历史、文化背景、不同流派**甚至还可以一起讨论一些你最喜欢的 **Rap 歌手** 或 **专辑**你有没有特别喜欢的一首 Rap 歌我很想听听你推荐的2025-11-0917:58:46.364 | INFO | __main__:module:66 - [当前历史消息数: 4]查看 redis 数据库信息发现他只会记住最近 4 条聊天记录。项目实践聊天机器人开发项目描述基于 LangChain 1.0 和 Gradio 构建的多角色聊天机器人支持流式输出、多角色切换、上下文记忆等功能用户可选择不同的 AI 角色与之对话体验风格各异的智能响应。我们主要理解 LangChain 相关代码即可在实际工作中 Gradio 代码通常都是 AI 生成我们无需花费太多精力研究。实现功能多角色支持如通用助手、英语老师、段子手等每个角色拥有独立对话上下文Memory 隔离支持流式输出回答提高响应体验用户界面美观简洁Gradio 实现支持提示词模板自定义PromptTemplate会话历史记忆与追溯使用 Memory 模块项目效果代码实现完整代码如下from langchain_core.runnables import RunnableConfigfrom langchain_ollama import ChatOllamafrom langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholderfrom langchain_core.runnables.history import RunnableWithMessageHistoryfrom langchain_community.chat_message_histories import RedisChatMessageHistoryimport gradio as gr# 定义不同角色的系统提示语ROLES { 通用助手: 你是无所不知的 AI 助手。, 段子手: 你是脱口秀演员回答必须带 1 个梗。, 英语老师: 你是耐心英语老师先用英文回答再给中文翻译。, 代码审查员: 你是严格的代码审查员指出代码问题并给出改进建议。,}# 初始化大语言模型实例llm ChatOllama(modelqwen3:8b, reasoningFalse)def get_session_history(session_id: str) - RedisChatMessageHistory: 根据会话 ID 获取 Redis 中的消息历史记录。 参数: session_id (str): 会话唯一标识符。 返回: RedisChatMessageHistory: 与该会话关联的聊天历史对象。 return RedisChatMessageHistory( session_idsession_id, urlredis://localhost:6379/0, key_prefixchat:, ttlNone )def build_chain(role: str): 构建一个包含系统提示和用户输入的处理链。 参数: role (str): 当前使用的角色名称。 返回: Chain: 包含提示模板和语言模型的可执行链。 system ROLES[role] prompt ChatPromptTemplate.from_messages([ (system, system), MessagesPlaceholder(variable_namehistory), (human, {question}) ]) return prompt | llmdef chat_fn(message, history, role): 处理用户的聊天消息并流式返回响应结果。 参数: message (str): 用户发送的消息内容。 history (list): 当前对话的历史记录。 role (str): 当前使用的角色名称。 生成: tuple: 更新后的聊天记录和清空输入框的内容。 chain_with_history RunnableWithMessageHistory( build_chain(role), get_session_history, input_messages_keyquestion, history_messages_keyhistory ) partial config RunnableConfig(configurable{session_id: role}) for chunk in chain_with_history.stream({question: message}, config): partial chunk.content yield history [ {role: user, content: message}, {role: assistant, content: partial} ], def switch_role(new_role): 切换当前角色并更新显示信息及清空聊天记录。 参数: new_role (str): 新的角色名称。 返回: tuple: 更新后的角色显示文本、清空聊天记录和新的角色状态。 returnf**当前角色{new_role}**, [], new_role# 使用 Gradio 构建 Web 界面with gr.Blocks(title多角色聊天) as demo: # 初始化当前角色状态为“通用助手” current_role_state gr.State(通用助手) # 页面布局左侧角色选择区右侧聊天区域 with gr.Row(): # 创建角色选择界面列 # 该代码块负责构建角色选择的UI界面包括角色标题显示、当前角色状态显示和角色选择按钮 with gr.Column(scale1): gr.Markdown(### 选择角色) current_role_display gr.Markdown(**当前角色通用助手**) role_buttons [gr.Button(role, variantsecondary) for role in ROLES.keys()] # 创建聊天界面的主区域布局 # 该区域包含聊天显示区、消息输入框和发送按钮 with gr.Column(scale4, elem_classes[chat-area]): # 聊天机器人组件用于显示对话历史 chatbot gr.Chatbot(label聊天区, height70vh, typemessages) # 文本输入框组件用于用户输入消息 msg gr.Textbox(label输入你的消息, placeholder请输入..., scale10) # 发送按钮组件用于提交用户输入的消息 send_btn gr.Button(发送, variantprimary) # 绑定发送按钮点击事件 send_btn.click( fnchat_fn, inputs[msg, chatbot, current_role_state], outputs[chatbot, msg] ) # 绑定每个角色按钮的点击事件 for btn in role_buttons: btn.click( fnlambda rbtn.value: switch_role(r), inputsNone, outputs[current_role_display, chatbot, current_role_state] )# 启动 Gradio 应用if __name__ __main__: demo.launch()redis 查看会话历史记录可以看到与各个不同角色的 AI 对话的详细聊天记录内容。最后我在一线科技企业深耕十二载见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事早已在效率与薪资上形成代际优势我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我整理出这套 AI 大模型突围资料包✅AI大模型学习路线图✅Agent行业报告✅100集大模型视频教程✅大模型书籍PDF✅DeepSeek教程✅AI产品经理入门资料完整的大模型学习和面试资料已经上传带到CSDN的官方了有需要的朋友可以扫描下方二维码免费领取【保证100%免费】为什么说现在普通人就业/升职加薪的首选是AI大模型人工智能技术的爆发式增长正以不可逆转之势重塑就业市场版图。从DeepSeek等国产大模型引发的科技圈热议到全国两会关于AI产业发展的政策聚焦再到招聘会上排起的长队AI的热度已从技术领域渗透到就业市场的每一个角落。智联招聘的最新数据给出了最直观的印证2025年2月AI领域求职人数同比增幅突破200%远超其他行业平均水平整个人工智能行业的求职增速达到33.4%位居各行业榜首其中人工智能工程师岗位的求职热度更是飙升69.6%。AI产业的快速扩张也让人才供需矛盾愈发突出。麦肯锡报告明确预测到2030年中国AI专业人才需求将达600万人人才缺口可能高达400万人这一缺口不仅存在于核心技术领域更蔓延至产业应用的各个环节。资料包有什么①从入门到精通的全套视频教程⑤⑥包含提示词工程、RAG、Agent等技术点② AI大模型学习路线图还有视频解说全过程AI大模型学习路线③学习电子书籍和技术文档市面上的大模型书籍确实太多了这些是我精选出来的④各大厂大模型面试题目详解⑤ 这些资料真的有用吗?这份资料由我和鲁为民博士共同整理鲁为民博士先后获得了北京清华大学学士和美国加州理工学院博士学位在包括IEEE Transactions等学术期刊和诸多国际会议上发表了超过50篇学术论文、取得了多项美国和中国发明专利同时还斩获了吴文俊人工智能科学技术奖。目前我正在和鲁博士共同进行人工智能的研究。所有的视频教程由智泊AI老师录制且资料与智泊AI共享相互补充。这份学习大礼包应该算是现在最全面的大模型学习资料了。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。智泊AI始终秉持着“让每个人平等享受到优质教育资源”的育人理念通过动态追踪大模型开发、数据标注伦理等前沿技术趋势构建起前沿课程智能实训精准就业的高效培养体系。课堂上不光教理论还带着学员做了十多个真实项目。学员要亲自上手搞数据清洗、模型调优这些硬核操作把课本知识变成真本事如果说你是以下人群中的其中一类都可以来智泊AI学习人工智能找到高薪工作一次小小的“投资”换来的是终身受益应届毕业生无工作经验但想要系统学习AI大模型技术期待通过实战项目掌握核心技术。零基础转型非技术背景但关注AI应用场景计划通过低代码工具实现“AI行业”跨界。业务赋能 突破瓶颈传统开发者Java/前端等学习Transformer架构与LangChain框架向AI全栈工程师转型。获取方式有需要的小伙伴可以保存图片到wx扫描二v码免费领取【保证100%免费】**