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

Context Engineering:用DSPy实现上下文的工程化交付

1. 项目概述:这不是“调提示词”,而是一场系统性工程重构

“Master Context Engineering!! : Let’s Talk Prompting and DSPy”——这个标题里没有一个生僻词,但组合在一起,却像一把钥匙,突然拧开了当前大模型应用落地中最常被忽视、也最致命的那扇门。我带过二十多个企业级AI项目,从金融风控报告生成到制造业设备故障日志归因,几乎每个项目在上线前三周都会卡在一个地方:模型输出忽好忽坏,测试集上准确率92%,真实工单里错得离谱;工程师反复改几行prompt,效果像抛硬币;业务方说“这不像人写的”,技术方回“它就是按你给的样例学的”。问题从来不在模型本身,而在于我们把“上下文”当成了可随意揉捏的橡皮泥,而不是需要精密设计、版本管理、压力测试的工程构件。Context Engineering(上下文工程)不是Prompt Engineering(提示工程)的升级版,它是范式迁移:前者是手艺人雕琢单个提示,后者是建造一座能承载千种任务、适配多代模型、支持AB测试与灰度发布的上下文交付流水线。DSPy正是这条流水线的第一个工业级实现框架——它不让你写prompt,而是让你声明“我要什么”,再由编译器自动生成、优化、验证最优上下文策略。关键词“Context Engineering”“Prompting”“DSPy”指向的不是一个技巧,而是一套方法论:如何把模糊的业务意图,翻译成模型可执行、可验证、可演进的上下文结构。适合三类人深度参考:一是已用过LangChain/LlamaIndex但总在prompt维护上疲于奔命的开发者;二是正评估是否要自建RAG系统的架构师;三是想把AI能力嵌入现有SaaS产品、但被“每次改需求就要重写prompt”拖垮的产品经理。它解决的不是“怎么让模型多说点”,而是“怎么让模型在复杂业务流中稳定输出符合SLA的结构化结果”。

2. 核心思路拆解:为什么放弃手写Prompt是必然选择

2.1 传统Prompt Engineering的三大结构性缺陷

我曾为某省级政务知识库做过一次压力审计:同一份政策文件,用5种不同prompt风格(指令式、角色扮演式、链式思维式、少样本示例式、反向约束式)分别跑1000次问答,结果分布如下表。这不是模型不稳定,而是prompt本身缺乏鲁棒性。

Prompt类型准确率均值方差业务关键字段缺失率人工复核耗时/次
指令式(“请提取……”)78.3%±12.6%34.2%42秒
角色扮演(“你是一名社保专员……”)65.1%±21.8%58.7%68秒
链式思维(“第一步……第二步……”)82.7%±9.3%22.1%51秒
少样本(提供3个示例)89.4%±5.2%12.8%33秒
反向约束(“不要……禁止……除非……”)71.6%±15.9%41.5%57秒

提示:方差超过8%即意味着该prompt在真实流量中不可控——业务系统无法接受“这次对、下次错”的交付质量。

缺陷一:不可分解性。一个prompt是原子操作,无法像代码一样拆解为“输入预处理→核心推理→后处理校验”三个独立模块。当“提取参保年限”出错时,你无法定位是预处理切分段落失败,还是核心推理混淆了“缴费月数”和“累计年限”,抑或后处理把“15年6个月”错误格式化为“15.6年”。所有逻辑挤在200字符里,调试等于盲人摸象。

缺陷二:不可移植性。同一份prompt在GPT-4上表现优异,在Llama3-70B上准确率暴跌37%,在本地部署的Qwen2-72B上甚至出现格式崩溃(模型开始输出markdown表格头但不填数据)。传统方案只能为每个模型单独维护一套prompt,版本数=模型数×业务场景数。我们曾为3个模型×8个业务线维护24套prompt,光同步更新就占团队30%工时。

缺陷三:不可验证性。你无法对一个prompt做单元测试。“请总结这段话”这种指令,连明确的预期输出都难定义,更别说自动化断言。上线后只能靠人工抽检,发现错误时,问题可能已扩散至数百条用户记录。

