
在实现causalchat功能的时候,遇到了需要反复调用不同的工具的场景,如果只有一个mcp服务,那么也许不需要agent智能体的构建,但是如果一旦加入rag等复杂功能的实现,谁先谁后就不能在代码中进行硬编码了,为此我们将实现一个agent架构
相关文章:
【MCP】小白详解从0开始构建MCP服务端全流程
【RAG+向量数据库】小白从0构建一个rag和向量数据库demo
1. MCP工具的参数封装
前提:对于Langchain中的agent模式,需要一个严格的接口定义,而在 LangChain 中,这个标准接口就是 BaseTool 类。
对于所有工具,agent都需要有以下几个参数
- 它必须是一个 BaseTool 对象:这是最基本的要求。
- 必须有 name 和 description:Agent 通过这些信息来“思考”和决定用哪个工具。
- 必须有 args_schema:这是一个 Pydantic 模型,它精确地告诉 Agent 这个工具需要哪些参数,以及这些参数的类型。这是 Agent 能-够正确生成调用参数的基础。
- 必须有 _arun 方法:这是 Agent 按下工具“启动按钮”的地方。当 Agent 决定使用某个工具时,它就会调用这个工具的 _arun 方法。
有了这个前提,我们再去看我们之前的mcp工具,就会发现几个问题
首先,对于我们之前调用的mcptool,tool包括以下几个参数
mcp_tools = [{
"type": "function",
"function": {
"name": tool.name,
"description": tool.description,
"parameters": tool.inputSchema,
}
也就是包括名字,描述,参数输入格式
但是在agent中,这样的json格式已经不能被识别了,也就是我们需要构建一个格式化的接口
首先我们按照以前的教程构建一个mcp服务,这个服务包括以下参数,这里的tool是从mcp服务器返回的原始数据,原始数据如下,假设我们这个mcp只需要输入username和filename(这个是在mcp服务中构建的,详细请参阅上述文章)
{
"type": "function",
"function": {
"name": "xx",
"description": "xx",
"inputScheme": {
"username": {
"type": "string"
},
"filename": {
"type": "string"
}
},
"required": ["username"]
}
}
我们将原始数据进行处理为以下这个更加简洁的结构
mcp_tools = [{
"type": "function",
"function": {
"name": tool.name,
"description": tool.

最低0.47元/天 解锁文章
4204

被折叠的 条评论
为什么被折叠?



