当前位置: 首页 > article >正文

Prompt Engineering与LangChain实战:从零构建AI应用开发指南

1. 从零到一用Prompt Engineering与LangChain构建实用AI应用如果你对ChatGPT的对话能力感到惊叹并开始思考如何将这种能力集成到你自己的Python应用里比如让它帮你分析私人文档、自动处理工作流或者构建一个专属的知识库助手那么你找对地方了。我自己在将大型语言模型应用到实际项目的过程中发现了一个核心矛盾模型本身很强大但直接调用API往往难以处理复杂的、多步骤的、或需要特定领域知识的任务。这就是Prompt Engineering和LangChain框架大显身手的地方。简单来说Prompt Engineering教你如何“正确地提问”以引导模型输出最佳答案而LangChain则像一套乐高积木帮你把模型、你的数据、各种工具如搜索引擎、计算器以及记忆模块优雅地组装成一个功能完整的AI应用。本文将带你深入这两个核心领域通过一系列可运行的代码示例手把手教你构建从简单到复杂的真实AI应用无论是处理PDF文档、创建智能客服还是部署私有模型你都能找到清晰的路径和避坑指南。2. 核心概念拆解为什么是Prompt Engineering LangChain在直接敲代码之前理解背后的“为什么”至关重要。这能让你在遇到问题时不只是复制粘贴而是知道如何调整和优化。2.1 Prompt Engineering不止是“提问的艺术”很多人认为Prompt Engineering就是“把问题写清楚”这没错但远远不够。它更像是一门与AI模型高效协作的“设计科学”。其核心目标是通过精心设计的输入文本最大化激发模型完成特定任务的能力并确保输出的稳定性、准确性和安全性。为什么需要它大型语言模型本质上是基于海量文本训练出的“模式匹配与生成引擎”。一个模糊的指令比如“总结一下”模型可能会生成一段概述、一个列表甚至是一段反问。Prompt Engineering通过提供明确的角色、上下文、任务格式和示例将模型的“发散思维”约束到我们期望的轨道上。例如一个简单的总结任务经过Prompt设计可以变为“你是一位金融分析师请将以下上市公司年报的‘管理层讨论与分析’部分用不超过三句话总结其核心风险与机遇。首先列出风险然后列出机遇。” 这样的Prompt显著提升了输出的专业性和可用性。关键技巧实录角色扮演Role Prompting 为模型设定一个身份如“资深软件工程师”、“专业文案编辑”这能极大改善输出的语调和专业性。少样本学习Few-Shot Learning 在Prompt中提供1-3个输入输出的例子。这是引导模型理解复杂格式要求的最有效方法之一。例如如果你想让模型将商品描述改写成广告语先给它展示一两个你手工制作的范例。结构化输出 明确要求模型以JSON、Markdown列表或特定关键词的形式输出。这为后续的程序化处理铺平了道路。你可以直接写“请以JSON格式输出包含summary、key_points数组和sentimentpositive/neutral/negative三个字段。”链式思考Chain-of-Thought 对于需要逻辑推理或数学计算的问题在Prompt中鼓励模型“一步一步思考”。例如“首先计算总成本。然后计算平均成本。最后给出建议。” 这能显著提升复杂任务的准确率。注意Prompt不是越详细越好。过于冗长的Prompt可能会消耗大量上下文窗口Token增加成本有时甚至会引入矛盾指令导致模型混乱。迭代和测试是关键。2.2 LangChainAI应用的“装配流水线”如果说Prompt Engineering是优化单个指令那么LangChain就是用来设计和执行一系列指令或动作的框架。它解决了构建LLM应用时的几个核心工程难题模块化 LangChain将整个应用流程抽象为几个核心概念模型Models、提示模板Prompts、链Chains、记忆Memory、索引Indexes和代理Agents。你可以像搭积木一样组合它们。上下文管理 如何让模型记住之前的对话如何将超出模型上下文长度的长文档喂给它LangChain提供了多种记忆机制和文本分割、检索方法。工具集成 模型不擅长数学计算、实时信息检索或执行具体API操作。LangChain的“代理”模式可以让模型学会调用你提供的工具如Python REPL、搜索引擎、自定义函数从而突破其固有局限。数据连接 你的数据可能在PDF、Word、网页或数据库中。LangChain提供了丰富的文档加载器Document Loaders并能将加载的文档转换为可检索的向量存储实现基于语义的“私有知识库”问答。为什么选择LangChain而不是直接调用API想象一下你要构建一个“多PDF文档问答系统”。你需要读取并解析多个PDF将文本分割成块将每一块转换为向量并存储根据用户问题检索最相关的文本块然后将这些文本块和问题组合成一个Prompt发送给LLM最后解析回复。手动实现这一切需要大量胶水代码。LangChain将这些步骤封装成了标准的、可复用的组件你只需关注业务逻辑和流程设计。3. 环境搭建与核心组件初体验理论说够了我们开始动手。首先确保你有一个可用的Python环境3.8然后安装LangChain及其相关依赖。这里我们以OpenAI的模型为例但你完全可以用同样的逻辑接入开源的Llama 2或Falcon。3.1 基础环境配置打开你的终端或笔记本创建一个新的虚拟环境是个好习惯。# 创建并激活虚拟环境可选但推荐 python -m venv langchain-env source langchain-env/bin/activate # Linux/macOS # langchain-env\Scripts\activate # Windows # 安装核心库 pip install langchain openai python-dotenv # 安装一些可能用到的工具和文档加载器 pip install chromadb tiktoken pypdf接下来你需要一个OpenAI的API密钥。将其保存在项目根目录的.env文件中不要硬编码在代码里。# .env 文件内容 OPENAI_API_KEY你的-api-key-here3.2 第一个LangChain程序与模型对话让我们从最基础的开始初始化模型发送一个Prompt。# 1. 导入并加载环境变量 from langchain.llms import OpenAI from langchain.chat_models import ChatOpenAI from langchain.schema import HumanMessage import os from dotenv import load_dotenv load_dotenv() # 从 .env 文件加载密钥 # 2. 初始化两种模型接口 # LLM用于文本补全的传统接口 llm OpenAI(model_namegpt-3.5-turbo-instruct, temperature0.7) # ChatModel为对话优化的接口推荐 chat_model ChatOpenAI(model_namegpt-3.5-turbo, temperature0.7) # 3. 使用LLM简单文本输入输出 prompt_text 用一句话解释量子计算。 response llm(prompt_text) print(fLLM回复: {response}) # 4. 使用ChatModel使用消息格式 messages [HumanMessage(content用一句话解释量子计算。)] response chat_model(messages) print(fChatModel回复: {response.content})参数解析与避坑指南temperature温度控制输出的随机性。范围0~1。值越高如0.8输出越有创意、越多样值越低如0.1输出越确定、越保守。对于需要事实准确性的任务如问答、总结建议设置在0.1-0.3对于创意写作可以调到0.7以上。model_name指定使用的模型。gpt-3.5-turbo性价比高响应快gpt-4更强大更精准但成本也高得多。根据任务复杂度选择。实操心得在开发初期建议将temperature设为0以确保相同的输入得到稳定的输出方便调试Prompt。等逻辑稳定后再适当调高以增加多样性。3.3 使用提示模板Prompt Templates直接拼接字符串构造Prompt既麻烦又容易出错。LangChain的提示模板能帮你管理可复用的Prompt结构。from langchain.prompts import PromptTemplate # 1. 创建一个带变量的模板 template 你是一位专业的{role}。 请根据以下背景信息完成后续任务。 背景信息 {context} 任务 {task} 请确保你的回答清晰、专业并符合{role}的身份。 prompt_template PromptTemplate( input_variables[role, context, task], templatetemplate, ) # 2. 使用变量填充模板 filled_prompt prompt_template.format( role市场营销专员, context我们公司新推出了一款面向程序员的高效代码编辑器特点是轻量、启动快、插件生态丰富。, task为这款产品写一句吸引眼球的广告语。 ) print(f生成的Prompt:\n{filled_prompt}\n) # 3. 将模板与模型连接起来直接运行 from langchain.chains import LLMChain chain LLMChain(llmchat_model, promptprompt_template) result chain.run({ role: 技术博主, context: LangChain是一个用于开发由语言模型驱动的应用程序的框架。, task: 向编程新手介绍LangChain的核心价值不超过100字。 }) print(f链式调用结果: {result})为什么用模板它实现了Prompt的逻辑与数据的分离。你可以维护一个“模板库”针对不同任务如写邮件、写SQL、做总结使用不同的模板只需注入具体的变量即可。这大大提升了代码的可维护性和Prompt的复用性。4. 构建复杂应用链Chains、记忆Memory与检索Retrieval单一问答能力有限真正的应用需要串联多个步骤并记住上下文。4.1 创建顺序链Sequential Chains很多任务需要分步进行。例如先总结一篇长文再基于总结写一封邮件。from langchain.chains import SimpleSequentialChain, LLMChain from langchain.prompts import PromptTemplate # 第一步总结链 summary_template 你是一位内容总结专家。 请用三段话总结以下文本 {text} summary_prompt PromptTemplate(input_variables[text], templatesummary_template) summary_chain LLMChain(llmchat_model, promptsummary_prompt, output_keysummary) # 第二步邮件撰写链依赖上一步的输出 email_template 你是一位商务沟通专家。 根据以下内容摘要撰写一封发给客户的简短跟进邮件突出摘要中的核心价值。 内容摘要 {summary} 邮件正文 email_prompt PromptTemplate(input_variables[summary], templateemail_template) email_chain LLMChain(llmchat_model, promptemail_prompt, output_keyemail) # 组合成顺序链 overall_chain SimpleSequentialChain(chains[summary_chain, email_chain], verboseTrue) # 运行 long_text 这里是你的长篇文章内容...此处省略 final_result overall_chain.run(long_text) print(final_result)设置verboseTrue可以在运行时看到每一步的输入输出对调试非常有帮助。4.2 为聊天机器人添加记忆Memory没有记忆的对话机器人每次都是“金鱼脑”。LangChain提供了多种记忆后端。from langchain.memory import ConversationBufferMemory, ConversationBufferWindowMemory from langchain.chains import ConversationChain # 1. 缓冲区记忆记住所有历史对话简单但可能消耗大量Token memory ConversationBufferMemory() conversation ConversationChain( llmchat_model, memorymemory, verboseTrue # 查看内部过程 ) print(conversation.predict(input你好我叫小明。)) print(conversation.predict(input我的名字是什么)) # 它能记住 # 2. 滑动窗口记忆只记住最近的K轮对话节省Token防止上下文过长 window_memory ConversationBufferWindowMemory(k2) # 只记住最近2轮 conversation2 ConversationChain(llmchat_model, memorywindow_memory, verboseTrue) print(conversation2.predict(input我喜欢苹果。)) print(conversation2.predict(input我也喜欢香蕉。)) print(conversation2.predict(input“我刚才说我喜欢什么水果”)) # 可能只记得“香蕉”因为窗口大小是2记忆方案选型心得ConversationBufferMemory适用于对话轮次少、需要完整上下文的情景。ConversationBufferWindowMemory适用于长时间聊天控制成本但可能丢失早期关键信息。ConversationSummaryMemory让模型自动总结之前的对话历史用总结摘要代替原始记录能在长对话中平衡记忆和Token消耗。这是处理长上下文非常实用的策略。VectorStoreRetrieverMemory将历史对话存入向量数据库每次根据当前问题检索相关记忆。这是最强大也最复杂的方式适合构建有长期“记忆”的智能体。4.3 构建私有知识库问答系统检索链RetrievalQA这是LangChain最经典的应用场景之一让你的模型能够回答关于特定文档如公司手册、产品文档、个人笔记的问题。from langchain.document_loaders import PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores import Chroma from langchain.chains import RetrievalQA # 1. 加载文档以PDF为例 loader PyPDFLoader(你的产品手册.pdf) # 替换为你的PDF路径 documents loader.load() # 2. 分割文本因为模型有上下文长度限制 text_splitter RecursiveCharacterTextSplitter( chunk_size1000, # 每个块的最大字符数 chunk_overlap200, # 块之间的重叠字符防止语义被切断 length_functionlen, ) texts text_splitter.split_documents(documents) print(f将文档分割成了 {len(texts)} 个文本块。) # 3. 创建向量存储将文本转换为向量并存储以便检索 embeddings OpenAIEmbeddings() # 使用Chroma作为本地向量数据库轻量易用 vectorstore Chroma.from_documents(documentstexts, embeddingembeddings, persist_directory./chroma_db) # 如果需要持久化可以调用 vectorstore.persist() # 4. 创建检索器 retriever vectorstore.as_retriever(search_kwargs{k: 3}) # 检索最相关的3个文本块 # 5. 创建检索问答链 qa_chain RetrievalQA.from_chain_type( llmchat_model, chain_typestuff, # 最常用的类型将检索到的所有文档“塞”进Prompt retrieverretriever, return_source_documentsTrue, # 返回源文档便于溯源 verboseTrue ) # 6. 提问 question 你们产品的保修期是多久 result qa_chain({query: question}) print(f问题: {question}) print(f答案: {result[result]}) print(\n--- 参考来源 ---) for doc in result[source_documents][:2]: # 显示前两个来源 print(f内容片段: {doc.page_content[:300]}...) print(f来源: {doc.metadata}\n)核心参数与避坑指南chunk_size这是最重要的参数之一。太小如200会丢失上下文太大如2000可能超出模型处理能力且检索不精准。对于GPT-3.5/41000-1500是个不错的起点。你需要根据文档特性段落长度、结构进行调整。chunk_overlap设置重叠可以避免一个完整的句子或概念被硬生生切成两半通常设为chunk_size的10%-20%。search_kwargs{“k”: 3}检索返回的文档数量。返回越多答案可能越全面但也会消耗更多Token并可能引入噪声。从2-4开始尝试。chain_type“stuff”最简单直接将所有检索到的文档合并成一个上下文。适合文档块较小、总长度不超过模型上下文窗口的情况。“map_reduce”先对每个文档块单独生成答案再汇总这些答案。适合处理大量或长文档但速度慢、成本高。“refine”迭代式处理用前一个块的答案作为上下文来处理下一个块。能产生连贯的长答案但顺序依赖性强。“map_rerank”对每个块打分只使用高分块。质量高但更复杂。新手建议优先使用“stuff”只有在遇到“上下文长度超限”错误时再考虑其他复杂类型。注意使用OpenAI Embeddings会产生API调用费用。如果你的文档集很大且固定可以考虑使用开源的嵌入模型如sentence-transformers库中的模型在本地运行虽然精度可能略有差异但可以零成本进行检索。5. 释放智能体Agents的潜力让LLM学会使用工具当模型的知识过时或无法执行具体操作时代理模式是终极解决方案。你可以赋予模型使用搜索引擎、计算器、数据库甚至执行代码的能力。5.1 使用内置工具LangChain内置了许多实用工具。from langchain.agents import load_tools, initialize_agent, AgentType from langchain.llms import OpenAI # 注意某些工具需要额外API密钥如SerpAPI谷歌搜索 llm_for_agent OpenAI(temperature0) # 代理任务通常需要确定性更高的输出 # 加载工具集 tools load_tools([serpapi, llm-math], llmllm_for_agent) # 需要设置SERPAPI_API_KEY环境变量 # 初始化代理 agent initialize_agent( tools, llm_for_agent, agentAgentType.ZERO_SHOT_REACT_DESCRIPTION, # 最通用的代理类型 verboseTrue, # 必须打开才能看到代理的“思考过程” handle_parsing_errorsTrue # 优雅处理解析错误 ) # 提问一个需要结合实时信息和计算的问题 result agent.run(截至今天特斯拉TSLA的股价是多少如果我现在投资10000美元能买多少股请给出计算过程) print(result)运行上述代码你会看到类似以下的输出verbose模式 Entering new AgentExecutor chain... 我需要找到特斯拉当前的股价然后计算10000美元能买多少股。 行动搜索 行动输入特斯拉 TSLA 当前股价 观察[搜索引擎返回的结果例如$215.34] 思考现在我需要计算10000美元可以买多少股。 行动计算器 行动输入10000 / 215.34 观察46.45 思考我得到了结果。 最终答案截至今天特斯拉股价约为215.34美元。投资10000美元大约可以购买46.45股。 Finished chain.代理类型解析ZERO_SHOT_REACT_DESCRIPTION最常用。代理根据工具的描述来决定使用哪个工具不需要示例。CONVERSATIONAL_REACT_DESCRIPTION在ZERO_SHOT基础上增加了对话记忆适合多轮交互的代理。OPENAI_FUNCTIONS/OPENAI_MULTI_FUNCTIONS专为与OpenAI的function calling特性优化更稳定可靠是当前推荐的方式。5.2 创建自定义工具将你的内部API或函数变成模型可以调用的工具这是构建企业级AI应用的关键。from langchain.tools import Tool from datetime import datetime # 1. 定义一个普通的Python函数 def get_current_time(format: str %Y-%m-%d %H:%M:%S) - str: 获取当前的日期和时间。可以指定格式默认是年-月-日 时:分:秒。 now datetime.now() return now.strftime(format) # 2. 用Tool类包装它 time_tool Tool( nameCurrent Time Getter, funcget_current_time, description当用户询问当前时间、日期或现在几点时非常有用。输入应为期望的时间格式字符串例如 %H:%M 只要小时和分钟。 ) # 3. 将自定义工具与其他工具一起放入列表 custom_tools [time_tool] # 4. 初始化代理这里为了演示只使用自定义工具 from langchain.agents import initialize_agent agent_with_custom_tool initialize_agent( custom_tools, llm_for_agent, agentAgentType.ZERO_SHOT_REACT_DESCRIPTION, verboseTrue, ) # 5. 运行 print(agent_with_custom_tool.run(现在几点了)) print(agent_with_custom_tool.run(今天的日期用‘月/日/年’的格式显示。))自定义工具设计心得描述description至关重要这是模型决定是否以及何时调用该工具的唯一依据。描述必须清晰、准确说明工具的用途、适用场景和输入格式。好的描述能极大提升代理的决策准确性。处理错误在自定义函数内部做好异常处理返回清晰的错误信息以便代理能理解并尝试其他方案。输入验证对于复杂的输入可以在函数开头进行验证确保代理传递的参数是有效的。6. 进阶实战与部署考量掌握了核心组件后我们可以探索更复杂的场景和产品化部署。6.1 使用本地开源模型如Llama 2依赖OpenAI API虽然方便但有成本、延迟和隐私顾虑。使用本地部署的开源模型是一个强大的替代方案。这里以结合HuggingFace和Llama 2为例需要先申请Meta的许可并下载模型。# 示例使用HuggingFace管道本地运行模型需要强大GPU from langchain.llms import HuggingFacePipeline from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline import torch model_id meta-llama/Llama-2-7b-chat-hf # 或你本地的模型路径 tokenizer AutoTokenizer.from_pretrained(model_id) model AutoModelForCausalLM.from_pretrained( model_id, torch_dtypetorch.float16, # 半精度节省显存 device_mapauto, # 自动分配GPU/CPU ) pipe pipeline( text-generation, modelmodel, tokenizertokenizer, max_new_tokens512, temperature0.7, ) local_llm HuggingFacePipeline(pipelinepipe) # 像使用OpenAI模型一样使用它 prompt 为什么天空是蓝色的 response local_llm(prompt) print(response)本地模型部署注意事项硬件要求7B参数的模型需要至少8GB GPU显存用于推理13B/70B则需要更多。使用量化技术如GPTQ、GGUF格式可以大幅降低显存需求。性能与质量同等参数下开源模型的效果通常弱于GPT-4可能接近或略低于GPT-3.5 Turbo但完全私有化部署的优势明显。推荐工具链模型加载与推理transformersaccelerate原生PyTorch。量化与高效推理bitsandbytesQLoRA量化训练与推理、llama.cpp在CPU上高效运行GGUF模型。本地向量库Chroma轻量、FAISSFacebook出品性能高。6.2 部署到生产环境从脚本到服务开发完成后你需要一个稳定的服务来提供API。封装为FastAPI服务# main.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel from langchain.chains import RetrievalQA from langchain.vectorstores import Chroma from langchain.embeddings import OpenAIEmbeddings import os app FastAPI() # 在启动时加载你的QA系统假设已持久化 vectorstore Chroma(persist_directory./chroma_db, embedding_functionOpenAIEmbeddings()) qa_chain RetrievalQA.from_chain_type(llm..., retrievervectorstore.as_retriever(), ...) class QueryRequest(BaseModel): question: str app.post(/ask) async def ask_question(request: QueryRequest): try: result qa_chain({query: request.question}) return {answer: result[result]} except Exception as e: raise HTTPException(status_code500, detailstr(e))使用uvicorn main:app --host 0.0.0.0 --port 8000启动服务。使用LangServeLangChain官方提供的部署工具能自动将你的Chain转换为REST API并附带Playground界面非常方便。部署在云服务器或容器中使用Docker将你的应用及其所有依赖Python环境、模型文件等打包。云服务商如RunPod、Replicate、HuggingFace Inference Endpoints都提供了专门部署LLM应用的方案。6.3 成本优化与监控当应用用户量增长时成本控制变得重要。缓存对相同的查询结果进行缓存。LangChain内置了SQLiteCache、RedisCache等。from langchain.cache import SQLiteCache import langchain langchain.llm_cache SQLiteCache(database_path.langchain.db)限流与批处理对API调用进行限流避免突发请求。对于非实时任务可以考虑将请求批量处理。Token使用监控在调用LLM时记录输入的Prompt Token数和输出的Completion Token数。OpenAI API的返回中包含了这些信息。建立监控看板分析消耗大户优化Prompt或流程。模型选型在效果可接受的范围内选择更经济的模型。例如用gpt-3.5-turbo代替gpt-4处理简单任务。7. 常见问题排查与调试技巧在实际开发中你一定会遇到各种问题。这里记录了一些高频问题的解决思路。问题1模型输出不符合预期或胡言乱语。检查Temperature是否设置过高尝试将其设为0。检查Prompt指令是否清晰尝试加入“角色扮演”和“少样本示例”。检查上下文是否提供了足够且相关的背景信息对于检索链检查检索到的文档块是否真的与问题相关。模型本身限制对于开源小模型能力有限复杂任务可能无法完成需要考虑换用更大模型或简化任务。问题2检索问答链的答案不准确或“幻觉”严重编造内容。调整检索参数增加search_kwargs{“k”: 4}让模型看到更多上下文。尝试不同的chunk_size和chunk_overlap。优化检索本身检查嵌入模型是否合适。对于中文使用text-embedding-ada-002或专门的中文嵌入模型。确保向量数据库的相似度搜索算法如余弦相似度工作正常。在Prompt中强调“基于上下文”在问答链的Prompt模板开头加入“请严格根据以下提供的上下文信息来回答问题。如果上下文中的信息不足以回答问题请直接说‘根据已知信息无法回答该问题’不要编造信息。”启用源文档追溯像我们之前的例子一样返回source_documents人工检查模型到底参考了哪些内容这能帮你判断是检索问题还是生成问题。问题3代理Agent陷入循环或调用错误工具。开启Verbose模式这是调试代理的第一步仔细观察它的“思考-行动-观察”循环在哪里出了问题。优化工具描述确保每个工具的描述都极其精准明确其功能和输入格式。模糊的描述会导致代理误用。设置最大迭代次数使用max_iterations和max_execution_time参数防止代理无限循环。agent_executor initialize_agent(..., max_iterations5, early_stopping_methodgenerate)尝试不同的Agent类型从ZERO_SHOT_REACT_DESCRIPTION切换到OPENAI_FUNCTIONS后者通常更稳定。问题4处理长文档时遇到上下文长度限制错误。优化文本分割这是最关键的一步。尝试更小的chunk_size如500和智能分割器如按标记tiktoken分割或按语义分割。使用Map-Reduce或Refine链如前所述改用能处理长文档的链类型。摘要递归对于极长文档可以先对每个大章节生成摘要再对摘要进行问答。构建基于大语言模型的应用是一个持续迭代和优化的过程。从设计清晰的Prompt开始用LangChain的模块搭建原型通过不断的测试和调试来解决“幻觉”、上下文管理、工具调用等挑战最终将其部署为可靠的服务。记住没有一劳永逸的配置最好的系统总是根据你的具体数据、任务和用户反馈打磨出来的。希望这篇详尽的指南能为你提供坚实的起点和清晰的路线图助你顺利开启构建实用AI应用的旅程。如果在实践中遇到具体问题不妨回到对应的章节看看参数调整和避坑指南或许就能找到灵感。

