Prism 文本生成实战手册:4 个模块从装好环境到跑通生产

Prism 文本生成实战手册:4 个模块从装好环境到跑通生产 Prism 文本生成实战手册4 个模块从装好环境到跑通生产【免费下载链接】prismA unified interface for working with LLMs in Laravel项目地址: https://gitcode.com/gh_mirrors/prism14/prismPrism 是 Laravel 的 LLM 统一接口库用一套 API 接住 OpenAI、Anthropic、Gemini 等十多家大模型服务商。本手册按进阶路径带你走通 Prism 文本生成装好环境跑通第一次调用再掌握提示词、流式响应与多轮对话最后把结构化输出、工具调用和异常处理落到生产环境。装好环境跑通第一次生成装好依赖、填好密钥读完这段你就能拿到第一段真实的大模型回复。在 Laravel 项目PHP 8.2 起根目录执行composer require prism-php/prism php artisan vendor:publish --tagprism-config第二条命令会把配置文件发布到 config/prism.php。打开它在对应服务商下填入 API key比如openai.api_key或anthropic.api_key。请求超时也在这里调整默认 30 秒。然后打开 tinker 发出第一段生成。using(Provider::OpenAI, gpt-4o)指定服务商和模型asText()执行调用use Prism\Prism\Facades\Prism; use Prism\Prism\Enums\Provider; $response Prism::text() -using(Provider::OpenAI, gpt-4o) -withPrompt(用一句话介绍 Laravel) -asText(); echo $response-text;终端里能打印出回复说明整条链路已通。响应对象上还挂着$response-usage本次消耗的 token 数和$response-finishReason停止原因后面做成本核算时会用到。跑通了第一段回复剩下的事就是让这段回复更符合你的业务。核心玩法提示词、流式输出与多轮对话这一段解决三件高频需求控制模型语气、把长回复实时推到浏览器、让助手记住上下文。写好提示词并控制生成参数读完这段你能为模型定人设、传文件并调节回复的长短和随机性。withSystemPrompt给模型定人设和边界复杂提示词可以直接传 Laravel 视图withPrompt的第二个参数支持塞入图片、文档等媒体内容进阶控制部分会再演示。$response Prism::text() -using(Provider::Anthropic, claude-3-5-sonnet-20241022) -withSystemPrompt(你是某电商的客服主管回答简洁不承诺赔偿。) -withPrompt(用户收到货时发现外包装破损该怎么答复) -asText();withMaxTokens(300)限制回复长度usingTemperature(0.2)降低随机性。做客服、摘要这类要稳定输出的业务低温度更合适做文案发散创作则调高。用流式响应把长文实时推给浏览器读完这段你能让用户在几秒内就开始读到回复而不是盯着加载圈。长文一次生成完再返回等待时间太痛苦。把asText()换成asEventStreamResponse()Prism 会用 SSEServer-Sent Events浏览器原生支持的单向推送协议把生成过程一段段推给前端return Prism::text() -using(Provider::OpenAI, gpt-4o) -withPrompt(写一份 500 字的季度运营复盘) -asEventStreamResponse();在控制器里直接 return 这个响应即可。前端收到的是一连串事件开始、文本增量、结束按文本增量追加渲染就是打字机效果。流式响应实现里还有广播、Data Protocol 等适配方式推送到 WebSocket 通道时可以去翻。用消息链做多轮对话读完这段你能给客服机器人接上记忆。模型本身不记得上一次聊了什么上下文要靠你自己带。把历史对话按顺序拼成消息数组通过withMessages传入即可。以带记忆的客服机器人场景为例用户每问一句就把这轮的提问和助手回复存进数据库下一轮请求时按时间顺序取出来$history $conversation-messages()-get(); // UserMessage / AssistantMessage 交替 $response Prism::text() -using(Provider::Anthropic, claude-3-5-sonnet-20241022) -withMessages([...$history, new UserMessage($input)]) -asText();对话轮次多时注意 token 成本常见做法是只带最近 N 轮或用结构化输出先把长对话压缩成摘要。基础对话已经能用了下一步是让输出可直接入库并让模型替你查数据。进阶控制结构化输出、多模态与工具调用想让 AI 的回复变成可直接入库的数据、看懂图片、替你查订单靠这三样。用结构化输出把回复变成可入库的数据读完这段你能让大模型按固定结构吐数据免去正则解析和人工校对。普通文本回复得靠解析才能入库Prism::structured()配合 schema一份描述数据长什么样的 JSON 结构定义则能直接拿到规范数据。电商场景批量生成商品标签并落库。use Prism\Prism\Schema\ObjectSchema; use Prism\Prism\Schema\StringSchema; $schema new ObjectSchema( name: product_tags, properties: [ new StringSchema(title, 一句话卖点标题), new StringSchema(tags, 逗号分隔的标签), ], requiredFields: [title, tags], ); $response Prism::structured() -using(Provider::OpenAI, gpt-4o) -withSchema($schema) -withPrompt(商品便携挂腰风扇续航 12 小时) -asStructured(); $tags $response-structured; // [title ..., tags ...]$response-structured返回的就是符合 schema 的数组直接进数据库。OpenAI 等支持 strict 模式的服务商Prism 还会帮你做更严格的格式校验。给提示词带上图片和文档读完这段你的模型就能看懂用户上传的图而不仅仅是文字。withPrompt的第二个参数传媒体对象数组图片、文档、音频、视频都支持。电商审核场景里把商品主图传进去就能让模型检查是否包含违规元素$response Prism::text() -using(Provider::Anthropic, claude-3-5-sonnet-20241022) -withPrompt(这张商品图是否包含虚假宣传或违规元素只回答是或否并说明理由。, [ Image::fromLocalPath($path), ]) -asText();一次请求也可以混传多种媒体比如同时对比一张截图和一份文档。给模型挂上工具让它查实时数据读完这段你的助手能自己查订单库把结果组织成自然语言。订单查询助手是典型场景用户问我的订单到哪了模型需要查数据库。用Tool定义一个可调用的函数挂到请求上即可use Prism\Prism\Facades\Tool; $tool Tool::as(lookup_order) -for(按订单号查询订单状态和物流) -withStringParameter(order_no, 订单号) -using(fn (string $orderNo): string Order::where(no, $orderNo)-first()-status); $response Prism::text() -using(Provider::Anthropic, claude-3-5-sonnet-20241022) -withMaxSteps(2) -withTools([$tool]) -withPrompt(我的订单 SO-88231 到哪了) -asText();withMaxSteps(2)表示允许查一次数据 回复两个回合。工具抛异常时 Prism 默认会把错误信息回传给模型让它自行纠正重试不会直接把请求打断。能力都齐了最后一步是把这些能力稳稳地搬进生产。工程化落地异常重试、成本控制与批量处理上线前把失败、超支和大批量请求都安排好。异常与重试别让限流打断业务读完这段你知道限流、超时该各自怎么处理。大模型 API 会限流、会超时捕获 Prism 的异常类分而治之use Prism\Prism\Exceptions\PrismRateLimitedException; use Prism\Prism\Exceptions\PrismException; try { $response Prism::text()-using(Provider::OpenAI, gpt-4o) -withPrompt($prompt)-asText(); } catch (PrismRateLimitedException $e) { // 限流稍后重试或降级到备用模型 } catch (PrismException $e) { Log::error(文本生成失败, [msg $e-getMessage()]); }瞬时故障也可以交给withClientRetry(3, 100)自动重试 3 次、每次间隔 100 毫秒。成本控制盯着 token 记账读完这段你能为每次生成算出真实花费。每次响应的$response-usage-promptTokens和completionTokens就是计费依据。把这两个数字连同模型名写进日志表按各服务商单价汇总就能看清哪个页面在烧钱。另外给长文任务设置withMaxTokens上限避免单次回复失控。批处理把重复任务丢进队列读完这段你能让几百条商品描述稳定生成完。批量生成电商商品描述时别在 HTTP 请求里循环调用。把每个任务丢进队列worker 中逐个调用生成方法失败只重试当前任务互不拖累同一商品重复触发时先查数据库缓存命中就直接返回。配合前面的异常处理整条批量链路就稳了。接下来你可以先给现有项目里的任意一个页面接上asEventStreamResponse体验一次真实的打字机效果再把最烧钱的那个提示词换成结构化输出对比一下 token 花费。想深入某个细节文本生成文档里有完整的参数说明和响应对象剖析。【免费下载链接】prismA unified interface for working with LLMs in Laravel项目地址: https://gitcode.com/gh_mirrors/prism14/prism创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考