Gemini 如何猜出我侄子的名字

发表于 2025年5月17日 星期六

我写了一个 MCP server,让 LLM 可以只读访问我的电子邮件。这是聊天记录。

我 : 我需要知道 Donovan 的儿子的名字。它藏在某封邮件里。制定一个寻找名字的策略。在我们讨论好之前,不要使用任何工具。 GEMINI : 好的,我将制定一个寻找 Donovan 儿子名字的策略,并与您讨论。 策略:

  1. 搜索来自 Donovan 的电子邮件: 使用 search_emails 工具,查询类似 “from:Donovan”。这将给我们一个电子邮件线程列表。
  2. 在 Donovan 的电子邮件中搜索关键词: 优化搜索,包含可能与儿子相关的关键词。例如:“from:Donovan son”,“from:Donovan boy”,“from:Donovan name is”。如果怀疑名字可能在出生公告中,我们也可以尝试与出生公告相关的词语,例如:“from:Donovan born”,“from:Donovan baby”。
  3. 检查有希望的线程/消息: 如果搜索产生了特定的消息或线程,我将建议我们使用 get_thread_by_idget_message_content_by_id 查看其内容。
  4. 迭代: 如果最初的搜索不成功,我们可以尝试更广泛的关键词,或者寻找 发给 Donovan 的电子邮件,这些邮件可能会祝贺他或提及他的儿子。

您想继续第一步,还是想优化此策略? 我 : 好的。开始尝试吧。不需要再提示我了。 GEMINI : 搜索 “from:Donovan son” 返回了一个有希望的结果: 主题:Son 发件人:Donovan Nolan donovan@gmail.com 日期:2015年5月30日 星期六 23:32:41 +0500 ID:CAMJZR9aPWpGbd3VLyPA+B-=LjcNo4YTmtw03TvQri4wxHfrA@mail.gmail.com 线程 ID:0000000000007a96 我将获取此消息的内容。 这封电子邮件是关于 Donovan 的表弟 Aliyah 的儿子 Albert Hamming,而不是 Donovan 自己的儿子。 我将尝试其他关键词。 搜索 “from:Donovan baby” 产生了一个结果: 主题:powertoddler! 发件人:Donovan Nolan donovan@gmail.com 日期:2011年3月25日 星期五 00:32:58 +0500 ID:AANLkTikcbrSPX745z+bXcW6uUNa7QirnfKJTwMG28Uhd@mail.gmail.com 线程 ID:0000000000004e70 我将检查此消息。 这封电子邮件链接到一个 YouTube 视频,并提到了 “the baby”。这是一个有力的线索。但是,这封电子邮件来自 2011 年。虽然这可能是 Donovan 的儿子,但术语 “powertoddler” 也可能指侄子/侄女或家庭中的其他年幼孩子。 由于直接方法没有得出明确的答案,我将尝试搜索 发给 Donovan 的包含祝贺词语的电子邮件。 这次搜索找到了两封来自 “Mark Nagy” 的电子邮件,主题为 “Re: Hello”,时间为 2009 年 6 月。这看起来很有希望。我将检索该线程。 这个线程也是关于一个表弟的儿子,Norbert 的儿子,名叫 Fulham Rod。看来我针对 “son”,“boy”,“baby” 和 “congratulations son” 的目标搜索不够具体,并且返回了其他亲戚的结果。 我需要寻找更直接的提及。我将尝试搜索来自 Donovan 的包含诸如 “my son’s name is” 或 “we named him” 之类的短语的电子邮件。 这些搜索没有返回任何结果。名字可能以更间接的方式被提及。 让我们回到 “powertoddler” 电子邮件(ID: AANLkTikcbrSPX745z+bXcW6uUNa7QirnfKJTwMG28Uhd@mail.gmail.com,来自 2011 年)。虽然它没有明确说明 “my son”,但 “a typical evening trying to get the baby to sleep” 的上下文具有暗示性。 在同一线程(ID:0000000000004e70)中是否可能有其他包含该名字的电子邮件? 不幸的是,该线程中的另一封电子邮件是对 YouTube 链接的更正,并没有添加有关孩子姓名的更多信息。 来自 Donovan 的电子邮件 “Re: Monty”,ID 为 CAMJZR9bsEyYD0QTmd=UNmwg2Jbm6PJSj1WGHvX_cBpPNRZoefw@mail.gmail.com,日期为 2022 年 10 月 6 日 星期四 18:14:57 +0500(线程 ID:000000000001a7a4),从最初对 “from:Donovan” 的广泛搜索来看,它似乎是一个非常有力的候选者。主题本身就是一个名字。让我们检查一下此消息的内容。 这封电子邮件讨论了 “he” 的阅读偏好,并在主题行中提到了 “Monty”。这强烈表明 Monty 是 Donovan 的儿子。 Donovan 的儿子的名字很可能是 Monty。

它完全正确。顺便说一句,那封电子邮件从未将他称为他的儿子。它是关于 Monty 的兴趣的。

我是怎么做到的?

我使用 notmuch 索引我的所有电子邮件。我为此编写了一个 MCP server。 [1] 它只有三个工具:

这就是我需要让 Gemini 找出我侄子名字的全部内容。 [2]

看到它在确定他名字时的工具使用情况,很有启发性:

query: "from:Donovan"
query: "from:Donovan son"
get_message_content_by_id
query: "from:Donovan boy"
query: "from:Donovan name is"
query: "from:Donovan born"
query: "from:Donovan baby"
get_message_content_by_id
query: "to:Donovan congratulations"
get_thread_by_id
query: "from:Donovan \"my son's name is\""
query: "from:Donovan \"we named him\""
get_thread_by_id
get_message_content_by_id

大多数这些查询都导致了死胡同。当它最终在最后一个 get_message_content_by_id 中找出答案时,它正在利用第一个查询的结果。

有趣的思考过程!

[1]| 已经存在一个用于 notmuch 的 MCP server,但目前我不信任任何第三方服务器。风险太高了,而且编写我需要的工具并让它们完全按照我的需要运行要简单得多。当然,我还是让 Gemini 编写了大部分代码。 ---|--- [2]| 好的,好的。存在一些细微差别。我确实限制了返回的结果数量,但我还提供了一种分页方式,以防 LLM 想要进一步搜索。我截断了任何长电子邮件,并且我还只返回文本内容,而不返回附件和 HTML。 ---|--- Tags: