内嵌XML规则,明确调用动态Prompt和知识库,简要回答避免画蛇添足

This commit is contained in:
zengmq 2025-06-02 11:17:24 +08:00
parent f4262d6aef
commit 691f54c73f
6 changed files with 83 additions and 78 deletions

View File

@ -28,60 +28,60 @@ public class McpServerList
Description = "可以调用arcgis的地理处理工具或执行python代码等", Description = "可以调用arcgis的地理处理工具或执行python代码等",
IsActive = true IsActive = true
}); });
servers.Add("KnowledgeBase", new InnerMcpServer //servers.Add("KnowledgeBase", new InnerMcpServer
{ //{
Name = "KnowledgeBase", // Name = "KnowledgeBase",
Type = "inner", // Type = "inner",
Description = "可以调用进行查询知识库,获取相关参考信息。", // Description = "可以调用进行查询知识库,获取相关参考信息。",
IsActive = true // IsActive = true
}); //});
servers.Add("filesystem", new StdioMcpServer() //servers.Add("filesystem", new StdioMcpServer()
{ //{
Name = "filesystem", // Name = "filesystem",
Type = "stdio", // Type = "stdio",
Command = "npx", // Command = "npx",
Args = new List<string>() // Args = new List<string>()
{ // {
"-y", // "-y",
"@modelcontextprotocol/server-filesystem", // "@modelcontextprotocol/server-filesystem",
"D:\\01_Project\\20250305_LinkTool\\20250420_AiDemoProject\\TestData" // "D:\\01_Project\\20250305_LinkTool\\20250420_AiDemoProject\\TestData"
} // }
}); //});
servers.Add("fetch", new StdioMcpServer() //servers.Add("fetch", new StdioMcpServer()
{ //{
Name = "fetch", // Name = "fetch",
Type = "stdio", // Type = "stdio",
Command = "uvx", // Command = "uvx",
Args = new List<string>() // Args = new List<string>()
{ // {
"mcp-server-fetch" // "mcp-server-fetch"
} // }
}); //});
servers.Add("bing-search", new StdioMcpServer() //servers.Add("bing-search", new StdioMcpServer()
{ //{
Name = "bing-search", // Name = "bing-search",
Type = "stdio", // Type = "stdio",
Command = "npx", // Command = "npx",
Args = new List<string>() // Args = new List<string>()
{ // {
"bing-cn-mcp" // "bing-cn-mcp"
} // }
}); //});
servers.Add("mcp-python-interpreter", new StdioMcpServer() //servers.Add("mcp-python-interpreter", new StdioMcpServer()
{ //{
Name = "mcp-python-interpreter", // Name = "mcp-python-interpreter",
Type = "stdio", // Type = "stdio",
Command = "uvx", // Command = "uvx",
Args = new List<string>() // Args = new List<string>()
{ // {
"--native-tls", // "--native-tls",
"mcp-python-interpreter", // "mcp-python-interpreter",
"--dir", // "--dir",
"D:\\01_Project\\20250305_LinkTool\\20250420_AiDemoProject\\TestData", // "D:\\01_Project\\20250305_LinkTool\\20250420_AiDemoProject\\TestData",
"--python-path", // "--python-path",
"C:\\Program Files\\ArcGIS\\Pro\\bin\\Python\\envs\\custom\\python.exe" // "C:\\Program Files\\ArcGIS\\Pro\\bin\\Python\\envs\\custom\\python.exe"
} // }
}); //});
} }
public McpServer GetServer(string name) public McpServer GetServer(string name)

View File