相关文章:

Prompt Engineering与LangChain实战:从零构建AI应用开发指南

1. 从零到一:用Prompt Engineering与LangChain构建实用AI应用如果你对ChatGPT的对话能力感到惊叹,并开始思考如何将这种能力集成到你自己的Python应用里,比如让它帮你分析私人文档、自动处理工作流,或者构建一个专属的知识库助手&…...

Dell G15散热控制终极指南:开源替代方案tcc-g15完整教程

Dell G15散热控制终极指南:开源替代方案tcc-g15完整教程 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 你是否曾经为Dell G15笔记本的过热问题而烦…...

【刷题】力扣739.每日温度

739. 每日温度 一开始错误代码&#xff1a; class Solution { public:vector<int> dailyTemperatures(vector<int>& temperatures) {stack<int> st;int lentemperatures.size();vector<int> res(len,0);// st.push(0);for(int i0;i<len;i){/…...

YOLO11涨点优化:特征融合优化 | 引入RepPAN结构,基于重参数化技术重构YOLO11的特征金字塔

一、开篇:YOLO11的Neck,真的够用了吗? 2024年9月30日,Ultralytics在YOLO Vision 2024(YV24)活动上正式发布了YOLO11模型。根据Ultralytics官方介绍,YOLO11引入了C3K2模块、增强版SPPF快速空间金字塔池化和C2PSA空间注意力机制三大核心创新,以更少的参数实现了更高的精…...

