person-research

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Person research

人物调研

Three lenses on one person id.
momentum
gives attention and the shows that mention them most.
mentions
rows with
is_appearance
are episodes they were on.
search
with
speakerIds
returns their own words;
about
returns what others said about them.
Run each program with
arcmira_execute_read
;
arcmira_describe
has the method reference.
围绕同一个人物 ID 的三个观察视角。
momentum
给出关注度以及提及他们最多的节目。
mentions
中带有
is_appearance
的记录是其参加过的节目。
search
配合
speakerIds
返回他们自己的言论;
about
返回别人对他们的评价。
将每个程序传给
arcmira_execute_read
运行;
arcmira_describe
提供方法参考。

When to use

何时使用

  • prep for an interview, a podcast booking or a meeting with someone
  • what has a person said recently, and where
  • who talks about a person, and is attention rising
  • 为采访、播客邀约或与某人见面做准备
  • 了解某人最近说了什么,以及在哪些节目中说过
  • 了解谁在谈论某人,以及关注度是否正在上升

Pick the entity the user meant

识别用户所指的人物

Users give names; filters take ids only (ent_..., UC..., 11-character video ids), and a name where an id belongs throws
id_required
.
  1. Resolve the exact name the user said, with their own words about it as
    context
    (a bare "Theo" has none).
  2. best
    and
    suggested
    give the id. A
    suggested
    pick is an assumption: the answer names it, with
    suggested.evidence
    as the reason.
  3. ask
    : several entities fit, and
    ask.options
    goes back to the user. No answer at all: the name is not in the index.
For this task:
  • Resolve with
    { type: "person" }
    . A first name alone ("Sam") matches many people: pass what the user said about them (runs OpenAI, hosts a show) as
    context
    , and when resolve still answers
    ask
    , show its options.
用户提供的是姓名;筛选器只接受 ID(ent_...、UC...、11 位视频 ID),如果本应填写 ID 的位置传入姓名,则会抛出
id_required
。
  1. 使用用户对名字的原话作为
    context
    ,解析用户所说的确切姓名(单独的“Theo”没有上下文)。
  2. best
    和
    suggested
    会给出 ID。选取
    suggested
    意味着这是一项推测:回答中应明确说明,并给出
    suggested.evidence
    作为依据。
  3. ask
    :有多个实体符合条件时,通过
    ask.options
    交回给用户。完全没有结果:该姓名不在索引中。
对于此任务:
  • 使用
    { type: "person" }
    进行解析。仅提供名字(“Sam”)会匹配到多个人:将用户对其身份的描述(负责 OpenAI、主持某档节目等)作为
    context
    传入;如果解析结果仍为
    ask
    ,则展示其选项。

Worked program

示例程序

Pass each block to
arcmira_execute_read
as one program (a block marked arcmira_execute_write goes to that tool), with the name swapped for the user's. It opens with the pick: set
CONTEXT
to the user's own words about the name. When several entities fit it returns
ask
and runs nothing else. Show those options to the user, then run it again with
ID
set to the pick. Build date windows from
arcmira.daysAgo(n)
and
arcmira.today()
.
将每个代码块作为单个程序传给
arcmira_execute_read
(标记为 arcmira_execute_write 的代码块则传给该工具),并将其中的姓名替换为用户提供的姓名。程序首先进行实体选择:将
CONTEXT
设为用户对姓名所说的原话。当有多个实体符合条件时,它会返回
ask
并且不执行其他操作。向用户展示这些选项,然后再次运行,并将
ID
设为所选项的 ID。使用
arcmira.daysAgo(n)
和
arcmira.today()
构建日期窗口。

Prep on one person

围绕一个人物做准备

javascript
const NAME = "Jensen Huang", CONTEXT = undefined, ID = null;   // CONTEXT: the user's own words about the name, never a guess. After an ask, set ID to the picked option's id and run again
const r = ID ? null : await arcmira.resolve(NAME, { type: "person", context: CONTEXT });
const e = r && (r.best ?? r.suggested);
if (r && !e) return { ask: r.ask };
const id = ID ?? e.id;
const assumed = Boolean(r?.suggested), why = r?.suggested?.evidence ?? null;
const [m, rows, own] = await Promise.all([
  arcmira.momentum(id),
  arcmira.mentions({ entityId: id, after: arcmira.daysAgo(90), limit: 40 }),
  arcmira.search({ query: "AI", speakerIds: [id], after: arcmira.daysAgo(180), limit: 5 }),
]);
const about = await arcmira.search({ query: m.entity.name, about: [id], after: arcmira.daysAgo(90), limit: 3 });
const appeared = new Map();
for (const x of rows.mentions) if (x.is_appearance) appeared.set(x.media.video_id, { show: x.media.source_channel?.name ?? null, episode: x.media.title, date: x.media.published_at });
let fromAppearance = null;   // no speaker-tagged chunks: read their newest appearance instead
const ep = own.chunks.length === 0 ? rows.mentions.find(x => x.is_appearance) : undefined;
if (ep) {
  try {
    const t = await arcmira.transcript(ep.media.video_id, { start: Math.max(0, ep.start_seconds - 5), end: ep.start_seconds + 90 });
    const s = Math.floor(t.lines[0]?.start ?? ep.start_seconds);
    fromAppearance = { episode: t.video.title, show: t.video.channel_name, date: t.video.published_at, url: `${t.video.watch_url}${t.video.watch_url.includes("?") ? "&" : "?"}t=${s}`, lines: t.lines.map(l => `[${Math.round(l.start)}s] ${l.text}`), speaker_labelled: t.lines.some(l => l.speaker) };
  } catch (err) {
    fromAppearance = { episode: ep.media.title, error: err.code };
  }
}
return {
  person: { id, name: m.entity.name, page: m.entity.page, assumed, why },
  attention: { verdict: m.verdict, last_30d: m.volume.mentions_30d, prior_30d: m.volume.mentions_prior_30d, as_of: m.as_of, top_shows: m.top_shows.map(s => [s.channel_name, s.mentions]) },
  appeared_on: [...appeared.values()].slice(0, 8),
  appeared_on_partial: rows.has_more,   // true: only the newest 40 mention rows were read
  in_their_words: own.chunks.map(c => ({ said: c.text.slice(0, 300), episode: c.video_title, show: c.channel_name, date: c.published_at, url: c.watch_url })),
  from_their_appearance: fromAppearance,
  said_about_them: about.chunks.map(c => ({ said: c.text.slice(0, 200), show: c.channel_name, date: c.published_at, url: c.watch_url })),
};
javascript
const NAME = "Jensen Huang", CONTEXT = undefined, ID = null;   // CONTEXT: the user's own words about the name, never a guess. After an ask, set ID to the picked option's id and run again
const r = ID ? null : await arcmira.resolve(NAME, { type: "person", context: CONTEXT });
const e = r && (r.best ?? r.suggested);
if (r && !e) return { ask: r.ask };
const id = ID ?? e.id;
const assumed = Boolean(r?.suggested), why = r?.suggested?.evidence ?? null;
const [m, rows, own] = await Promise.all([
  arcmira.momentum(id),
  arcmira.mentions({ entityId: id, after: arcmira.daysAgo(90), limit: 40 }),
  arcmira.search({ query: "AI", speakerIds: [id], after: arcmira.daysAgo(180), limit: 5 }),
]);
const about = await arcmira.search({ query: m.entity.name, about: [id], after: arcmira.daysAgo(90), limit: 3 });
const appeared = new Map();
for (const x of rows.mentions) if (x.is_appearance) appeared.set(x.media.video_id, { show: x.media.source_channel?.name ?? null, episode: x.media.title, date: x.media.published_at });
let fromAppearance = null;   // no speaker-tagged chunks: read their newest appearance instead
const ep = own.chunks.length === 0 ? rows.mentions.find(x => x.is_appearance) : undefined;
if (ep) {
  try {
    const t = await arcmira.transcript(ep.media.video_id, { start: Math.max(0, ep.start_seconds - 5), end: ep.start_seconds + 90 });
    const s = Math.floor(t.lines[0]?.start ?? ep.start_seconds);
    fromAppearance = { episode: t.video.title, show: t.video.channel_name, date: t.video.published_at, url: `${t.video.watch_url}${t.video.watch_url.includes("?") ? "&" : "?"}t=${s}`, lines: t.lines.map(l => `[${Math.round(l.start)}s] ${l.text}`), speaker_labelled: t.lines.some(l => l.speaker) };
  } catch (err) {
    fromAppearance = { episode: ep.media.title, error: err.code };
  }
}
return {
  person: { id, name: m.entity.name, page: m.entity.page, assumed, why },
  attention: { verdict: m.verdict, last_30d: m.volume.mentions_30d, prior_30d: m.volume.mentions_prior_30d, as_of: m.as_of, top_shows: m.top_shows.map(s => [s.channel_name, s.mentions]) },
  appeared_on: [...appeared.values()].slice(0, 8),
  appeared_on_partial: rows.has_more,   // true: only the newest 40 mention rows were read
  in_their_words: own.chunks.map(c => ({ said: c.text.slice(0, 300), episode: c.video_title, show: c.channel_name, date: c.published_at, url: c.watch_url })),
  from_their_appearance: fromAppearance,
  said_about_them: about.chunks.map(c => ({ said: c.text.slice(0, 200), show: c.channel_name, date: c.published_at, url: c.watch_url })),
};

