Skip to content

AI 助手

AI 助手模块基于 laravel/ai 封装了后台配置、运行时调用、会话记录和调用追踪能力。模块代码位于 modules/Ai,后台页面位于 web/src/views/ai,核心执行入口是 Modules\Ai\Services\AiRuntimeService

INFO

使用该模块需要安装 laravel/ai 使用下面的命令安装

shell
composer require "laravel/ai"

模块组成

模块安装器位于 modules/Ai/Installer.php,安装时会引入:

  • laravel/ai
  • league/commonmark

后台菜单当前包含以下能力:

功能页面目录后端资源
服务商管理web/src/views/ai/providersai/providers
提示词管理web/src/views/ai/promptsai/prompts
输出结构管理web/src/views/ai/outputSchemasai/output/schemas
智能体管理web/src/views/ai/agentsai/agents
调用记录web/src/views/ai/callRecordsai/call/records
知识库管理web/src/views/ai/knowledgeBaseai/knowledge/base
知识库文件web/src/views/ai/knowledgeFilesai/knowledge/files

数据模型

核心表结构可以先看配置关系,再看运行沉淀。

作用
ai_providers服务商配置,保存 driver、地址、加密后的 API Key 和扩展参数
ai_provider_models服务商下的模型配置,区分普通模型和图片模型
ai_prompts可复用提示词
ai_prompt_providers提示词与服务商绑定关系
ai_output_schemasJSON 输出结构定义
ai_agents智能体配置,组合服务商、提示词、能力和输出类型
ai_agent_models智能体与模型绑定关系
ai_model_sessions会话主记录
ai_model_session_messages用户与智能体消息记录
ai_knowledge_bases知识库
ai_knowledge_files知识库文件记录
ai_call_records每次调用的完整追踪记录

ai_call_records 是排障中心,保留 trace_id、输入、输出、Token 消耗、耗时、错误信息、提示词快照、输出结构快照、上下文快照和运行时 Prompt 快照。

配置关系

服务商与模型

服务商负责保存真实接入配置,api_key 使用加密 cast 入库,列表接口只暴露脱敏值。每个服务商可以挂多个模型,图片能力依赖 is_support_image = 1 的模型。

提示词

提示词可以绑定多个服务商。创建智能体时,提示词列表会按当前服务商过滤,保证运行时能找到对应绑定关系。

输出 Schema

当智能体 output_typejson 时,需要配置输出 Schema。Schema 支持:

  • string
  • integer
  • number
  • boolean
  • object
  • array

Schema 在保存阶段完成字段校验,在运行阶段由 OutputSchemaCompiler 编译成 Laravel AI SDK 可消费的 JSON Schema 定义。

智能体

智能体是最终运行单元,主要字段如下:

字段说明
key对外调用标识
provider_id运行服务商
prompt_id系统提示词
abilitytextchatimage
output_typetextjsonimage
contexts对话上下文保留条数
max_tokens / temperature / top_p模型调用参数
options透传给 Provider 的扩展参数

后台表单负责把服务商、提示词、能力和输出类型组装成一份可运行配置。

运行链路

运行时入口集中在 RuntimeController,核心流程如下:

文本调用

文本能力通过 runText() 执行。运行时会:

  1. 校验智能体、服务商、提示词和输出结构状态。
  2. 选择当前服务商下可用模型。
  3. 使用 PromptComposer 组合系统提示词和运行输入。
  4. 使用 ConfiguredAgent 调用模型。
  5. 记录调用结果、Token 和快照。

当输出类型为 json 时,运行时会切换为 ConfiguredStructuredAgent,返回结构化结果和序列化文本。

对话调用

对话能力通过 reply()chatStream() 执行。系统会先写入用户消息,再由 ConversationContextBuildercontexts 读取最近消息,组装为 SDK 消息上下文。回复完成后,系统会继续保存智能体消息,并把 session_id 回传给前端。

图片调用

图片能力走异步流程:

  1. queueImage() 先创建 pending 状态的调用记录。
  2. GenerateAiImageJob 入队执行。
  3. 任务调用 runQueuedImageRecord() 完成图片生成。
  4. 结果写回调用记录,状态依次进入 runningsuccessfailed

这条链路适合响应时间较长的图片任务,前端调试页会提示到调用记录中查看结果。

调用接口

运行接口定义在 modules/Ai/routes/route.php

Method接口用途
POSTai/prompt同步文本调用
POSTai/prompt/stream流式文本调用
POSTai/prompt/image提交图片生成任务
POSTai/chat/reply同步对话调用
POSTai/chat/stream流式对话调用
POSTai/agents/{key}/debug后台调试智能体

文本调用示例

json
{
  "key": "article.optimize",
  "title": "原始标题",
  "content": "原始正文"
}

PromptCallRequest 支持两种输入形态:

  • 直接传普通字段,除 key 之外的字段都会进入运行输入。
  • 显式传 input,值可以是字符串或数组。

对话调用示例

json
{
  "key": "customer.chat",
  "message": "帮我总结这段内容",
  "session_id": "4b6b22ab-8758-49b3-b5a5-cad5602f5db1",
  "input": {
    "scene": "support"
  }
}

ChatReplyRequest 要求:

  • message 必填。
  • session_id 使用 UUID。
  • input 使用数组。

统一响应

控制器统一返回 AiRuntimeResult

json
{
  "content": "模型输出",
  "record_id": 1,
  "record": {},
  "file_path": null,
  "structured_output": null,
  "meta": {
    "session_id": "..."
  }
}

关键服务

作用
AiRuntimeService运行时总入口,负责解析配置、执行调用、记录结果
DynamicAiProviderRegistry将数据库中的服务商配置临时注册到 config('ai.providers')
PromptComposer组合系统提示词和运行输入
PromptTemplateRenderer把字符串或数组输入渲染为运行 Prompt
ConversationContextBuilder读取最近消息并构造对话上下文
OutputSchemaCompiler将后台 Schema 配置编译为 SDK Schema
ConfiguredAgent普通文本 Agent
ConfiguredStructuredAgent结构化输出 Agent

后台开发入口

新增一个服务商

  1. 在“服务商管理”创建服务商,选择 driver、填写地址和 API Key。
  2. 在服务商下维护可用模型。
  3. 使用“测试连接”验证当前配置。

新增一个智能体

  1. 创建提示词,并绑定目标服务商。
  2. 需要 JSON 输出时,先创建输出 Schema。
  3. 创建智能体,选择服务商、提示词、能力和输出类型。
  4. 在“智能体管理”中使用调试功能验证结果。

调整模型输出

  • 改系统行为:调整提示词。
  • 改响应结构:调整输出 Schema。
  • 改模型参数:调整智能体的 max_tokenstemperaturetop_poptions