KingFusion|最近开发调试中遇到的几个问题及解决办法(2)

最近在用KingFusion软件做一个MES系统项目的实施&#xff1b;在开发调试过程中遇到一些问题&#xff0c;为了以后更好更快的在以后遇到同类型的问题&#xff0c;现将最近遇到问题及解决办法整理记录下来。01、报错&#xff1a;服务发现请求失败浏览器调试时报错&#xff1a;err…...

助睿实验作业1_完整版_带预留区

助睿实验作业1-订单利润分流数据加工一、实验背景1.1 实验目的本次实验旨在熟悉助睿零代码数据集成平台&#xff08;ETL平台&#xff09;的核心功能和操作方法&#xff0c;具体包括&#xff1a;掌握新建转换、添加组件、执行转换等基本操作流程熟悉表输入、记录集连接、字段选择…...

燃烧后CO2捕集系统的广义预测控制分数阶PID【附代码】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导&#xff0c;毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;查看文章底部二维码 &#xff08;1&#xff09;基于子空间辨识的PCC系统状态空间模型&#xff1a…...

自指拓扑场论:三维几何、粒子与相互作用V1.0(世毫九实验室原创研究)

自指拓扑场论&#xff1a;三维几何、粒子与相互作用【零自由参数&#xff08;0‑parameter&#xff09;】作者&#xff1a;方见华 单位&#xff1a;世毫九实验室 版本&#xff1a;V1.0 核心主张&#xff1a;以自指不动点与三维可平行化流形两条公理为唯一前提&#xff0c;无自…...

Legacy-iOS-Kit:如何用开源技术让经典iOS设备重获新生?

Legacy-iOS-Kit&#xff1a;如何用开源技术让经典iOS设备重获新生&#xff1f; 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-i…...

WorkshopDL:3分钟学会免费下载Steam创意工坊模组的终极方案

WorkshopDL&#xff1a;3分钟学会免费下载Steam创意工坊模组的终极方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在Epic Games或GOG平台购买了心仪的游戏&#xff…...

VECT 2.0勒索软件深度剖析:伪装成加密工具的致命数据擦除器

2026年4月28日&#xff0c;Check Point Research发布的技术报告震惊了全球网络安全界&#xff1a;近期肆虐的VECT 2.0勒索软件并非传统意义上的"文件加密工具"&#xff0c;而是一款存在致命设计缺陷的"数据销毁器"。对于任何超过128KB的文件&#xff0c;VE…...

XML数据解析与节点配置实操案例教程

XML数据解析与节点配置实操案例教程 一、文档概述 XML作为可扩展标记语言&#xff0c;具备结构清晰、跨平台兼容、自定义标签灵活的特性&#xff0c;广泛应用于配置文件存储、系统数据交互、接口报文传输、软件参数定义等开发场景。无论是后端服务配置、桌面应用参数读写&#…...

Linux 的 tee 命令

tee 是 Linux 中一个非常有用的命令行工具&#xff0c;它能够从标准输入读取数据&#xff0c;同时将数据写入标准输出和一个或多个文件。 基本语法 command | tee [options] file1 file2 ... 主要功能 双重输出&#xff1a;将命令输出同时显示在终端并保存到文件中多文件写…...

从一道CTF题学PHP安全:如何用php://filter绕过文件包含过滤(以BUUOJ Secret File为例)

从CTF实战到企业级防御&#xff1a;PHP文件包含漏洞的深度解析与安全实践 在Web安全领域&#xff0c;文件包含漏洞长期占据OWASP Top 10榜单&#xff0c;而PHP因其灵活的文件操作特性成为重灾区。本文将以一道典型CTF题目为切入点&#xff0c;带您深入理解文件包含漏洞的本质、…...

告别繁琐配置!在VS2022中一键创建SDL2项目模板(附2.26.1资源包)

在VS2022中打造可复用的SDL2开发环境&#xff1a;从零到模板化工作流 第一次配置SDL2开发环境时&#xff0c;那种反复修改包含目录、库目录的机械操作&#xff0c;相信每个C开发者都深有体会。更令人沮丧的是&#xff0c;每次新建项目都要重复这套流程——直到发现Visual Studi…...