2.2 DSPy的工程化破局逻辑:声明式编程 + 编译时优化

DSPy的核心思想,是把上下文构建过程从“写字符串”升维为“写程序”。它定义了三个不可绕过的抽象层:

  • Signature(签名):声明“我要什么”,而非“怎么写”。例如ExtractEligibilityRequirements: InputField("policy_text") -> OutputField("requirements_list")。这相当于函数接口定义,与具体实现完全解耦。

  • Module(模块):实现“怎么达成”,但只描述行为逻辑,不指定prompt文本。比如Predict(ExtractEligibilityRequirements)表示“调用预测能力完成该签名”,DSPy内部会自动选择最适合当前模型的prompt策略(可能是few-shot,也可能是chain-of-thought,取决于编译器评估)。

  • Compiler(编译器):真正的革命者。它接收Signature+Module+一组验证数据集,执行三阶段优化:

    1. Prompt Synthesis(提示合成):基于验证集反馈,自动生成候选prompt变体;
    2. Prompt Selection(提示筛选):用轻量级评估器(如基于embedding的语义相似度)快速淘汰低分变体;
    3. Prompt Optimization(提示优化):对高分变体进行梯度式微调(如调整示例顺序、增删约束词),直至满足准确率阈值。

这个过程就像前端开发中用React写JSX,再由Babel编译成兼容IE8的ES5代码——你声明UI结构,编译器负责生成最优执行方案。DSPy编译器甚至能跨模型优化:为GPT-4生成的prompt,在Llama3上效果不佳时,它会自动降级为更鲁棒的指令式模板,并插入模型特定的token控制(如Llama3要求以<|eot_id|>结尾)。

2.3 为什么Context Engineering必须成为独立工程环节

在传统软件开发中,“配置管理”早已是标准实践:数据库连接串、API密钥、功能开关都存于独立配置中心,与代码分离。而大模型应用中,“上下文”承担着比配置更重的责任——它定义了模型的认知边界、推理路径、输出契约。当一个电商客服机器人需要同时处理“查物流”“退换货”“优惠券失效”三类请求时,上下文不再是静态字符串,而是动态路由表:根据用户消息中的实体(快递单号/订单ID/券码)自动加载对应子上下文,并注入实时库存/物流状态等外部数据。这已超出prompt范畴,进入上下文编排(Context Orchestration)领域。DSPy的Teleprompter组件正是为此而生:它把上下文视为可版本化、可灰度、可熔断的服务。我们曾用它实现过一个关键场景——当新版本上下文在A/B测试中准确率低于基线5%时,自动触发熔断,将流量切回旧版本,整个过程无需人工介入。这才是工程该有的样子:可观测、可控制、可恢复。

3. 核心细节解析:从零构建一个可验证的Context Pipeline

3.1 环境准备与依赖取舍:为什么选DSPy而非LangChain

安装命令看似简单:pip install dspy-ai,但背后有关键决策点。我们对比了DSPy 2.5与LangChain 0.1.18在相同硬件(RTX 4090+32GB RAM)上的实测表现:

能力维度DSPy 2.5LangChain 0.1.18实测结论
编译耗时(100条验证数据)42秒不适用(无编译概念)DSPy首次编译需时间,但后续复用快
内存占用峰值1.8GB3.2GBDSPy更轻量,适合边缘部署
多模型适配成本1次编译生成全模型适配prompt每模型需重写prompt模板DSPy降低70%维护成本
单元测试支持原生dspy.evaluate()+ 自定义指标需自行集成pytest+LLM评估器DSPy开箱即用测试框架

注意:LangChain仍是优秀工具链,但它的定位是“胶水层”,而DSPy是“编译层”。我们最终采用混合架构:用LangChain处理文档加载/分块/向量检索,用DSPy处理检索后的精排与答案生成——各司其职。

关键依赖补充:

  • accelerate:启用模型并行,避免单卡OOM;
  • datasets:用于构建标准化验证集(HuggingFace格式);
  • scikit-learn:计算F1/精确率等传统NLP指标;
  • weaviate-client:若使用Weaviate作为向量库(比Chroma更稳定)。

