在对消息调用invoke时,实际发送给LLM的是什么?

人工智能 2026-07-11

AIMessage包含 "content" 和 "tool_calls"。在后续的调用中,"tool_calls" 也会被发送给LLM吗?

我之所以问这个,是因为我想在调用LLM之前把消息尽量精简。具体来说,我对write_file工具调用可能包含的非常长的输入或参数(即要写入的内容)感到担心。而这个非常长的输入位于tool_calls字典中,可能会被发送给LLM。

我做了一个测试,似乎AIMessage中的 "tool_calls" 字典确实会被发送给LLM(我是通过观察改动前后input_tokens的数量变化来判断的)。然而,如果AIMessage的 "content" 列表中包含一个类型为 "tool_use" 的块,那么其中的输入并不会被发送给LLM。这有点让人困惑。

解决方案

tool_calls 确实会在后续调用中被发送给LLM。我用同样的方式来验证过:通过观察在添加带有tool调用的消息与不带它们的消息时input_tokens的跳变来判断。你注意到的tool_use块的行为其实是LangChain在避免重复发送方面的聪明之处。当content列表中存在tool_use块时,它不会再次发送这些输入,因为它们已经在tool_calls字段中。一旦你意识到这一点,这就说得通了,但一开始确实有点让人困惑!

对于你 write_file 的用例,内容可能非常大,这确实会显著增加你对token的使用。你基本上是在每次后续调用时将整个文件内容回传给LLM,这样成本会快速上升。所以一个可行的快速做法要么是在调用LLM之前剥离旧的tool调用,要么保持你的消息历史简短,或用摘要来替代冗长的tool调用。

需要注意的一个重点是,LangChain不会自动为你裁剪 tool_calls;它之所以包含它们,是为了让LLM能了解之前使用过哪些工具。但如果你在处理像文件内容这样的大型输入时,你需要自己管理,以避免不必要地消耗token。希望这些说明能帮助你理清楚。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章