LeetCode 73. matrix置0(文章重点是怎样打印二维数组)

前记 刷LeetCode一个二维矩阵置0的问题时&#xff0c;题解给的setZeros函数实现很简单&#xff0c;一看实现就明白了。在写一个main函数&#xff0c;想打印验证下这个setZeros函数效果时&#xff0c;却费了九牛二虎之力。 搞出来的效果如下&#xff1a;打印函数实现 两个for循环…...

基于Go与Wails的本地AI智能体WinClaw:原理、部署与Python技能扩展

1. 项目概述&#xff1a;一个运行在Windows上的本地AI智能体最近在折腾一个挺有意思的项目&#xff0c;叫WinClaw。简单来说&#xff0c;它是一个运行在你Windows电脑本地的AI智能体&#xff0c;你可以把它理解成一个“数字管家”或者“自动化助手”。它的核心思路是&#xff0…...

深度观察 | 撕下浪漫滤镜:精品可可的“绝对复现”与残酷真相

卷首语&#xff1a;我并不总是对的&#xff0c;你也不是&#xff0c;但我们都应当力求准确。在业余圈子里&#xff0c;“表达意图”和“手工匠人”往往听起来充满文艺气息&#xff1b;但在残酷的精品巧克力商业环境中&#xff0c;这些词汇背后必须是极度冷血的数据模型与工艺控…...

