基于Semantic Kernel提示词为插件API动态添加查询参数的实现咨询
实现基于提示词的动态API参数拼接方案
一、先明确提示词与API参数的映射规则
先把你的需求整理成明确的匹配规则,方便后续代码实现:
- 无额外要求的提示词(如“获取员工12345的信息”):不添加任何
info参数 - 包含“地址”“通信信息”的提示词:添加
info=address参数 - 包含“完整信息”的提示词:添加所有支持的
info参数(比如info=address&info=payment,可根据API实际支持的参数补充)
二、实现提示词解析逻辑
写一个辅助方法,从用户的提示词里提取需要的info参数列表:
private List<string> ParseInfoParameters(string userAsk) { var infoParams = new List<string>(); // 匹配需要address参数的场景 if (userAsk.Contains("地址") || userAsk.Contains("通信信息")) { infoParams.Add("address"); } // 匹配需要完整信息的场景 if (userAsk.Contains("完整信息")) { // 添加API支持的所有info参数,按需补充 infoParams.Add("address"); infoParams.Add("payment"); // 比如还有emergency_contact等参数,可继续添加 } // 去重,避免重复添加相同参数 return infoParams.Distinct().ToList(); }
三、修改插件代码,动态构建API请求
把解析逻辑整合到原方法里,动态拼接带参数的请求URL:
[KernelFunction, Description("Get the employee Information.")] public async Task<string> GetMemberInformation( [Description("id of the employee")] string id, [Description("User Query")] string userAsk ) { try { // 解析需要的info参数 var infoParams = ParseInfoParameters(userAsk); // 构建基础请求地址 var requestUrl = $"http://baseurl/api/employee/{id}"; // 如果有需要添加的参数,拼接查询字符串 if (infoParams.Any()) { var querySegments = infoParams.Select(p => $"info={Uri.EscapeDataString(p)}"); requestUrl = $"{requestUrl}?{string.Join("&", querySegments)}"; } using HttpResponseMessage response = await client.GetAsync(requestUrl); response.EnsureSuccessStatusCode(); var content = await response.Content.ReadAsStringAsync(); return content; } catch (Exception e) { // 可根据需求添加异常处理逻辑,比如返回友好错误信息 return $"获取员工信息失败:{e.Message}"; } } // 辅助解析方法 private List<string> ParseInfoParameters(string userAsk) { var infoParams = new List<string>(); if (userAsk.Contains("地址") || userAsk.Contains("通信信息")) { infoParams.Add("address"); } if (userAsk.Contains("完整信息")) { infoParams.Add("address"); infoParams.Add("payment"); // 补充其他API支持的参数 } return infoParams.Distinct().ToList(); }
四、扩展优化建议
如果后续提示词场景更复杂,可以做以下优化:
- 使用正则表达式匹配更灵活的表述,比如“获取员工12345的支付相关信息”可匹配到
payment参数 - 将提示词与参数的映射规则放到配置文件(如
appsettings.json)中,后续修改规则无需改动代码:"InfoParamMappings": { "address": ["地址", "通信信息", "联系地址"], "payment": ["支付信息", "薪资详情", "薪酬"], "full": ["完整信息", "全部信息", "所有资料"] }
内容的提问来源于stack exchange,提问作者user14267126
相关产品推荐
相关产品推荐

