使用说明
动机
LLM如何与您系统中的环境交互?它不是。它是一个调用和响应API。我一直听到代理人这样,代理人那样,但在我看来,如果没有工具让他们观察或操纵他们的环境,代理人在执行我们关心的有意义的任务方面从根本上受到限制。
前十次我看到一个新的流行语时,我尽量忽略噪音,但之后 模型上下文协议(MCP) 通过提供一种一致的格式来宣传工具和资源的存在以及如何使用它们,它巧妙地解决了这个问题。当您需要为LLM构建到工具或数据库的新连接器时,您可以找到一个预构建的开源MCP服务器并将其放入。MCP还有一个维护它的公司赞助商- Anthropic,是该行业的关键参与者之一,因此从第一天起就被狗粮喂养(狗粮?),并经久耐用。
计划
我喜欢通过解决实际问题来自学新事物——我发现这样的结果会更好地印在我的脑海里。我做了大量的检索增强生成(RAG)工作,我正在为开源做准备,我认为MCP是RAG架构的下一个发展。我认为在不久的将来,如果你做得很好,你就是在MCP之上做的。
我最近一直在学习房地产投资,预计未来一两年市场会出现调整。我要装一些 免费Zillow数据 然后,我将运行一个连接到MCP服务器的FastAPI服务器,并处理来自htmx UI的请求。最终目标是一个聊天机器人,可以帮助我探索这些房地产数据,并就在哪些市场寻找交易做出一些决定。
我要加载的数据包括:
- Zillow房屋价值指数(ZHVI) – 一个给定地区和住房类型的典型房屋价值的衡量标准,在65到95个百分点之间。
- Zillow房屋价值预测(ZHVF) – 基于当前和历史市场数据对房屋价值趋势的前瞻性估计。
- Zillow观测租金指数(ZORI) – 对当前和场外租赁列表中观察到的典型市场租金进行平滑衡量。
- Zillow观测租金预测(ZORF) – 根据ZORI和市场指标的趋势预测租金价格的变化。
你可能会注意到,我排除了ZHVI数据,这是由于缺乏数据——他们最近才开始跟踪这一点。
这是非常特定于领域的数据——在不阅读定义的情况下,你可能不想对数据进行猜测——所以我认为这将是一个很好的例子,因为LLM将无法直观地解决一系列琐碎的问题。
我想请法学硕士帮助我找到一个市场,在经济适用房和租金之间取得平衡,现金流具有巨大的未来增长率。我也不想把这些预测的增长率视为理所当然——让我们做一点编程,看看它们在多大程度上以及在哪个领域是正确的。我预计这需要大量的快速工程来制作不同的查询。然后,我将能够将这些提示存储为MCP提示,以向聊天机器人提出建议并对数据库执行。
我选择sqlite作为我的数据库,因为它将内存存储在本地文件中,所以不会重新加载或打开/关闭数据库。我将在容器中运行数据库以实现可移植性,因此将数据库状态保存在文件中意味着如果我愿意,我可以将其视为“缓存”数据加载。这样,如果我挂载到本地卷,我就不需要每次重新启动容器时都将Zillow数据重新加载到数据库中。
为了能够处理这些数据,我知道我需要编写某种MCP服务器,它可以对我们刚刚编写的表运行查询。我想我会想将有用的查询编码为MCP提示或工具,然后根据我到目前为止读到的内容,将其呈现给MCP客户端后面的LLM,但我真的不确定这在实践中是什么样子。 我从…开始 来自langchain的文档 结合我一直在阅读的其他一些东西,作为我可以构建的入门服务器。 然后我大部分时间都跟着 人类学文献 尽管我将他们的大部分代码换成了langgraph ReAct代理,但我还是编写了MCP客户端的启动。然后,我不确定如何让客户端和服务器相互通信,所以我发现 这是一份非常棒的MCP文档 它讨论了MCP中内置的不同传输方法。我将使用默认方法,即使用stdio在客户端和服务器之间传递进程中的消息。这将是一个具有本地数据库和内部应用程序后端的单个容器,因此这是有意义的,但对于任何生产级产品,我认为MCP服务器都将与后端解耦,这将需要更复杂的HTTP流配置。我会把它留给我必须为工作建造这样的东西的时候。
现在,这是我为生成单个消息而执行的单个脚本。为了使其有用,我需要附加一个web服务器,该服务器接收用户查询并通过这些函数运行它们。为了使web服务器有用,我需要一个看起来像聊天界面的前端来向服务器发出请求。Streamlit最近在这样的人工智能项目中风靡一时,我在 以前的项目 以及用于工作的内部工具,但我得出的结论是,从慢速Python代码运行慢速React代码,需要为Python部署整个额外的服务器代码块,这不是构建轻量级前端的最佳方式。没有人想在概念证明获得批准后将其重写为适当的生产级,所以很多时候这似乎根本不会发生。我写的React超出了我的公平份额,这将消除这里的Python中间人,但这真的感觉太过分了。每次我构建一些全栈的东西,我最终都会做比我真正想学习的更多的前端开发。HTMX已经在我的雷达上有一段时间了,我将在这个项目中尝试它——它轻得离谱,提供了聊天应用程序等低逻辑前端所需的极简主义功能。也, 模因是精英。这对我的服务器选择的唯一影响是,我需要返回模板化的HTML,所以我将使用jinja来模板化我的网页,并使用HTMX脚本标签发送它们。这就是你运行它所需要的一切,太棒了。
不过,Echo服务器并不是很有趣,所以让我们插入LLM代理。我将MCP客户端添加到FastAPI服务器的生命周期中,将其绑定到应用程序状态,以便它可以以线程安全的方式在workers之间传递,而不是客户端/服务器是使用池构建的。我们只需将消息传递给代理,并将输出格式化为一个小html,然后将其传递回UI。