AI驱动的Git冲突自动解决:rizzler工具原理、部署与安全实践

1. 项目概述&#xff1a;当AI成为你的Git冲突调解员 如果你是一名开发者&#xff0c;那么“合并冲突”这个词大概率能瞬间点燃你的血压。想象一下这个场景&#xff1a;你刚完成一个功能分支的开发&#xff0c;信心满满地准备合并回主分支&#xff0c;结果Git无情地甩给你一堆 …...

终极德州扑克GTO求解器:5个快速提升扑克水平的免费工具

终极德州扑克GTO求解器&#xff1a;5个快速提升扑克水平的免费工具 【免费下载链接】desktop-postflop [Development suspended] Advanced open-source Texas Holdem GTO solver with optimized performance 项目地址: https://gitcode.com/gh_mirrors/de/desktop-postflop …...

5分钟极速上手:ESP32 Arduino开发环境终极配置指南

5分钟极速上手&#xff1a;ESP32 Arduino开发环境终极配置指南 【免费下载链接】arduino-esp32 Arduino core for the ESP32 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 想要快速入门ESP32物联网开发却苦于复杂的配置流程&#xff1f;Arduino ESP…...

Warcraft Helper完整指南:5步彻底解决魔兽争霸3在Windows 10/11的兼容性问题

Warcraft Helper完整指南&#xff1a;5步彻底解决魔兽争霸3在Windows 10/11的兼容性问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典游…...

RouteMoA:提升大规模语言模型效率的动态路由技术

1. 项目概述在大规模语言模型应用场景中&#xff0c;模型路由技术正成为提升计算效率的关键突破口。RouteMoA&#xff08;Mixture of Agents Routing&#xff09;作为新一代智能路由框架&#xff0c;通过动态分配任务到最适合的子模型&#xff0c;实现了计算资源的高效利用。这…...

耶鲁OpenHand开源机械手:7款免费CAD设计打造你的机器人抓取系统

耶鲁OpenHand开源机械手&#xff1a;7款免费CAD设计打造你的机器人抓取系统 【免费下载链接】openhand-hardware CAD files for the OpenHand hand designs 项目地址: https://gitcode.com/gh_mirrors/op/openhand-hardware 想要打造一台能够灵活抓取各种物体的机器人手…...

3个关键步骤:如何用ViGEmBus虚拟手柄驱动解决Windows游戏兼容性问题

3个关键步骤&#xff1a;如何用ViGEmBus虚拟手柄驱动解决Windows游戏兼容性问题 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 在Windows游戏世界中&#x…...

别再为笔记本烧录STM32发愁了!手把手教你用CH340模块搞定程序下载(附FlyMcu配置)

笔记本电脑烧录STM32全攻略&#xff1a;CH340模块实战指南 每次看到闪烁的LED灯按照你编写的程序规律亮起时&#xff0c;那种成就感是无与伦比的。但对于使用笔记本电脑的嵌入式开发者来说&#xff0c;缺少传统串口常常成为STM32开发路上的第一道坎。本文将带你用不到50元的CH3…...

手把手调试AUTOSAR诊断通信:从CanTp分帧到PduR路由,实战抓包分析数据流

手把手调试AUTOSAR诊断通信&#xff1a;从CanTp分帧到PduR路由&#xff0c;实战抓包分析数据流 诊断通信作为汽车电子开发中的关键环节&#xff0c;其稳定性和可靠性直接影响车辆故障排查效率。本文将带您深入AUTOSAR通信栈的调试现场&#xff0c;通过真实案例演示如何利用工具…...

基于STM32H743与LoRa的诺基亚E63独立通信改造方案

1. 项目背景与设计初衷在移动通信高度依赖蜂窝网络的今天&#xff0c;我们常常忽视了在没有基站覆盖的偏远地区或突发灾害场景下的通信需求。传统手机一旦失去蜂窝信号&#xff0c;就变成了功能有限的电子设备。这正是Trevor Attema决定改造诺基亚E63手机的初衷——打造一款不依…...

贵州村武天柱县“功夫村”开擂 世界冠军张美煊受聘名誉总教头

&#xff08;陈臻 吴强 胡天&#xff09;5月1日-3日&#xff0c;贵州“村武”及其系列活动在天柱县渡马镇功夫村进行。世界格斗冠军张美煊&#xff0c;在贵州“村武”现场受聘为“贵州村武”名誉总教头&#xff0c;数万名游客现场见证功夫村“侗家功夫”独一无二与存在潜力。贵…...

别再死记硬背节点了!用UE5蓝图做个会‘思考’的自动门(附完整项目文件)

别再死记硬背节点了&#xff01;用UE5蓝图做个会‘思考’的自动门&#xff08;附完整项目文件&#xff09; 当你第一次打开虚幻引擎的蓝图编辑器时&#xff0c;那些密密麻麻的节点和连线可能会让你感到头晕目眩。别担心&#xff0c;这正是每个UE开发者的必经之路。今天&#xf…...