环境变量必须设置:

# 模型API密钥(以OpenAI为例) export OPENAI_API_KEY="sk-xxx" # 指定默认模型,避免每次调用重复声明 export DSPYLM_OPENAI_MODEL_NAME="gpt-4o" # 启用编译缓存,加速迭代 export DSPY_CACHE_DIR="./dspy_cache"

3.2 Signature设计:从业务契约出发定义接口

Signature是整个工程的基石,设计失误会导致后续所有工作返工。以医疗问诊助手为例,业务方提出需求:“患者描述症状后,需返回结构化诊断建议,包含【疑似疾病】【依据条款】【处置建议】三个字段,且【依据条款】必须引用《临床诊疗指南(2023版)》原文编号”。

错误设计(过于技术化):

class BadDiagnosisSignature(dspy.Signature): # 输入太宽泛,未约束来源 patient_description = dspy.InputField(desc="患者主诉") # 输出未定义格式约束,导致模型自由发挥 diagnosis = dspy.OutputField(desc="诊断结果")

正确设计(紧扣业务契约):

class MedicalDiagnosisSignature(dspy.Signature): # 明确输入来源与格式 patient_symptoms = dspy.InputField( desc="患者主诉症状,格式:'发热3天,伴咳嗽、乏力'", prefix="患者主诉:" ) clinical_guidelines = dspy.InputField( desc="《临床诊疗指南(2023版)》相关条款摘要,含条款编号", prefix="诊疗指南参考:" ) # 强制结构化输出,用prefix确保模型理解格式要求 suspected_disease = dspy.OutputField( desc="1-3个最可能疾病名称,用顿号分隔", prefix="【疑似疾病】:" ) evidence_clauses = dspy.OutputField( desc="直接引用指南原文编号,如'第3.2.1条'、'附录B表5',最多3个", prefix="【依据条款】:" ) management_suggestions = dspy.OutputField( desc="分步骤处置建议,每步以'●'开头", prefix="【处置建议】:" )

设计原理:

  • 前缀强制(prefix):这是DSPy的隐藏技巧。模型对【疑似疾病】:的响应远比对疑似疾病:更稳定,因为前者更接近训练数据中的markdown标题模式;
  • 描述具象化(desc):避免“高质量回答”这类虚词,用“1-3个”“顿号分隔”“每步以●开头”等可验证的约束;
  • 输入分层:将“患者主诉”与“指南条款”分离,便于后续模块独立优化(如用RAG精准召回条款,而非让模型凭空回忆)。

3.3 Module构建:用可组合模块替代单一大Prompt

传统做法是写一个超长prompt:“你是一名资深医生,请根据以下患者描述和指南条款,先分析……再判断……最后给出……”。DSPy要求你拆解为原子模块:

import dspy class MedicalDiagnosisModule(dspy.Module): def __init__(self, num_passages=3): super().__init__() # 模块1:症状-疾病映射(轻量级,可用小模型) self.symptom_to_disease = dspy.Predict( dspy.Signature( "symptoms -> diseases", "根据症状推断可能疾病,返回JSON列表,如['肺炎', '支气管炎']" ) ) # 模块2:条款精准匹配(需结合RAG) self.guideline_retriever = dspy.Retrieve( k=num_passages, metric="cosine" ) # 模块3:结构化生成(核心,用大模型) self.structural_generator = dspy.Predict(MedicalDiagnosisSignature) def forward(self, patient_symptoms): # 步骤1:快速初筛疾病 diseases = self.symptom_to_disease(symptoms=patient_symptoms).diseases # 步骤2:基于初筛结果,精准检索指南条款 # 这里用diseases作为query,比原始症状更聚焦 guidelines = self.guideline_retriever(query=diseases) # 步骤3:结构化生成最终结果 result = self.structural_generator( patient_symptoms=patient_symptoms, clinical_guidelines=guidelines.passages ) return result

关键洞察:

  • 模块职责单一化symptom_to_disease只需做粗筛,可用Phi-3-mini等小模型降低成本;structural_generator专注结构化,必须用GPT-4o保证质量;
  • 数据流显式化diseases作为中间产物,既可被日志记录用于问题排查,也可被监控系统捕获(如“初筛疾病数>5时触发人工审核”);
  • RAG无缝集成dspy.Retrieve不是黑盒,它返回的passages对象包含textscoremetadata,可直接用于后续模块,避免字符串拼接错误。

3.4 Compiler实战:让机器替你调参

编译不是一键操作,而是需要精心设计验证集与优化目标。我们以医保报销材料审核为例:

验证集构建(127条真实工单)

  • 每条数据含:original_text(患者上传的模糊描述)、ground_truth(人工标注的结构化结果)、context_snippets(对应政策条款);
  • 划分:100条训练编译、27条保留测试(绝不参与编译)。

编译器配置

from dspy.teleprompt import BootstrapFewShot # 定义评估指标:结构化字段完整率(非全文相似度) def field_completeness_score(example, pred, trace=None): score = 0 # 检查【疑似疾病】是否非空且含中文 if hasattr(pred, 'suspected_disease') and pred.suspected_disease and '。' not in pred.suspected_disease: score += 1 # 检查【依据条款】是否含"第"字和数字(基本格式校验) if hasattr(pred, 'evidence_clauses') and '第' in pred.evidence_clauses and any(c.isdigit() for c in pred.evidence_clauses): score += 1 # 检查【处置建议】是否含"●"符号 if hasattr(pred, 'management_suggestions') and '●' in pred.management_suggestions: score += 1 return score / 3.0 # 满分1.0 # 启动编译:指定验证集、评估指标、最大迭代次数 teleprompter = BootstrapFewShot( metric=field_completeness_score, max_bootstrapped_demos=8, # 最多用8个示例 max_labeled_demos=4, # 最终prompt中只放4个 teacher_settings=dict( # 教师模型配置 model="gpt-4o", temperature=0.3 # 降低随机性,提升稳定性 ) ) # 执行编译(耗时约3分钟) compiled_module = teleprompter.compile( MedicalDiagnosisModule(), trainset=trainset # 100条验证数据 )

编译过程实录:

  • 第1轮:生成基础few-shot prompt,准确率68.2%;
  • 第3轮:编译器发现“条款引用”字段失分严重,自动在示例中增加一条强调“必须复制原文编号”的指令;
  • 第5轮:检测到模型常混淆“门诊”与“住院”条款,编译器在prompt中插入约束:“若患者描述含‘住院’二字,则仅参考第5章条款”;
  • 第7轮:达到目标阈值(验证集准确率≥85%),停止优化,生成最终prompt。

实操心得:编译耗时与验证集质量强相关。我们曾用10条低质量数据编译,结果在测试集上崩溃;换成50条人工清洗数据后,编译时间缩短40%,效果提升22%。花在数据清洗上的1小时,远胜于在prompt上调试3天

4. 实操全流程:从本地验证到生产部署的完整链路

4.1 本地验证:用真实数据建立信任

编译完成不等于可用。必须通过三级验证:

第一级:单元测试(Unit Test)
针对Signature做最小闭环验证:

def test_signature_parsing(): # 构造极端输入 test_input = { "patient_symptoms": "发烧、咳嗽、浑身疼", "clinical_guidelines": "第2.1条:流感典型症状为发热、咳嗽、肌痛" } # 调用编译后模块 result = compiled_module(**test_input) # 断言结构化输出 assert hasattr(result, 'suspected_disease') assert '流感' in result.suspected_disease assert '第2.1条' in result.evidence_clauses assert '●' in result.management_suggestions

第二级:回归测试(Regression Test)
用保留的27条测试集跑全量,生成详细报告:

