前言

前面的几篇文章《百宝箱企业版搭建智能体应用-平台概述》《什么是智能体:从概念认知到平台选型》《什么是智能体:意图识别与大模型提示词》《什么是智能体:简单了解MCP》 已经有基本的介绍,《百宝箱企业版搭建智能体应用-应用中的意图识别参数提取》一文中我们把用户提问的信息进行了意图识别:房间定价建议和市场分析,并对用户的问题种提取了我们想要的参数,我会继续在这个例子基础上完成一个智能调价的小助手功能。
接下来,要在百宝箱平台调用的MCP插件,这MCP插件可以看《百宝箱企业版搭建智能体应用-民宿智能调价MCP的代码实现》《百宝箱企业版搭建智能体应用-民宿智能调价MCP注册成平台插件》,这两篇是怎么在百宝箱上注册MCP插件。
在这里先给一个体验链接:民宿调价助手给大家玩一玩,仅供娱乐

调用MCP插件

调用之前,看看前面些的智能调价的MCP,需要什么参数,什么数据,我们在得到意图识别和用户提问种拿到的参数,是否符合要求,比如MCP插件中价格建议的接口,需要的参数如下,有些是必填的,因此需要在调用插件的时候就得准备好,同时也要做好默认值得准备,还要如果没用拿到这个参数,应该怎么回答引导用户下一次提问补充参数得准备:
在这里插入图片描述
回到我们得工作流中,我们在大模型进行意图识别并提取用户提问的参数,就有了一下的参数,这些参数不一定都会有,因此我们在MCP代码开发的时候,就需要注意这些参数不存在的情况下应该怎么办,比如位置信息,优先是用户提问时候说到的地方,如果没有说到任何地方,就以当前用户所在的地图坐标作为位置信息,这些就是用高德地图来完成:
在这里插入图片描述
大模型里面的参数基本上符合MCP插件中定价建议接口需要的一致,但是有些格式要对应,因此我们在房间定价建议的意图之后添加一些代码处理,主要是参数的格式转换,前面的文章中有说明了怎么添加代码节点和怎么利用AI在节点上进行代码编程:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
参数格式代码转换的代码,其实这一步骤可以不用都可以,如果在前面大模型参数提取的代码节点中把格式弄好,也就不用再弄一次都可以,但是因为MCP代码是先开发的,有些格式不想再去改变,才做了这个步骤。

# 入口函数 main
# @param {dict} params - 输入项的集合
# @param {dict} context - 包含环境参数、应用ID等信息
# @return {dict} data - 返回的数据集合
import logging
import json


def main(params: dict, context: dict) -> dict:
    # --- 处理 competitor_prices ---
    competitor_prices_str = params.get('competitor_prices', '[]')
    try:
        competitor_prices_array = json.loads(competitor_prices_str)
        # 确保 competitor_prices_array 是一个列表
        if not isinstance(competitor_prices_array, list):
            competitor_prices_array = [competitor_prices_array] if competitor_prices_array is not None else []
        competitor_prices_string_array = [str(price) for price in competitor_prices_array]
    except (json.JSONDecodeError, TypeError) as e:
        competitor_prices_string_array = []
        logging.warning(f"Failed to parse competitor_prices: {str(e)}")

    # --- 处理 market_data ---
    provided_market_data_str = params.get("market_data")
    if provided_market_data_str:
        market_data_string = provided_market_data_str
    else:
        market_data = {
            "demand_level": params.get("demand_level"),
            "avg_price": params.get("avg_price"),
            "occupancy_rate": params.get("occupancy_rate"),
            "price_trend": params.get("price_trend"),
            "competition_level": params.get("competition_level")
        }
        market_data_string = json.dumps(market_data)

    # --- 处理 facilities ---
    facilities_str = params.get("facilities", "[]")
    try:
        facilities_array = json.loads(facilities_str)
        if not isinstance(facilities_array, list):
            facilities_array = [str(facilities_array)] if facilities_array is not None else []
        facilities_string_array = [str(item) for item in facilities_array]
    except (json.JSONDecodeError, TypeError) as e:
        facilities_string_array = []
        logging.warning(f"Failed to parse facilities: {str(e)}")

    # --- 处理经纬度定位信息 ---
    longitude = params.get("longitude", "")
    latitude = params.get("latitude", "")
    location_string = f"{longitude},{latitude}" if longitude and latitude else ""

    # --- 返回最终数据 ---
    data = {
        "competitor_prices": competitor_prices_string_array,
        "market_data": market_data_string,
        "facilities": facilities_string_array,
        "property_coordinates": location_string
    }

    return data

这个格式转换,得到的输出参数就基本上符合智能调价MCP插件的参数了,我们再这个节点后面就可以添加MCP插件进行下一步流程了:

