6. 链式结构(Chain)的奥秘:从LLMChain到RouterChain
引言:从“单兵作战”到“流水线革命”
2023年某电商平台客服系统因处理复杂咨询需手动串联多个AI模块,平均响应时间长达12秒。引入LangChain链式架构后,工单处理速度提升8倍,错误率下降45%。本文将深入解析链式编程范式,用4种核心Chain类型,教你像搭积木一样构建智能系统。
一、Chain的本质:AI开发的“乐高哲学”
1.1 链式编程核心价值
-
模块化:将复杂任务拆解为可复用单元(如“意图识别→信息抽取→生成回复”)
-
灵活组装:通过管道符
|
组合组件(prompt | llm | output_parser
) -
状态传递:自动管理模块间输入输出,开发者聚焦业务逻辑
1.2 链式类型全景图
类型 | 典型场景 | 性能特点 |
---|---|---|
简单链 | 简单问答/文案生成 | 低延迟(<500ms) |
顺序链 | 多步骤任务(如报告生成) | 顺序执行,易调试 |
路由链 | 动态选择处理分支(如多语言) | 需预定义路由逻辑 |
转化链 | 数据预处理/后处理 | 无模型调用,高吞吐 |
二、四大核心链式实战
2.1 简单链:智能客服基础应答链
from langchain_ollama import ChatOllama
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
# 构建产品问答链
product_chain = ( ChatPromptTemplate.from_template("作为{role},用{style}风格回答:{query}") | ChatOllama(model="deepseek-r1") | StrOutputParser()
)
response = product_chain.invoke({ "role": "电子产品导购", "style": "专业严谨", "query": "对比iPhone15和华为Mate60的摄像头性能"
})
print(response)
输出为:
**iPhone 15 和华为 Mate 60 Pro 摄像头性能对比**
### 硬件规格对比
1. **主摄像头**- iPhone 15: 48MP 主摄像头(f/1.79 光圈,支持 ProRes 视频拍摄)- Mate 60 Pro: 50MP 主摄像头(f/1.82 光圈)
2. **超广角摄像头**- iPhone 15: 12MP 超广角摄像头(f/2.4 光圈,130° 视野)- Mate 60 Pro: 13MP 超广角摄像头(f/2.2 光圈)
3. **长焦摄像头**- iPhone 15: 12MP 长焦摄像头(f/2.8 光圈,支持 OIS)- Mate 60 Pro: 48MP 潜望式长焦摄像头(f/3.5 光圈,支持 OIS)
### 软件与算法
- **iPhone 15**: - 延续 AOD(Always-On Display)功能,实时调整 HDR。- 改进的计算摄影和夜景模式,提升低光表现。
- **Mate 60 Pro**:- XD Fusion Pro 技术优化图像质量,尤其在复杂光线环境下。- AI 超分辨率变焦增强长焦拍摄效果。
### 光学性能
- **iPhone 15**: 高透光率玻璃镜头和抗反射涂层减少眩光。
- **Mate 60 Pro**: 使用多层镀膜技术和优化的镜片结构,提升成像清晰度。
### 视频功能
- **iPhone 15**:- 支持 4K/60fps HDR 视频拍摄。- 增强动态范围和色彩保真度。
- **Mate 60 Pro**:- 支持 8K 视频录制(7680x4320),1.5 倍于 iPhone 的分辨率。- 慢动作视频支持更高的帧率,如 1080p/240fps。
### 总结
- **iPhone 15**: 在计算摄影、动态范围和 HDR 方面表现出色,适合需要稳定高质量照片和视频的用户。
- **Mate 60 Pro**: 拥有更专业的摄像系统,尤其在长焦和高分辨率视频方面更具优势,适合追求专业级拍摄体验的用户。
根据具体需求选择:日常使用与一致性表现选 iPhone;专业摄影或高要求视频拍摄考虑 Mate 60 Pro。
2.2 顺序链:工单处理流水线
from langchain_core.prompts import ChatPromptTemplate
from langchain_ollama import ChatOllama
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough, RunnableParallel
# 定义子链:意图识别 → 解决方案生成
intent_chain = (ChatPromptTemplate.from_template("识别用户意图:{input}")| ChatOllama(model="deepseek-r1")| StrOutputParser()
)
solution_chain = (ChatPromptTemplate.from_template("针对'{intent}'生成解决方案")| ChatOllama(model="deepseek-r1")| StrOutputParser()
)
# 使用 Runnable 组合链并保留中间结果
full_chain = (intent_chain| RunnableParallel(solution=solution_chain,intent=RunnablePassthrough(),input=RunnablePassthrough(),)
)
result = full_chain.invoke({"input": "订单一直未发货"})
print(result)
输出为:
{'solution': '<think>\n好,我现在需要帮用户解决订单未发货的问题。首先,我要理解用户的情况:他们已经下单一段时间了,但订单还没发货,可能因此感到焦虑或不满。\n\n接下来,我应该先致歉,表达对他们不便的关心。然后,解释延迟的原因,比如可能是物流问题、库存短缺还是系统故障。接着,提供解决方案,比如查询最新状态或取消订单并退款。\n\n同时,考虑用户可能的需求,比如是否需要加快发货速度,或者是否有其他替代方案。最后,确保整个回应清晰明了,让用户感到被重视,并愿意进一步协助解决问题。\n</think>\n\n您的订单未发货给您带来了不便,对此我们深表歉意。目前,我们正在积极处理中,预计将在未来几天内完成发货。如果您有任何疑问或需要进一步的帮助,请随时联系我们的客服团队,我们将竭诚为您服务。感谢您的耐心等待和理解!', 'intent': '<think>\n好的,我现在需要解决的问题是用户的订单一直未发货的情况。首先,我得理解用户为什么会感到困扰,可能是因为他们急需商品或者对我们的服务产生了不满。\n\n接下来,我要考虑如何回应用户。应该先感谢他们的耐心等待,并表达歉意,这样可以缓和情绪。然后,解释订单延迟的原因,比如可能是供应链问题、物流影响还是系统故障等。同时,提供一些解决方案,比如查询最新状态或建议取消订单并退款。\n\n此外,我还需要思考是否有其他可能的解决办法,比如加快发货时间或者提供补偿措施,如优惠券或折扣,以弥补用户的不便。最后,确保整个回应清晰、有条理,并且让用户感到被重视和理解。\n</think>\n\n您的订单一直未发货给您带来了困扰,对此我们深表歉意。目前,我们正在积极处理中,预计将在未来几天内完成发货。如果情况没有改善,请随时联系我们的客服团队以获取进一步的帮助。感谢您的耐心等待和理解!', 'input': '<think>\n好的,我现在需要解决的问题是用户的订单一直未发货的情况。首先,我得理解用户为什么会感到困扰,可能是因为他们急需商品或者对我们的服务产生了不满。\n\n接下来,我要考虑如何回应用户。应该先感谢他们的耐心等待,并表达歉意,这样可以缓和情绪。然后,解释订单延迟的原因,比如可能是供应链问题、物流影响还是系统故障等。同时,提供一些解决方案,比如查询最新状态或建议取消订单并退款。\n\n此外,我还需要思考是否有其他可能的解决办法,比如加快发货时间或者提供补偿措施,如优惠券或折扣,以弥补用户的不便。最后,确保整个回应清晰、有条理,并且让用户感到被重视和理解。\n</think>\n\n您的订单一直未发货给您带来了困扰,对此我们深表歉意。目前,我们正在积极处理中,预计将在未来几天内完成发货。如果情况没有改善,请随时联系我们的客服团队以获取进一步的帮助。感谢您的耐心等待和理解!'}
2.3 路由链:多语言智能路由
from langchain_core.runnables import RunnableBranch
from langchain_core.prompts import ChatPromptTemplate
from langchain_ollama import ChatOllama
from langchain_core.output_parsers import StrOutputParser
llm = ChatOllama(model="deepseek-r1")
chinese_chain = (ChatPromptTemplate.from_template("你是一名中文客服,回答:{input}")| llm| StrOutputParser()
)
english_chain = (ChatPromptTemplate.from_template("You are an English assistant, answer: {input}")| llm| StrOutputParser()
)
default_chain = (ChatPromptTemplate.from_template("未知语言:{input}")| llm| StrOutputParser()
)
# 定义路由功能
def route_input(input: str) -> str:if any('\u4e00' <= char <= '\u9fff' for char in input): return "chinese"elif input.isascii(): return "english"return "default"
branch = RunnableBranch((lambda x: route_input(x["input"]) == "chinese", chinese_chain),(lambda x: route_input(x["input"]) == "english", english_chain),default_chain
)
full_chain = {"input": lambda x: x["input"]} | branch
print(full_chain.invoke({"input": "How to reset my password?"}))
print(full_chain.invoke({"input": "如何退换货?"}))
输出为:
<think>
Okay, so I need to figure out how to reset my password. Hmm, where do I start? Well, first off, the user wants to know the process for resetting their password, but they didn't specify which account or service they're referring to. That's a bit tricky because different platforms have different methods.
Let me think about this step by step. If someone is trying to reset their password on a website, usually there's a "Forgot Password" link somewhere. It might be on the login page or maybe in the account settings. Once they click that, they should enter the email associated with their account. Then, the system would send them a link via email to create a new password.
Wait, but what if they don't remember the email linked to their account? That could be a problem. They might need to contact customer support then. Also, sometimes when resetting a password, you have to answer security questions or go through two-factor authentication if that's enabled on their account.
Oh, and I should remind them about creating a strong new password. It shouldn't be something easy like "password123" because that's too common and insecure. They need to use a mix of letters, numbers, and symbols, maybe 8-12 characters long.
Another thing to consider is what happens if they don't have access to their email anymore or if they can't remember the security answers. In such cases, contacting support would be the way to go because they might need additional steps to verify identity before resetting the password.
I should also make sure they know not to share their new password with anyone and to keep it secure. Maybe suggest using a password manager to help them manage all their passwords safely.
Oh, and sometimes after resetting the password, it's a good idea to check all account settings just in case there were unauthorized changes. Security is important, so ensuring everything looks normal on the account is a good step.
Wait, did I cover all the bases? Let me recap: locate the reset option, enter email or username, follow instructions which might include security questions, create a strong password, and maybe contact support if there are issues. Yeah, that seems comprehensive. I think I have a solid plan here to explain how to reset a password.
</think>
To reset your password, follow these organized steps:
1. **Locate the Reset Option**: - Go to the login page of the website or service you're using and look for a "Forgot Password" link.
2. **Enter Your Email/Username**:- Click on the "Forgot Password" link and enter the email address or username associated with your account.
3. **Follow Instructions**:- Check your email for a reset link sent by the service.- If prompted, answer any security questions or go through two-factor authentication if enabled.
4. **Create a Strong Password**:- When prompted, create a new password that is secure. It should be 8-12 characters long and include a mix of letters, numbers, and symbols. Avoid common words or simple sequences like "password123".
5. **Contact Support if Needed**:- If you can't access your email or don't remember security answers, contact the service's customer support for assistance.
6. **Secure Your Account**:- After resetting, avoid sharing your password and consider using a password manager to securely manage it.- Check your account settings to ensure everything appears normal and secure.
By following these steps, you can effectively reset your password while maintaining security.
<think>
好的,我现在需要解决用户关于“如何退换货”的问题。首先,我要理解这个问题的具体要求是什么。用户可能刚刚购买了商品,遇到了一些问题,比如商品质量问题、不合适或者收到了错误的商品,所以他们想了解退货或换货的流程。
接下来,我应该考虑用户的使用场景。他们可能是第一次网购,不太清楚退换货的具体步骤,或者是遇到了问题需要帮助解决。因此,我的回答需要详细且易懂,避免使用过于专业的术语,让用户能够轻松跟随指引完成操作。
然后,我要分析用户的身份。可能是一个普通消费者,对电商流程不熟悉,所以需要详细的指导。此外,用户的真实需求不仅仅是了解流程,还包括在遇到问题时如何快速有效地解决问题,减少他们的麻烦和时间成本。
接下来,我应该考虑用户的深层需求。他们可能希望整个过程简单、透明,不会被繁琐的步骤困扰,同时希望得到及时的帮助和支持。因此,在回答中不仅要提供步骤,还要给出联系方式,让用户在遇到问题时能够寻求帮助。
现在,我要构建一个清晰的回答结构。首先,说明退换货通常需要联系卖家或平台客服,然后列出可能的几种情况:质量问题、不合适或错误商品。接着详细描述每种情况下的处理步骤,包括检查订单信息、联系卖家、提供证据、寄回商品以及退款或换货的处理。
此外,我还需要提醒用户注意一些关键点,比如保留商品原貌、及时联系客服、了解平台规则等。这些提示可以帮助用户避免常见错误,确保退换货过程顺利进行。
最后,我要确保整个回答逻辑清晰,分步骤明确,语言简洁明了。这样用户可以按照指引一步步操作,不会感到困惑或不知所措。
</think>
您好!关于如何退换货,您可以按照以下步骤进行操作:
1. **联系卖家**:首先,请您确认商品是否存在质量问题或者是否符合您的需求。如果需要退换货,请及时与卖家取得联系。
2. **提供相关信息**:- **订单号**:请准备好您的订单号以便快速查询。- **商品信息**:描述清楚商品的状况,例如是否有损坏、瑕疵等。- **照片或视频**(如有):如果商品有质量问题,请尽量提供清晰的照片或视频作为证据。
3. **寄回商品**:- 在寄回商品前,请确保商品处于原始状态,包装完整,并附上相关单据(如发票、保修卡等)。- 请使用可靠的快递方式寄回,并保存好快递单号以便查询物流信息。
4. **退款或换货处理**:- 如果您选择退货,卖家会在收到商品并确认无误后为您办理退款手续。- 如果您选择换货,请与卖家沟通明确换货的具体要求和流程。
5. **注意事项**:- 请保留好商品的原包装、说明书及相关附件,以免影响退换货的顺利进行。- 退换货通常有一定的时效性,请务必在规定时间内完成相关操作。- 如果在退换货过程中遇到任何问题,请及时联系卖家或平台客服寻求帮助。
如有其他疑问,欢迎随时咨询!祝您购物愉快!
2.4 转化链:数据清洗流水线
from langchain.chains import TransformChain
from langchain_core.prompts import ChatPromptTemplate
from langchain_ollama import ChatOllama
# 1. 定义文本清洗转换链
def clean_text(inputs: dict) -> dict:"""清洗文本:移除特殊字符和多余空格"""text = inputs["raw_text"]# 移除#号和反斜杠,并去除首尾空格cleaned = text.replace("#", "").replace("\\", "").strip()return {"cleaned_text": cleaned}
# 创建清洗链
clean_chain = TransformChain(input_variables=["raw_text"], # 输入变量名output_variables=["cleaned_text"], # 输出变量名transform=clean_text # 清洗函数
)
# 2. 定义产品信息分析链
# 使用中文提示模板
product_prompt = ChatPromptTemplate.from_template("请分析以下产品查询:{cleaned_text}\n""要求:\n""1. 识别产品类型\n""2. 列出关键参数\n""3. 给出购买建议"
)
# 初始化大语言模型
llm = ChatOllama(model="deepseek-r1:32B")
# 创建产品分析链
product_chain = product_prompt | llm
# 3. 正确组合处理管道
pipeline = clean_chain | product_chain
# 4. 创建处理函数
def process_text(input_text: str):"""处理文本的完整流程"""result = pipeline.invoke({"raw_text": input_text})return result
# 5. 测试管道
if __name__ == "__main__":# 测试用例:包含特殊字符的产品查询test_input = "##预算5000元\\的最佳#游戏笔记本#"
print("=== 测试开始 ===")print("\n【原始输入】", test_input)result = process_text(test_input)
print("\n【分析报告】")print(result.content)print("=== 测试结束 ===")
输出为:
=== 测试开始 ===
【原始输入】 ##预算5000元\的最佳#游戏笔记本#
【分析报告】
<think>
嗯,用户问的是预算5000元左右的最佳游戏笔记本。首先,我需要明确产品类型是游戏本,所以重点应该放在性能上。
接下来,考虑用户可能的需求。他们可能是在校学生或者刚工作的年轻人,希望在有限的预算内买到一款能流畅运行主流游戏的笔记本。除了玩游戏,可能还会有日常办公、多媒体娱乐的需求,所以续航和便携性也可能重要。
关键参数方面,处理器肯定是要好的,i5或者R5这种中端型号应该合适。显卡的话,RTX 3060或RX 6600M这样的独立显卡比较适合,能够应对1080p高画质游戏。内存和存储建议至少16GB RAM和512GB SSD,这样运行大型游戏更流畅,加载时间也更快。
屏幕的话,144Hz刷新率是基本要求,IPS面板能带来更好的色彩表现,对长时间使用眼睛更好。电池容量要足够支撑一段时间的游戏或者日常使用,所以至少50Wh以上比较好。
品牌方面,联想、惠普、戴尔、华硕和微星都是不错的选择,这些品牌的售后服务也比较完善,用户可以放心购买。另外,还要提醒用户注意散热设计,毕竟游戏本容易发热,影响性能发挥。
最后,根据不同的侧重点推荐几款具体的型号,比如适合主流游戏的拯救者Y7000P、追求性价比的暗影精灵9以及喜欢高刷新率屏幕的华硕天选3。这样用户可以根据自己的具体需求选择最适合的那一款。
总的来说,预算5000元的游戏本市场有很多不错的选择,重点是要在性能和价格之间找到平衡点,确保能够满足用户的主要使用场景。
</think>
### 1. **产品类型识别**- **游戏笔记本**:专注于高性能硬件配置,适合运行主流3D游戏、图形处理等高负载任务。
---
### 2. **关键参数分析**
以下是选择预算5000元游戏笔记本时需要关注的关键参数:
- **处理器(CPU)**: - 推荐选择Intel i5或AMD R5系列,如i5-13500H/R5-7600H。- 避免选择性能较低的低压处理器(如U系列)。
- **显卡(GPU)**: - 独立显卡是游戏笔记本的核心配置,推荐NVIDIA RTX 3060或AMD Radeon RX 6600M/6700M。- 显存容量建议至少8GB GDDR6。
- **内存(RAM)**: - 至少16GB DDR4/DDR5双通道内存,满足大型游戏和多任务处理需求。- 避免选择8GB内存的配置。
- **存储(SSD)**: - 推荐512GB NVMe SSD,支持快速启动和加载游戏。- 避免选择机械硬盘(HDD)或仅有256GB SSD的配置。
- **屏幕(Display)**: - 分辨率建议为1920x1080(FHD),刷新率至少144Hz,适合流畅游戏体验。- 颜色校准、高亮度和低延迟也是加分项。
- **电池与续航**: - 推荐大容量电池(≥50Wh),支持长时间使用。- 游戏本通常以性能优先,续航可能较短,但需满足日常轻度使用需求。
- **散热设计**: - 需要高效的散热系统,避免因高温导致降频,影响游戏体验。
---
### 3. **购买建议**
#### **推荐型号(预算5000元左右)**
以下是一些性价比高且适合主流游戏的笔记本推荐:
1. **联想拯救者Y7000P** - CPU:i5-13500H/R5-7600H- GPU:RTX 3060/AMD Radeon RX 7600M- 屏幕:144Hz FHD IPS- 适合主流游戏和日常使用。
2. **惠普暗影精灵9** - CPU:i5-13500H/R5-7600H- GPU:RTX 3060/AMD Radeon RX 7600M- 屏幕:144Hz FHD IPS- 性价比高,散热表现优秀。
3. **戴尔G15/G16** - CPU:i5-13500H/R5-7600H- GPU:RTX 3060/AMD Radeon RX 7600M- 屏幕:可选144Hz或165Hz FHD IPS- 品牌售后有保障,适合长时间使用。
4. **华硕天选3** - CPU:i5-13500H/R7-7730H- GPU:RTX 3060/AMD Radeon RX 7700M- 屏幕:可选144Hz或240Hz FHD IPS- 性能强劲,适合高刷新率游戏。
5. **微星冲锋TITAN GT** - CPU:i5-13500H/R7-7730H- GPU:RTX 3060/AMD Radeon RX 7700M- 屏幕:144Hz FHD IPS- 散热设计优秀,适合高性能需求。
---
#### **注意事项**
1. **关注散热设计**:游戏笔记本需要高效的散热系统,避免因高温导致性能下降。
2. **选择大品牌**:联想、惠普、戴尔、华硕等品牌的售后服务和质量更有保障。
3. **验证配置真实性**:部分商家可能会虚标配置或使用二手翻新机,建议从官网或授权渠道购买。
4. **性价比优先**:在预算范围内尽量选择性能更强的显卡和更高的刷新率屏幕。
---
#### **总结**
预算5000元左右的游戏笔记本市场中,联想拯救者Y7000P、惠普暗影精灵9和华硕天选3是性价比较高的选择。它们均搭载了i5-13500H/R5-7600H处理器和RTX 3060显卡,能够流畅运行《英雄联盟》、《原神》等主流游戏,适合大多数游戏玩家的需求。
=== 测试结束 ===
三、企业级案例:电商工单系统架构
3.1 核心流程设计
3.2 性能优化技巧
-
异步加速:非依赖任务并行执行
import asyncio
from langchain_community.llms import FakeListLLM
from langchain.prompts import PromptTemplate
async def parallel_process(inputs):# 模拟库存API的chainchain1 = create_mock_inventory_chain()
# 模拟促销信息的chainchain2 = create_mock_promotion_chain()
# 并行执行两个chainresults = await asyncio.gather(chain1.ainvoke(inputs),chain2.ainvoke(inputs))
return format_responses(*results)
def create_mock_inventory_chain():"""创建模拟库存API的chain"""responses = ["库存状态: 产品ID {} 有 150 件库存".format(i) for i in range(1, 6)]llm = FakeListLLM(responses=responses)
prompt = PromptTemplate(input_variables=["product_id"],template="查询产品 {product_id} 的库存状态")return prompt | llm
def create_mock_promotion_chain():"""创建模拟促销信息的chain"""responses = ["促销信息: 产品ID {} 享受8折优惠".format(i) for i in range(1, 4)] + ["促销信息: 产品ID {} 无促销活动".format(i) for i in range(4, 6)]llm = FakeListLLM(responses=responses)
prompt = PromptTemplate(input_variables=["product_id"],template="获取产品 {product_id} 的促销信息")return prompt | llm
def format_responses(inventory_resp, promotion_resp):"""格式化两个chain的响应结果"""return {"inventory_info": inventory_resp,"promotion_info": promotion_resp,"combined_info": f"{inventory_resp}\n{promotion_resp}"}
# 测试代码
async def main():# 测试产品ID 3result = await parallel_process({"product_id": 3})print("测试结果:")print(result)
if __name__ == "__main__":asyncio.run(main())
输出为:
测试结果:
{'inventory_info': '库存状态: 产品ID 1 有 150 件库存', 'promotion_info': '促销信息: 产品ID 1 享受8折优惠', 'combined_info': '库存状态: 产品ID 1 有 150 件库存\n促销信息: 产品ID 1 享受8折优惠'}
四、避坑指南:链式开发六大陷阱
-
循环依赖:链A依赖链B的结果,链B又依赖链A → 死锁
-
变量覆盖:多个链使用同名变量导致数据丢失
-
超时失控:复杂链式未设置超时阈值 → 服务雪崩
-
错误传播:未捕获单个链的错误 → 全流程崩溃
-
资源泄漏:未及时释放模型资源 → 内存溢出
-
监控缺失:无法定位性能瓶颈 → 优化困难
五、下期预告
《记忆(Memory)机制:让AI拥有“短期记忆”与“长期记忆”》
-
揭秘:如何让Deepseek-R1突破“7秒记忆”,实现跨会话对话历史留存?
-
实战:基于FAISS本地存储构建用户画像知识库
-
陷阱:长期记忆中的隐私泄露与合规风险
链式架构是LangChain的灵魂,掌握它意味着掌握了复杂AI系统的构建密码。记住:优秀的链式设计,既要像钟表般精密,又要像乐高般灵活!
相关文章:
6. 链式结构(Chain)的奥秘:从LLMChain到RouterChain
引言:从“单兵作战”到“流水线革命” 2023年某电商平台客服系统因处理复杂咨询需手动串联多个AI模块,平均响应时间长达12秒。引入LangChain链式架构后,工单处理速度提升8倍,错误率下降45%。本文将深入解析链式编程范式ÿ…...
TypeScript语言的操作系统原理
TypeScript语言的操作系统原理 引言 操作系统是计算机系统中最重要的组成部分之一,它为应用程序提供了一个运行环境,并管理着计算机硬件和软件资源。随着编程语言的发展,特别是TypeScript的流行,许多开发者开始探索将这种强类型…...
时间序列入门
时间序列入门 第一章 时间序列概述1.1 时间序列简介1.1.1 时间序列定义1.1.2 时间序列分量1.1.3 时间序列分类 第二章 时间序列绘图2.1 单变量时序绘制2.2 多变量时序绘制 第一章 时间序列概述 1.1 时间序列简介 1.1.1 时间序列定义 在进行时间序列之前,需要学习…...
VirtualBox安装FnOS
1.下载FnOS镜像 下载网址: https://www.fnnas.com/2.创建虚拟机 虚拟机配置如图所示(注意操作系统类型和网卡配置) (注意启动顺序) 3.启动虚拟机 网卡类型选择桥接的Virtual Adapter 如果没有IP地址或者IP地址无法…...
函数栈帧的创建与销毁
函数栈帧的创建与销毁 函数栈帧简介认识寄存器解析函数栈帧的创建与销毁 函数栈帧简介 我们在编程的过程中经常会听见函数栈帧这个词汇,那到底什么是函数栈帧呢?接下来就为大家解答一下,我们都知道,一个函数的创建是需要去开辟空…...
Scheme语言的算法
Scheme语言的算法探索 引言 Scheme是一种以表达式为基础的编程语言,属于Lisp家族,因其简洁、灵活的语法而受到广泛关注。Scheme不仅适合教学,还被用于实际应用开发和研究。本文将深入探讨Scheme语言的算法,包括其基本特性、常用…...
[C++面试] new、delete相关面试点
一、入门 1、说说new与malloc的基本用途 int* p1 (int*)malloc(sizeof(int)); // C风格 int* p2 new int(10); // C风格,初始化为10 new 是 C 中的运算符,用于在堆上动态分配内存并调用对象的构造函数,会自动计算所需内存…...
(回滚莫队)洛谷 P10268 符卡对决 题解
居然还没调出来?感觉是数据类型的问题,真是吓人。先把思路写一下吧。 题意 灵梦一共有 n n n 张符卡,每张卡都有一个能力值,对于第 i i i 张卡,它的能力值为 a i a_i ai,现在她想从中选出两张符卡并…...
C语言复习笔记--指针(3)
接上篇文章C语言复习笔记--指针(2)-CSDN博客我们继续进行指针的复习. 二级指针 指针变量也是变量,是变量就有地址,那指针变量的地址取出来后要存在在什么变量中呢?这就是⼆级指针. ⼆级指针的运算见下: 指针数组 指针数组概念 既然要联系数组和指针就涉…...
Fastjson 处理 JSON 生成与解析指南
Fastjson 是阿里巴巴开源的高性能 JSON 库,适用于 Java 对象的序列化(生成 JSON)和反序列化(解析 JSON)。以下是详细使用指南: 1. 添加依赖 <dependency><groupId>com.alibaba</groupId>…...
深度学习数据集划分比例多少合适
在机器学习和深度学习中,测试集的划分比例需要根据数据量、任务类型和领域需求灵活调整。 1. 常规划分比例 通用场景 训练集 : 验证集 : 测试集 60% : 20% : 20% 适用于大多数中等规模数据集(如数万到数十万样本),平衡了训练数…...
查询当前用户的购物车和清空购物车
业务需求: 在小程序用户端购物车页面能查到当前用户的所有菜品或者套餐 代码实现 controller层 GetMapping("/list")public Result<List<ShoppingCart>> list(){List<ShoppingCart> list shoppingCartService.shopShoppingCart();r…...
大模型如何引爆餐饮与电商行业变革
大模型如何引爆餐饮与电商行业变革? 一、时代背景:大模型重构产业逻辑的底层动力 1. 技术跃迁催生效率革命 2025年,大模型技术迎来"普惠临界点"。李开复在中关村论坛指出,大模型推理成本每年降低10倍,使得…...
【MySQL】01.MySQL环境安装
注意:在MYSQL的安装与卸载中,需要使用root用户进行。 一、卸载不必要的环境 • 查看是否有运行的服务 [rootVM-24-10-centos etc]# ps axj |grep mysql1 22030 22029 22029 ? -1 Sl 27 0:00 /usr/sbin/mysqld --daemonize --pid-fi…...
java 匿名内部类 和 Lambda 表达式
java 匿名内部类 和 Lambda 表达式 一、匿名内部类1.1说明1.2 匿名内部类的作用1.3 特点1.4 接口的正常使用情况(抽象类同理)1.5 通过局部内部类使用接口(抽象类同理)1.6 通过匿名内部类使用接口(抽象类同理࿰…...
Linux系统调用编程
进程和线程 进程是操作系统资源分配的基本单位,拥有独立的地址空间、内存、文件描述符等资源,进程间相互隔离。每个进程由程序代码、数据段和进程控制块(PCB)组成,PCB记录了进程状态、资源分配等信息。 线程是…...
Redis 数据类型详解
Redis 数据类型详解 Redis 是一个高性能的键值存储系统,支持多种数据类型,每种类型都有其特定的使用场景和操作命令。以下是 Redis 主要数据类型的详细介绍: 一、基本数据类型 1. String(字符串) 特点:…...
orangepi zero烧录及SSH联网
下载对应版本的armbian镜像 armbian的默认用户root,默认密码:1234 下载烧录工具win32diskimager https://sourceforge.net/projects/win32diskimager/files/Archive/ 插入16G以上TF卡,使用win32diskimager烧录armbian镜像 烧录完毕后用l…...
七均线策略思路
一种基于移动平均线的交易策略,具体如下: 1. 移动平均线计算: 计算了六个不同周期的收盘价移动平均值,分别为MA5、MA10、MA20、MA30、MA40和MA60。 2. 买入条件(BK): 当满足以下所有条件时执行买…...
【python脚本】基于pyautogui的python脚本
一、什么是自动化 自动化是指使用技术手段模拟人工,执行重复性任务。准确率100%,高于人工。 自动化应用场景: 自动化测试自动化运维自动化办公自动化游戏 二、pyautogui的使用 先使用 pip install pyautogui 指令安装这个第三方库 2.1 …...
人工智能时代人才培养的变革路径:模式创新、能力重塑与认证赋能
在科技日新月异的今天,人工智能(AI)已成为推动社会进步与经济发展的核心力量。从自动驾驶到医疗诊断,从金融分析到教育创新,AI的触角已延伸至人类生活的每一个角落。这一变革不仅重塑了产业格局,更对人才培养提出了前所未有的挑战与机遇。在人工智能时代,如何培养适应未…...
xpath定位
一、路径符号核心区别(表格速查) 符号名称作用范围典型使用场景性能影响/单斜杠./ 相对路径直接子级, /绝对路劲-根路径精确层级定位高效//双斜杠//当前元素下开始查找,可以跨嵌套层模糊层级/跨嵌套定位较低效 一、XPath基础定位类型&#…...
Python列表(List)深度解析
列表(List)是Python中最基础且强大的数据结构之一,但它的底层实现和特性远比表面看起来复杂。本文将深入探讨列表的各个方面。 1. 列表基础特性 1.1 可变序列类型 lst [1, 2, 3] lst[1] 20 # 可变性1.2 异构容器 mixed [1, "hello", 3.14, [1, 2]…...
Mybatis---入门
1. 什么是MyBatis? MyBatis是⼀款优秀的 持久层 框架,⽤于简化JDBC的开发。 MyBatis本是 Apache的⼀个开源项⽬iBatis,2010年这个项⽬由apache迁移到了google code,并且改名为MyBatis 。2013年11⽉迁移到Github. 官⽹:MyBa…...
FPGA--HDLBits网站练习
目录 用状态机编写一个 LED流水灯代码 CPLD和FPGA芯片 CPLD(复杂可编程逻辑器件) FPGA(现场可编程门阵列) Verilog练习 基本 向量 用状态机编写一个 LED流水灯代码 往期作业已完成,博客地址: FPGA…...
《Linux内存管理:实验驱动的深度探索》【附录】【实验环境搭建 4】【Qemu 如何模拟numa架构】
我们在学习 linux 内核时,会涉及到很多 numa 的知识,那我们该如何在 qemu 中模拟这种情况,来配合我们的学习呢? 我们该如何模拟 如下的 numa 架构 Qemu 模拟 NUMA 架构 -M virt,gic-version3,virtualizationon,typevirt \ -cp…...
如何分析 jstat 统计来定位 GC?
全文目录: 开篇语前言摘要概述jstat 的核心命令与参数详解基本命令格式示例 jstat 输出解读主要字段含义 典型 GC 问题分析案例案例 1:年轻代 GC 过于频繁案例 2:老年代发生频繁 Full GC案例 3:元空间(Metaspace&#…...
Day51 | 3. 无重复字符的最长子串、12. 整数转罗马数字、49. 字母异位词分组、73. 矩阵置零
3. 无重复字符的最长子串 题目链接:3. 无重复字符的最长子串 - 力扣(LeetCode) 题目难度:中等 代码: class Solution {public int lengthOfLongestSubstring(String s) {Set<Character> setnew HashSet<&…...
【Linux系统编程】进程概念,进程状态
目录 一,操作系统(Operator System) 1-1概念 1-2设计操作系统的目的 1-3核心功能 1-4系统调用和库函数概念 二,进程(Process) 2-1进程概念与基本操作 2-2task_struct结构体内容 2-3查看进程 2-4通…...
第二十八章:Python可视化图表扩展-和弦图、旭日图、六边形箱图、桑基图和主题流图
一、引言 在数据可视化领域,除了常见的折线图、柱状图和散点图,还有一些高级图表类型可以帮助我们更直观地展示复杂数据关系。本文将介绍五种扩展图表:和弦图、旭日图、六边形箱图、桑基图和主题流图。这些图表在展示数据关系、层次结构和流量…...
深入理解C++引用:从基础到现代编程实践
一、引用的本质与基本特性 1.1 引用定义 引用是为现有变量创建的别名,通过&符号声明。其核心特点: 必须初始化且不能重新绑定 与被引用变量共享内存地址 无独立存储空间(编译器实现) 类型必须严格匹配 int value 42; in…...
OpenVLA-OFT——微调VLA的三大关键设计:支持动作分块的并行解码、连续动作表示以及L1回归目标
前言 25年3.26日,这是一个值得纪念的日子,这一天,我司「七月在线」的定位正式升级为了:具身智能的场景落地与定制开发商 ,后续则从定制开发 逐步过渡到 标准产品化 比如25年q2起,在定制开发之外࿰…...
linux3 mkdir rmdir rm cp touch ls -d /*/
Linux 系统的初始目录结构遵循 FHS(Filesystem Hierarchy Standard,文件系统层次标准),定义了每个目录的核心功能和存储内容。以下是 Linux 系统初始安装后的主要目录及其作用: 1. 核心系统目录 目录用途典型内容示例…...
TDengine 中的视图
简介 从 v3.2.1.0 开始,TDengine 企业版提供视图功能,便于用户简化操作,提升用户间的分享能力。 视图(View)本质上是一个存储在数据库中的查询语句。视图(非物化视图)本身不包含数据ÿ…...
算法设计学习9
实验目的及要求: 通过排序算法的实验,旨在深化学生对不同排序算法原理和性能的理解,培养其分析和比较算法效率的能力。通过实际编程,学生将掌握排序算法的实现方法,了解不同算法的优劣,并通过性能测试验证其…...
PGSQL 对象创建函数生成工具
文章目录 代码结果 代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>PGSQL 函数生成器</tit…...
企业安全——FIPs
0x00 前言 先来看一道题目。这道题目涉及到的就是道德规范和互联网相关内容,本文会对相关内容进行描述和整理。 正确答案是:D 注意FIPs的主要目的是为了限制,也就是针对数据的守则。 0x01 RFC 1087 1989年1月 互联网架构委员会 IAB 发布了…...
历年跨链合约恶意交易详解(二)——XBridge20240424攻击
漏洞合约函数 /*** dev token owner can list the pair of their token with their corresponding chain id* param baseToken struct that contains token address and its corresponding chain id* param correspondingToken struct that contains token address and its cor…...
《AI大模型开发笔记》MCP快速入门实战(一)
目录 1. MCP入门介绍 2. Function calling技术回顾 3. 大模型Agent开发技术体系回顾 二、 MCP客户端Client开发流程 1. uv工具入门使用指南 1.1 uv入门介绍 1.2 uv安装流程 1.3 uv的基本用法介绍 2.MCP极简客户端搭建流程 2.1 创建 MCP 客户端项目 2.2 创建MCP客户端…...
01背包问题:详细解释为什么重量维度必须从大到小遍历。
01背包 问题描述 题目链接:https://www.lanqiao.cn/problems/1174/learning/?page1&first_category_id1&problem_id1174 特点:每件物品只能拿或者不拿。 解法1 设置状态:dp[i][j]指的是前i件物品重量为j的最大价值。 第i件物品…...
Nginx配置伪静态,URL重写
Nginx配置伪静态,URL重写 [ Nginx ] 在Nginx低版本中,是不支持PATHINFO的,但是可以通过在Nginx.conf中配置转发规则实现: location / { // …..省略部分代码if (!-e $request_filename) {rewrite ^(.*)$ /index.php?s/$1 l…...
【KMP】P10915 [蓝桥杯 2024 国 B] 最长回文前后缀|普及+
本文涉及知识点 较难理解的字符串查找算法KMP P10915 [蓝桥杯 2024 国 B] 最长回文前后缀 题目描述 小明特别喜欢回文串,然而回文串太少见了,因此他定义了一个字符串的相同长度的、不相交的前缀和后缀是“回文前后缀”,当且仅当这个前缀和…...
【linux学习】linux系统调用编程
目录 一、任务、进程和线程 1.1任务 1.2进程 1.3线程 1.4线程和进程的关系 1.5 在linux系统下进程操作 二、Linux虚拟内存管理与stm32的真实物理内存区别 2.1 Linux虚拟内存管理 2.2 STM32的真实物理内存映射 2.3区别 三、 Linux系统调用函数 fork()、wait()、exec(…...
构建第一个ArkTS应用:Hello World之旅
# 构建第一个ArkTS应用:Hello World之旅 在鸿蒙应用开发的领域中,ArkTS语言为我们提供了强大而便捷的开发方式。今天,就让我们一起踏上构建第一个ArkTS应用——Hello World的奇妙旅程。 ## 一、创建ArkTS工程 1. 首先,我们要使用…...
Mysql 集群架构 vs 主从复制架构
特性主从复制架构MySQL 集群架构适用场景读多写少的场景;备份;高可用高并发读写、实时交易、高可用性场景可扩展性仅读性能可扩展读写都可以水平扩展高可用性手动切换,有限的高可用支持自动故障转移,强高可用支持部署复杂度较简单…...
国产轻量级多途径无限制的高效下载工具介绍
软件介绍 们在日常中常常有下载各类文件的需求,学习资料也好,娱乐文件也罢。有一款国产的BT下载软件——BitComet(比特彗星),它凭借高效且无限制的特性,在下载爱好者中备受青睐。 BitComet属于轻量级的BT下…...
leetcode数组-长度最小的子数组
题目 题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/ 给定一个含有 n个正整数的数组和一个正整数 target** 。** 找出该数组中满足其总和大于等于target的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度**…...
如何理解缓存一致性?
缓存一致性是指在多处理器系统或分布式系统中,确保各个处理器核心或节点的缓存数据与主内存以及其他缓存中的数据保持一致的机制和过程。以下从问题产生原因、一致性协议和实现方式等方面进行详细理解: 1. 问题产生的原因 1.1 缓存存在的必要性 在计…...
智能体(Agent)系统源码解析:AI 自动化办公的未来
—从代码到商业落地,如何用Agent重构企业工作流? 一、Agent系统的核心价值 1. 企业办公效率的瓶颈 重复性任务耗时:数据录入、报表生成、邮件处理等占员工 40% 工作时间跨系统协作低效:OA/CRM/ERP数据孤岛,人工搬运错…...
字符串移位包含问题
字符串移位包含问题 #include <iostream> #include <algorithm> using namespace std; int main(){string a,b;cin>>a>>b;//谁长遍历谁if(a.size()<b.size()) swap(a,b);//1-对整个字符串进行移位for(int i0; i<a.size(); i){//每次循环都将第一…...