@ -11,13 +11,20 @@ public class PromptServerList
{ {
promptServers.Add("plan", new PromptServer("plan", promptServers.Add("plan", new PromptServer("plan",
"根据用户描述的问题推断出需要使用的ArcGIS Pro工具调用名称列表", "根据用户描述的问题推断出需要使用的ArcGIS Pro工具调用名称列表",
"请根据用户所提问题进行工具规划,输出格式为'1.工具2.工具如果是ArcGIS Pro的工具根据用户的具体需求和提供的数据类型," + //"请根据用户所提问题进行工具规划,输出格式为'1.工具2.工具如果是ArcGIS Pro的工具根据用户的具体需求和提供的数据类型," +
"判断并列出所有必要的分析步骤和工具同时严格遵守知识库中“ArcGIS Pro工具调用大全”里“工具调用名称”一列的工具命名规则(例如analysis.Erase)" + // "判断并列出所有必要的分析步骤和工具同时严格遵守知识库中“ArcGIS Pro工具调用大全”里“工具调用名称”一列的工具命名规则(例如analysis.Erase)" +
"确保工具名的准确无误,工具与所属工具箱的对应关系正确无误,严格遵循文档规定的格式和大小写。工具的组合顺序优先参考知识库中“ArcGIS Pro的帮助文档”。" + // "确保工具名的准确无误,工具与所属工具箱的对应关系正确无误,严格遵循文档规定的格式和大小写。工具的组合顺序优先参考知识库中“ArcGIS Pro的帮助文档”。" +
"有一些与分析无关的数据能够进行排除,在选择工具时不受其干扰。")); // "有一些与分析无关的数据能够进行排除,在选择工具时不受其干扰。"
"你对ArcGIS Pro的工具箱及其功能了如指掌能够根据用户的具体需求和提供的数据类型迅速判断并列出所有必要的分析步骤和工具" +
"同时严格遵守知识库中“ArcGIS Pro工具调用大全”里“工具调用名称”一列的工具命名规则(例如analysis.Erase),确保工具名的准确无误。" +
"工具的组合顺序优先参考知识库中“ArcGIS Pro的帮助文档”。有一些与分析无关的数据能够进行排除在选择工具时不受其干扰。" +
"你的任务是基于用户提出的地理分析需求和所提供的数据集逐一识别并列出完成整个分析流程所需的全部ArcGIS Pro工具" +
"确保每个工具的名称完全匹配“ArcGIS Pro工具调用大全”里“工具调用名称”一列的记录且工具与所属工具箱的对应关系正确无误。" +
"请直接输出工具调用名称格式为“工具调用名称”无需额外解释或说明工具名称只参考“ArcGIS Pro工具调用大全”不要受其他文档的干扰。" +
"你的回复应简洁明了,仅包含所需工具的列表,每个调用名用英文逗号分割为列表,严格遵循文档规定的格式和大小写,确保信息的准确性和专业性。"));
promptServers.Add("param", new PromptServer("param", promptServers.Add("param", new PromptServer("param",
"填写ArcGIS Pro工具调用参数生成规范的可执行的工具调用请求", "填写ArcGIS Pro工具调用参数生成规范的可执行的工具调用请求",
"根据帮助文档填写工具参数请你根据“所需调用工具”参照知识库“ArcGIS Pro工具调用大全”里工具所需的参数顺序进行陈列。" + "根据知识库Arcgis Pro帮助文档填写工具参数请你根据“所需调用工具”参照知识库“ArcGIS Pro工具调用大全”里工具所需的参数顺序进行陈列。" +
"列出所需调用工具的名称及其按照“ArcGIS Pro工具调用大全”里“的该工具所需的参数顺序陈列对应的参数。如果跳过了可选参数需要用空字符表示。" + "列出所需调用工具的名称及其按照“ArcGIS Pro工具调用大全”里“的该工具所需的参数顺序陈列对应的参数。如果跳过了可选参数需要用空字符表示。" +
"不能更改所需调用工具的名称。例如arcpy.analysis.Buffer不能只写成Buffer。确保格式、参数的完整性和准确性避免任何遗漏或错误。" + "不能更改所需调用工具的名称。例如arcpy.analysis.Buffer不能只写成Buffer。确保格式、参数的完整性和准确性避免任何遗漏或错误。" +
"特别注意,所有参数均应视为字符串类型,即使它们可能代表数字或文件路径。例如问题为:使用地理处理中的\"擦除分析\"工具Erase将圆形要素circle.shp与方形要素square.shp进行空间叠加运算。" + "特别注意,所有参数均应视为字符串类型,即使它们可能代表数字或文件路径。例如问题为:使用地理处理中的\"擦除分析\"工具Erase将圆形要素circle.shp与方形要素square.shp进行空间叠加运算。" +

View File

@ -6,6 +6,7 @@
执行下一步工具的要求: 执行下一步工具的要求:
1. 解析工具输出结果 1. 解析工具输出结果
2. 调用下一个工具时确保参数继承前序输出。 2. 调用下一个工具时确保参数继承前序输出,如果已经完成用户需求则不需继续执行工具。
3. 执行Arcgis Pro工具时可以调用知识库和提示词使任务完成得更出色
请据此继续执行 请据此继续执行

View File

@ -5,8 +5,7 @@
需按以下流程处理: 需按以下流程处理:
1. 错误解析:分析错误类型及具体原因(见下方错误信息),根据错误信息选择修复方案, 1. 错误解析:分析错误类型及具体原因(见下方错误信息),根据错误信息选择修复方案,
2. 修复方案: 2. 修复方案:
(1)根据错误类型生成对应的工具重试策略 (1)根据错误类型生成对应的工具重试策略
(2)参数调整:明确需要修改的参数及修改方式。 (2)参数调整:及时调用知识库和用户提示词,确保工具名和参数的完全正确。明确需要修改的参数及修改方式。
3. 工具重试:使用调整后的参数重新调用工具。错误信息如下,请根据报错信息重试, 3. 工具重试:使用调整后的参数重新调用工具。请根据报错信息重试。
4.如果没有具体的错误描述信息请检查输出文件是否已经存在,若已经存在默认执行成功 4.如果没有具体的错误描述信息请检查输出文件是否已经存在,若已经存在默认执行成功
5.查询可能相关的知识库和帮助文档,纠正调用参数中存在的错误

View File

@ -1,12 +1,8 @@
现在你是一个精通地理信息分析和ArcGIS Pro软件的专家请以此身份回答用户的问题。 现在你是一个精通地理信息分析和ArcGIS Pro软件的专家请以此身份回答用户的问题。
指令:您可以使用一组工具来回答用户的问题。完成了用户的需求即可,不用猜测用户下一步还想做什么。你可以通过<prompt></prompt>调用用户提示词,或者调用知识库工具,从而使你更好地理解和完成用户的任务。
指令:您可以使用一组工具来回答用户的问题。还可以通过<prompt></prompt>调用用户提示词,从而使你更好地理解和完成用户的任务。 调用工具要求:如果要调用工具,每次消息只能使用一个工具,用户的回复中将包含该工具的调用结果。您需要通过逐步使用工具来完成给定任务,每次工具调用需基于前一次的结果。成功调用工具之后应该马上调用下一个工具。你还可以通过<prompt></prompt>的方式来调用用户提示词,你能更好地理解和解决用户的问题。
工具调用背景:你有以下工具可以调用{{toolInfos}},用户的数据库路径是{{gdbPath}}。
调用工具要求:如果要调用工具,每次消息只能使用一个工具,用户的回复中将包含该工具的调用结果。您需要通过逐步使用工具来完成给定任务,每次工具调用需基于前一次的结果。成功调用工具之后应该马上调用下一个工具。你还可以通过<prompt></prompt>的方式来调用用户提示词,你能更好地理解和解决用户的问题。工具调用背景:你有以下工具可以调用{{toolInfos}},用户的数据库路径是{{gdbPath}}。 输出风格:描述简洁有力,每次仅调用一个工具,基于前序工具的输出结果进行下一步操作,如果已经完成用户需求则不需继续执行工具。不要肯定用户上一次的回答。工具调用使用 XML 风格的标签输出,并用简短的文字进行描述。
输出风格:每次仅调用一个工具,必须基于前序工具的输出结果进行下一步操作。工具调用使用 XML 风格的标签进行格式化以单独信息格式输出,前后没有文字信息。如果需要进行文字说明,请只有文字内容,以普通段落形式呈现没有其他格式。
工具调用格式:工具名称包含在一对标签内,每个参数也需用对应的标签包裹。结构如下:
<tool_use> <tool_use>
<name>{tool_name}</name> <name>{tool_name}</name>
@ -21,20 +17,22 @@
<arguments>{\\\"address\\\":\\\"广州市政府, 广州市\\\", \\\"city\\\":\\\"广州\\\"}</arguments> <arguments>{\\\"address\\\":\\\"广州市政府, 广州市\\\", \\\"city\\\":\\\"广州\\\"}</arguments>
</tool_use> </tool_use>
你必须严格遵守以下输出规则:用户时间宝贵,不得重复调用上一次已成功执行的工具调用,除非有新的参数或上下文变化。
结果:用户将以以下格式返回工具调用结果: 结果示例:用户将以以下格式返回工具调用结果:
<tool_use_result> <tool_use_result>
<name>{tool_name}</name> <name>{tool_name}</name>
<result>{result}</result> <result>{result}</result>
</tool_use_result>。 </tool_use_result>。
应为字符串类型,可以表示文件或其他输出类型。
工具调用示例:MCP工具调用的格式要求示例以下是使用虚拟工具的示例 工具调用示例:MCP工具调用的格式要求示例以下是使用虚拟工具的示例
<tool_use> <tool_use>
<name>gaode:maps_geo</name> <name>gaode:maps_geo</name>
<arguments>{\\\"address\\\":\\\"广州市政府, 广州市\\\", \\\"city\\\":\\\"广州\\\"}</arguments> <arguments>{\\\"address\\\":\\\"广州市政府, 广州市\\\", \\\"city\\\":\\\"广州\\\"}</arguments>
</tool_use> </tool_use>
特别地需要调用ArcGIS Pro工具前必须先查询帮助文档、标准调用名和参数后再进行调用 严格遵守以下规则:
1.你必须严格遵守以下输出规则:用户时间宝贵,一旦确认工具成功调用之后,不得重复调用上一次已成功执行的工具,除非有新的参数或上下文变化。
2.需要调用ArcGIS Pro工具前必须先查询帮助文档、标准调用名和参数后再进行调用必要时通过用户提示词规划工具的使用
3.参数都应为字符串类型,可以表示文件或其他输出类型。
4.一旦消息中没有工具调用信息即视为任务完成。因此工具调用必须连续完成。
5.只响应用户目前的需求即可,不要过度猜测用户的需求,从而执行了大量无用的工具。

View File

@ -204,7 +204,7 @@ namespace LinkToolAddin.ui.dockpane
// model可选值qwen3-235b-a22b,qwen-max,deepseek-r1 // model可选值qwen3-235b-a22b,qwen-max,deepseek-r1
try try
{ {
await Task.Run(() => Gateway.SendMessageStream(userPrompt,"qwen3-235b-a22b", "D:\\01_Project\\20250305_LinkTool\\20250420_AiDemoProject\\20250420_AiDemoProject.gdb", AddReplyStream)); await Task.Run(() => Gateway.SendMessageStream(userPrompt,"qwen3-235b-a22b", "F:\\secondsemester\\linktool\\test\\linktooltest\\linktooltest.gdb", AddReplyStream));
} }
catch (Exception exception) catch (Exception exception)
{ {