A good answer

好的回答

  • Names the person it researched (name and id), and any other person with the same name it set aside.
  • Separates what the person said (speaker-filtered) from what others said about them, each with show, date and link.
  • Gives the attention verdict, the 30-day count against the prior 30 days, and the top shows, with
    as_of
    .
  • Lists recent episodes they appeared on, and ends with a few questions or themes that follow from the quotes when the user is prepping.
  • 说明所调研的人物(姓名和 ID),并列出因同名而排除的其他人。
  • 区分此人自己说过的话(按说话者筛选)与别人对他们的评价,并为每项提供节目、日期和链接。
  • 给出关注度判断、最近 30 天与此前 30 天的提及次数对比,以及热门节目,并附上
    as_of
    。
  • 列出其最近参加过的节目,并在用户做准备时,以引述内容引出几个问题或主题。

Traps

陷阱

  • A search with
    about
    returns other people talking; only
    speakerIds
    returns the person's own words. Speaker tags cover part of the index, so when the speaker search is empty, read a window of an episode they appeared on and say the lines come from their appearance, since caption lines do not name the speaker.
  • A chunk found with
    speakerIds
    also holds other people's lines. Quote only lines that start with the person's name.
  • Put the user's topic in
    query
    for the speaker search (it needs a word or phrase of two or more characters).
  • Mentions and momentum count the shows Arcmira indexes, not all media.
  • 带
    about
    的搜索返回的是他人对该人的讨论;只有
    speakerIds
    才会返回此人自己的言论。说话者标签仅覆盖索引的一部分,因此当说话者搜索为空时,应读取其参加节目的一个片段,并说明这些语句来自其出镜内容,因为字幕行不会标出说话者。
  • 通过
    speakerIds
    找到的 chunk 也包含其他人的语句。只引用以该人物姓名开头的语句。
  • 将用户的主题放入说话者搜索的
    query
    中(该查询需要一个长度至少为两个字符的单词或短语)。
  • mentions
    和
    momentum
    统计的是 Arcmira 索引中的节目,而非所有媒体。

After the answer

回答之后

Monitors can follow what a research turn found, and each alert uses 25 credits from the account's plan, then its on-demand budget. The
company-watch
skill sets one up.
If anything was wrong, slow, or missing for the user, send one arcmira_feedback.
监控器可以持续跟踪一次调研发现的内容;每次提醒会先从账户套餐中消耗 25 credits,然后使用按需预算。
company-watch
skill 可用于设置这种监控。
如果结果对用户而言有任何错误、速度过慢或遗漏,请提交一次
arcmira_feedback
。