在这里插入图片描述
点击插件,进到添加插件画面,点击我的插件(因为是自己在百宝箱上自己注册的,并发布的,就是在我的插件这个位置。具体的可以参考《百宝箱企业版搭建智能体应用-民宿智能调价MCP注册成平台插件》
在这里插入图片描述
选择插件里面的对应的工具,进行添加,见下面的图,那么这个节点就添加进来了,但是这里面的参数还没用输入(关联)。
在这里插入图片描述

我们还需要安装这个MCP插件工具中的输入参数进行配置:

在这里插入图片描述
可以看到,前面的格式转换是真的不是必要的,但是也侧面说明了,如果不同的插件进来,格式的问题还是可以通过格式转换得到正确的输入格式。
由于这个MCP的插件工具输出是json的格式,因此还需要添加代码节点进行格式转换:
在这里插入图片描述
转换代码如下:

# 入口函数 main
# @param {dict} params - 输入项的集合
# @param {dict} context - 包含环境参数、应用ID等信息
# @return {dict} data - 返回的数据集合
import logging
import json

def main(params: dict, context: dict) -> dict:
    input_param = params.get('param', {})  # 从工具的输入参数中提取名为 param 的参数值
    
    # 解析输入中的polished_result字段
    polished_result = ""
    try:
        # 如果input_param是字符串,尝试解析为JSON
        if isinstance(input_param, str):
            input_data = json.loads(input_param)
        else:
            input_data = input_param
            
        # 直接从input_data中提取polished_result
        polished_result = input_data.get('polished_result', '')
        
    except (json.JSONDecodeError, TypeError, KeyError) as e:
        logging.getLogger().error(f"解析输入数据时出错: {e}")
        polished_result = ""
    
    data = {
        "key1": "hello world",
        "input": input_param,
        "polished_result": polished_result
    }
    
    logger = logging.getLogger("__name__")
    logger.info("这是一条info级别的日志")
    logger.error("这是一条error级别的日志")
    
    return data

对于另外一个接口,按照上面的步骤,将MCP插件里面的工具添加进来,并进行参数的关联。
在这里插入图片描述

同样的,我们还要处理这个工具的结果格式,让人起来舒服:
在这里插入图片描述
格式代码如下:

# 入口函数 main
# @param {dict} params - 输入项的集合
# @param {dict} context - 包含环境参数、应用ID等信息
# @return {dict} data - 返回的数据集合
import logging
import json

def main(params: dict, context: dict) -> dict:
    input_param = params.get('param', {})  # 从工具的输入参数中提取名为 param 的参数值
    
    # 解析输入中的polished_result字段
    polished_result = ""
    try:
        # 如果input_param是字符串,尝试解析为JSON
        if isinstance(input_param, str):
            input_data = json.loads(input_param)
        else:
            input_data = input_param
            
        # 直接从input_data中提取polished_result
        polished_result = input_data.get('polished_result', '')
        
    except (json.JSONDecodeError, TypeError, KeyError) as e:
        logging.getLogger().error(f"解析输入数据时出错: {e}")
        polished_result = ""
    
    data = {
        "key1": "hello world",
        "input": input_param,
        "polished_result": polished_result
    }
    
    logger = logging.getLogger("__name__")
    logger.info("这是一条info级别的日志")
    logger.error("这是一条error级别的日志")
    
    return data

已经添加和设置了MCP插件的工具,但是意图识别里面出了定价建议和市场分析,还有个分支:
在这里插入图片描述
为了完成这个应用工作流的闭环,当用户问了房间价格建议和市场分析以为的内容,就要好好的处理掉这样的问题,因此我们添加一个大模型,专门用来处理这类的问题:
在这里插入图片描述
添加的模型节点我们取名引导大模型,目的就是引导用户正确使用这个智能体,不要超出这个智能体的能力范围。当然,也可以添加更多的意图和功能,这是后话。

# 用户引导助手提示词

## 角色
你是一个耐心友好的民宿助手,专门帮助用户了解和使用智能调价助手的功能。当用户提出与房间定价建议或市场分析无关的问题时,你需要温和地引导他们使用正确的功能。

## 技能
### 技能1:识别非相关查询
当用户询问以下类型的问题时,你应该使用本提示词:
- 询问民宿管理的其他方面(如清洁、预订、客户服务等)
- 表达对系统功能的困惑
- 请求其他类型的帮助
- 进行闲聊或非业务相关的对话

### 技能2:温和引导
你需要:
1. 保持友善和耐心的态度
2. 简明扼要地解释智能调价助手的功能范围
3. 将用户的问题引导到两个主要功能之一:
   - 房间定价建议:帮助用户为其民宿设置合适的价格
   - 市场分析:提供特定区域的市场情况分析
4. 提供具体的示例来帮助用户理解

## 回答原则
1. 使用简单直白的语言,避免技术术语
2. 保持回应简短,通常不超过3句话
3. 总是提供转向正确功能的建议
4. 如果用户多次偏离主题,重复引导但不显不耐烦

(因为格式问题,以下图片内容还是引导模型的提示词)
在这里插入图片描述
在这里插入图片描述
(以上内容还是提示词)
最后在大模型提示词输入的地方添加用户的对话信息:
在这里插入图片描述
最后我们还要在结束节点关联前面节点的输出:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

基本上,这个智能体应用的工作流搭建完毕,我们看看搭建好的应用工作流样子。

在这里插入图片描述

红色箭头表示工作流的工作流程,根据不同的意图选择不同的分支去处理事情,这个跟流程图是一样的思想
接下来,运行测试,看看结果,工作流中测试的结果如下:

在这里插入图片描述
我们再看看服务端上面的结果

在这里插入图片描述
这说明了,MCP插件的服务器上的结果和当前工作流的结果是一致的。

结论

在这篇文章里面,我们是将已经在平台上的注册好的MCP在应用的工作流中进行调用,还进行了处理。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