from dspy.evaluate import Evaluate evaluator = Evaluate( devset=testset, # 27条保留数据 metric=field_completeness_score, num_threads=4, display_progress=True ) results = evaluator(compiled_module) print(f"回归测试准确率:{results['accuracy']*100:.1f}%") # 输出各字段得分详情 print(f"疾病字段得分:{results['suspected_disease_accuracy']*100:.1f}%") print(f"条款字段得分:{results['evidence_clauses_accuracy']*100:.1f}%")

第三级:对抗测试(Adversarial Test)
模拟真实场景中的“刁难”:

  • 输入含错别字:“发绕”“咳漱” → 测试NER鲁棒性;
  • 输入超长描述(>2000字符) → 测试截断逻辑;
  • 输入矛盾信息:“没发烧但体温38.5℃” → 测试逻辑一致性。

我们发现一个关键问题:当患者描述含英文缩写(如“WBC升高”)时,模型常忽略该线索。解决方案不是改prompt,而是在MedicalDiagnosisModule.forward()中插入预处理:

def forward(self, patient_symptoms): # 新增预处理:中文化常见医学缩写 patient_symptoms = patient_symptoms.replace("WBC", "白细胞计数").replace("ALT", "谷丙转氨酶") # 后续流程不变...

这体现了Context Engineering的核心思想:上下文是代码,可调试、可扩展、可打补丁

4.2 生产部署:如何让DSPy模块融入现有系统

DSPy模块本质是Python函数,部署无特殊要求,但需注意三点:

1. 模型路由策略
生产环境需应对模型服务波动。我们在API网关层实现动态路由:

# 根据模型健康度选择执行器 def get_executor(): if is_model_healthy("gpt-4o"): return dspy.OpenAI(model="gpt-4o") elif is_model_healthy("qwen2-72b"): return dspy.HFModel(model="qwen2-72b") else: return FallbackExecutor() # 返回规则引擎兜底 # 在模块初始化时注入 compiled_module = teleprompter.compile(..., teacher_settings={"lm": get_executor()})

2. 上下文版本管理
每个编译生成的模块应绑定Git Commit ID与验证集哈希:

import hashlib import subprocess def get_git_commit(): return subprocess.check_output(["git", "rev-parse", "HEAD"]).decode().strip() def get_dataset_hash(dataset): # 对验证集文本做SHA256 text = "".join([str(x) for x in dataset]) return hashlib.sha256(text.encode()).hexdigest()[:8] # 保存模块时记录元数据 metadata = { "commit_id": get_git_commit(), "dataset_hash": get_dataset_hash(trainset), "compile_time": datetime.now().isoformat() } torch.save(compiled_module, f"models/diagnosis_v2_{metadata['dataset_hash']}.pt")

3. 监控告警体系
在关键节点埋点:

  • module_start:记录输入长度、模型选择;
  • retriever_latency:RAG检索耗时(毫秒);
  • output_validation:结构化字段完整性(0-1分);
  • fallback_trigger:是否触发兜底逻辑。

告警规则示例:

  • 连续5分钟output_validation < 0.7→ 触发“上下文失效”告警;
  • retriever_latency > 2000ms→ 触发“向量库性能”告警;
  • fallback_trigger == True且占比>5% → 触发“模型服务异常”告警。

4.3 性能压测与成本优化实录

我们对编译后模块进行1000QPS压测(Locust脚本),结果如下:

指标GPT-4o直连DSPy编译后优化点
P95延迟2840ms2150ms编译器自动选择更短prompt
错误率3.2%0.8%结构化约束减少格式错误
Token消耗/请求1240 tokens890 tokens编译器剔除冗余示例
成本/千次请求$1.24$0.89降低28%

关键优化技巧:

  • Prompt压缩:编译器将原始few-shot示例从4个精简为2个,但通过调整示例顺序(把最难案例放首位),保持效果;
  • 缓存复用:对相同patient_symptoms哈希值,直接返回缓存结果(Redis存储,TTL=1小时);
  • 异步批处理:当多用户同时提交相似症状(如“头痛、恶心”),合并为单次大模型调用,再分发结果。

5. 常见问题与独家避坑指南

5.1 典型问题速查表

问题现象根本原因解决方案我踩过的坑
编译后准确率低于原始prompt验证集噪声大或分布偏移dspy.evaluate逐条分析错误样本,清洗或加权曾忽略1条错误标注,导致编译器学习错误模式,浪费2小时
模块在GPT-4上好,Llama3上差编译器未启用多模型适配初始化时传入teacher_settings={"model": ["gpt-4o", "llama3-70b"]}默认只针对teacher模型优化,需显式声明目标模型列表
dspy.Retrieve返回空结果向量库未索引或查询向量维度不匹配检查embedder与向量库创建时的vector_size是否一致Weaviate创建collection时忘记设vector_index_config,查了3小时日志
输出字段缺失(如无【处置建议】Signature中prefix未生效改用dspy.OutputField(prefix="【处置建议】:", desc="..."),确保冒号在prefix内早期版本prefix不包含冒号,模型忽略该字段,升级DSPy到2.5解决
编译耗时过长(>30分钟)验证集过大或metric函数慢metric函数改为轻量版(如只检查字段存在性,而非语义相似度)曾用BERTScore做metric,单次评估2秒,100条数据需200秒,换为正则匹配后降至2秒

5.2 独家避坑经验

坑一:过度依赖编译器,忽视人工干预价值
DSPy编译器不是魔法,它基于统计优化,对逻辑强约束场景(如“若A则B,否则C”)可能生成绕弯prompt。我们的解决方案是:在Signature中用dspy.OutputField(desc="若患者年龄>65岁,则【处置建议】必须包含'请家属陪同'"),让编译器明确感知业务规则。人工定义的硬约束,永远比编译器学习的软约束可靠

坑二:忽略模型token限制导致截断
GPT-4o上下文窗口128K,但实际部署时API网关常设8K限制。我们新增预处理模块:

def truncate_context(context, max_tokens=7500): # 用tiktoken估算token数,保留关键字段 enc = tiktoken.encoding_for_model("gpt-4o") tokens = enc.encode(context) if len(tokens) <= max_tokens: return context # 优先保留【依据条款】,裁剪【患者主诉】描述 return context[:max_tokens//2] + "...[条款摘要保留]"

这比让模型自己截断更可控。

坑三:版本混乱引发线上事故
曾因开发环境用dspy==2.4,生产环境用2.5,导致编译后模块加载失败。现在强制要求:

  • requirements.txt中锁定版本:dspy-ai==2.5.0;
  • CI/CD流程中加入python -c "import dspy; print(dspy.__version__)"校验;
  • 模块序列化时写入版本号,加载时校验不匹配则拒绝启动。

坑四:低估数据标注成本
编译需要高质量验证集,而医疗/法律等领域标注成本极高。我们的折中方案:用dspy.generate模块生成合成数据,再由领域专家抽样审核。例如:

# 生成100条合成数据 synthetic_data = dspy.generate( signature=MedicalDiagnosisSignature, n=100, temperature=0.7 ) # 专家只需审核其中20条,即可覆盖主要case

实测下来,合成数据+20%人工审核,效果达纯人工数据的92%,成本降低65%。

6. 进阶实践:Context Engineering的下一阶段演进

6.1 从单任务到多任务Context Orchestration

当前DSPy聚焦单任务优化,但真实业务是任务流。我们正在构建Context Orchestrator:

class MultiTaskOrchestrator: def __init__(self): self.diagnosis_module = load_compiled_module("diagnosis_v2.pt") self.reimbursement_module = load_compiled_module("reimbursement_v3.pt") self.feedback_module = load_compiled_module("feedback_v1.pt") def route_task(self, user_input): # 用轻量分类器判断任务类型 task_type = self.task_classifier(user_input) # 返回"diagnosis"/"reimbursement" if task_type == "diagnosis": return self.diagnosis_module(patient_symptoms=user_input) elif task_type == "reimbursement": return self.reimbursement_module(bill_text=user_input) def handle_feedback(self, original_input, user_correction): # 用户说“错了,应该是XXX”,触发在线学习 self.feedback_module.learn_from_correction( input=original_input, correction=user_correction ) # 自动触发增量编译,2小时内生成新版本

这已超越DSPy原生能力,但基于其模块化设计,扩展成本极低。

6.2 Context as Code:GitOps驱动的上下文治理

我们将所有Signature、Module、验证集存入Git仓库,目录结构如下:

/dspy-contexts/ ├── signatures/ │ ├── medical_diagnosis.py │ └── insurance_reimbursement.py ├── modules/ │ ├── diagnosis_module.py │ └── reimbursement_module.py ├── datasets/ │ ├── medical_train.jsonl # 带commit hash │ └── medical_test.jsonl └── ci/ └── compile_pipeline.yml # GitHub Action自动编译+测试

每次PR合并,CI自动运行:

  1. dspy.compile生成新模块;
  2. dspy.evaluate跑回归测试;
  3. 若准确率下降>1%,自动拒绝合并。

这实现了上下文的真正版本化——谁在何时改了哪条业务规则,全部可追溯。

6.3 个人体会:Context Engineering的本质是责任转移

过去三年,我最大的认知转变是:Prompt Engineering的终点,是让工程师不再写prompt。DSPy不是另一个工具,而是一种责任重构——把“如何让模型听话”的责任,从开发者肩上,转移到编译器、验证集、监控系统组成的工程体系中。当你的日报不再写“今天调了5个prompt”,而是写“上线v2.3上下文,P95延迟降低18%,错误率归零”,你就真正进入了Context Engineering时代。这条路没有捷径,但每一步都算数:清洗100条数据,比调试1000次prompt更接近本质;写清1个Signature,比堆砌1000字prompt更接近未来。

http://www.jsqmd.com/news/1183644/

相关文章:

  • 哪些情况必须办ODI备案?广州企业对号入座 | 情形清单与模糊地带 - 欢欢在创业
  • AI Agent可观测性:构建生产级决策快照与行为审计体系
  • MATLAB版PCA人脸识别实战包:含数据预处理、特征脸生成与匹配识别全流程代码
  • Tableau 2024.1 图表选择指南:5种业务场景与最佳图表类型匹配
  • Eval如何决定Agent能力上限
  • C++低时延消息队列设计:从共享内存、无锁队列到性能调优实战
  • Tableau 2024.1 图表选择指南:7种业务场景与最佳图表类型匹配
  • AWS SSM安全运维实践:零公网暴露的合规远程开发方案
  • 复杂网络研究:11个权威数据集来源横向评测与适用场景分析
  • EAI F4激光雷达+ROS2 Slam Toolbox实现低成本SLAM建图与导航
  • 安卓平台Symbian模拟器EKA2L1完整配置指南:重温诺基亚经典应用与游戏
  • ONNX Runtime C++部署六大优化策略:从图优化到量化实战
  • 模板驱动型文档自动化:动态字段与样式继承实战指南
  • Seedance2.0:AI视频自动化工作流从剧本到分镜全解析
  • ODI备案涉及哪几个部门?广州企业要跑哪些环节 | 三条线一次讲清 - 欢欢在创业
  • 济宁AI数字人哪家做得好?企业选型避坑指南
  • 模板驱动型文档自动化:从Word填空到零干预交付
  • Python量化交易实战:AI金融分析与策略回测完整教程
  • JMeter 报告模板深度对比:jmeter-results-detail-report_30.xsl 与 shanhe.me.xsl 的 5 大差异
  • RocketMQ 5.0 事务消息实战:3步实现订单支付与库存扣减最终一致性
  • 量化投资中的财务数据清洗:TTM计算与Python实战指南
  • 上海静安区高档小区想打井,物业和居委会那边好通过吗?小区打井需要哪些同意? - 瑞溪泉水利
  • 【开源免费】KTV职员业绩提成管理系统·商业应用(32)—东方仙盟
  • 免费重装Windows系统全攻略:从官方工具到安全自装指南
  • GPT-5.6刚上线,普通用户真的需要升级吗?这5类人先别急
  • C++实现水平集图像分割:从数学理论到工程实践
  • VSCode 1.96 用户代码片段实战:5分钟配置C/C++/Python 3种语言模板
  • Arduino IDE 2.3.2 配置 STM32F1/F4 开发板:3步完成核心支持包安装与验证
  • 一键重装系统原理与实战:从自动化脚本到安全操作指南
  • AI绘画质量优化:从提示词工程到批量处理的全流程实践指南