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

在 MCP 中实现 “askhuman” 式交互:原理、实践与开源方案

关键词:MCP、Model Context Protocol、交互式参数收集、askhuman、Dify、Lobe Chat、AnythingLLM


在这里插入图片描述

1. 背景:MCP 的“无状态”限制

MCP(Model Context Protocol)将 大模型 ↔ 工具 的通信标准化为一次性的 Request–Response 调用:

  • Server 只暴露工具清单与 JSONSchema;
  • Client 把 LLM 生成的参数一次性发出去;
  • Server 执行后返回结果,整个回合结束。

这意味着 原生协议没有中断点 让 Server 反问“还缺什么?”。要实现类 askhuman 的体验,必须把交互逻辑上移到 Client 层


2. 设计模式:多轮对话 + 客户端补参

2.1 数据流

┌──────────┐        ┌──────────┐        ┌──────────┐
│   用户    │ <───> │ MCP Client │ <───> │ MCP Server│
└──────────┘        └──────────┘        └──────────┘
  1. LLM 生成 tool_calls,发现缺参 →
  2. Client 拦截
  3. Client 弹窗/CLI 提问 →
  4. 用户回答 →
  5. Client 回填参数
  6. 再次调用 tool →
  7. 结果返回给用户。

2.2 关键实现点

层级要点
Server把可能缺失的字段设为 optional,并在 description 注明“如未提供将询问用户”。
LLM Prompt加系统指令:

“若参数缺失,不要猜测,直接告知用户并等待补充。” |
| Client | 维护对话状态;检测缺失字段;提供 UI/CLI 输入;重试调用。 |


3. 最小可行示例(Node.js CLI)

3.1 伪码:交互式搜索工具

// mcp-client.ts
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import * as readline from 'node:readline/promises';const rl = readline.createInterface({ input: process.stdin, output: process.stdout });const client = new Client(/* transport */);const toolCall = /* 来自 LLM */;
const args = toolCall.arguments;if (!args.query) {args.query = await rl.question('请输入搜索关键词:');
}const res = await client.callTool({name: 'search',arguments: args,
});
console.log(res.content);

3.2 效果

> 我想搜索一些内容
🤖 需要关键词才能搜索,请输入:
> TypeScript MCP
✅ 调用 search({ query: "TypeScript MCP" }) …

4. 开源方案盘点

项目交互方式部署形态亮点
Dify工作流节点「Ask Human」Docker / SaaS零代码拖拽、支持审批流
Lobe Chat前端弹窗注入变量Vercel / Docker插件市场、可嵌入网页
AnythingLLMAgent「Require User Input」桌面 / Docker私有化、知识库联动
Open MCP ClientCopilotKit 表单纯前端轻量、可二次开发
Dolphin-MCPCLI 交互钩子Python 库适合脚本自动化

5. 典型集成:Dify 实战

5.1 步骤

  1. 在 Dify 新建 Chatflow
  2. 拖入 MCP Tool 节点,选择 search
  3. query 留空 → 拖入 Ask User 节点绑定到 query
  4. 发布应用,用户即可在对话中被询问关键词。

6. 最佳实践小结

  1. 永远让 Server 无状态,交互逻辑只在 Client。
  2. 参数 schema 描述清晰 → LLM 更容易判断何时缺参。
  3. 对话状态持久化(Session ID)→ 支持多用户并发。
  4. 超时与取消机制 → 避免用户长时间无响应卡死流程。
  5. 安全提示 → 敏感操作(删除、转账)务必二次确认。

7. 延伸阅读

  • MCP 官方文档:
    https://modelcontextprotocol.io/
  • Dify 工作流文档:
    https://docs.dify.ai/guides/workflow
  • Lobe Chat 插件开发:
    https://github.com/lobehub/lobe-chat/wiki/Plugin-Development

🚀 欢迎在评论区分享你的 MCP 交互玩法!

http://www.dtcms.com/a/316059.html

相关文章:

  • Java: jwt 入门介绍(Introduction to JSON Web Tokens)
  • Spring 的依赖注入DI是什么?
  • ChatGPT以及ChatGPT强化学习步骤
  • 陪诊小程序开发:用科技重构就医陪伴的“温度经济”
  • K8S健康检查巡检清单
  • 【JMeter】压测脚本生成完善增强
  • 奇偶校验码原理与FPGA实现
  • Java 配置文件深度解析:application.properties 与 application.yml 全方位对比
  • 制氧机语音控制方案设计以及使用场景
  • 北京JAVA基础面试30天打卡02
  • 浮雕软件Artcam安装包百度云网盘下载与安装指南
  • Linux-Day11.WEB服务,虚拟主机
  • 布控球是什么?布控球有什么作用?什么场景下会使用到布控球设备?一篇短文带你了解
  • 人工智能之数学基础:利用全概率公式如何将复杂事件转为简单事件
  • 寿司:米粒里藏着的鲜与巧
  • Java 大视界 -- Java 大数据在智能医疗电子病历数据分析与临床决策支持中的应用(382)
  • 【测试报告】Hsu营销平台系统 - 测试报告
  • 嵌入式#define __assert __assert写法解析
  • 起落架大型结构件深孔测量探究 - 激光频率梳 3D 轮廓检测
  • 智慧会所:科技赋能,开启休闲新体验
  • 解决 Windows 下的“幽灵文件”——记一次与带空格的 .gitignore 文件的艰难斗争
  • PDF 文本提取技术深度对比:基于规则与基于模型的两种实现
  • 向量范数与矩阵范数
  • ThingsKit Edge是什么?
  • 论文阅读: Mobile Edge Intelligence for Large LanguageModels: A Contemporary Survey
  • 小杰数据结构——题库——拂衣便欲沧海去,但许明月随吾身
  • echarts在前后端分离项目中的实践与应用
  • mysql强制区分大小写进行查询用BINARY
  • CodeRush AI 助手进驻 Visual Studio:AiGen/AiFind 亮相(四)
  • GoLand 项目从 0 到 1:第五天 —— 角色权限中间件实现与事务控制