← All AI Engineer talks

AI Engineer Summit 2025

Voice Agents: the good, the bad, and the ugly

Eddie Siegel· Chief Technology Officer, Fractional AI18:48

Read the talk

Building a voice interviewer that knows when to move on

A consulting interview agent shows why natural voice conversations need explicit navigation, background checks, transcript filtering, and evaluations that go beyond a good prompt.

From a talk by Eddie Siegel

Before you start: Familiarity with LLM prompts, tool calling, and application state will help with the implementation discussion.

What makes a voice conversation work?

How do you know whether a voice agent is having a good conversation? A plausible response is not enough. It can hallucinate, miss the purpose of a question, or leave the user waiting long enough to break the rhythm. Eddie Siegel, CTO at Fractional AI, starts with this engineering problem: conversational quality is difficult to evaluate, and latency matters when the interface is meant to feel like talking to a person.

Audio adds two more difficulties. Transcription can introduce errors before anyone evaluates the conversation, and the application must handle a continuous stream rather than discrete text exchanges. The system has to manage both what the conversation means and how it unfolds.

Slide titled “Voice models are tough to wrangle,” listing hallucinations, evals, and latency alongside transcription and streaming.
Voice models add transcription and streaming challenges to familiar LLM problems.
0:020:15
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

0:02 · section reference included

An interview should reveal more than a form

The concrete application is qualitative research inside a large company: interviewing employees to understand how they do their jobs, not interviewing candidates for employment. Imagine sending consultants into Coca-Cola to ask employees about their work. Each conversation consumes consultant time, and arranging consecutive interviews creates calendar coordination and scheduling overhead. Coca-Cola is Siegel’s illustrative example, not an identified deployment.

A form removes much of that overhead, but it also changes what people tell you. An interviewer builds trust, decides when to improvise, and asks follow-up questions in response to an unexpected answer. Someone speaking freely may reveal details they would never type into a fixed questionnaire. The agent therefore needs to preserve the freedom to ramble while still gathering the information the interview is meant to collect.

The intended capacity was hundreds of simultaneous interviews, without the scheduling burden of assigning a consultant to each conversation. Automatic transcripts would then support extracting information and aggregating findings across interviews. These are the product goals that make conversational flexibility worth the engineering effort.

1:141:24
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

1:14 · section reference included

The finished interview experience

The demonstration uses a short test interview; the backend can configure other interview use cases. The agent first asks for the participant’s name and organizational role. Siegel identifies himself, and the agent moves to his goals for the interview. He explains that he wants to demonstrate its capabilities and discuss what it took to build. The agent paraphrases that goal, then offers either another question or a chance to add more.

Interview interface with a progress sidebar showing one of two questions completed and a conversation about the participant’s role and demo goals.
The interview interface shows two questions, participant replies, and an agent follow-up.

When Siegel says he has nothing more to add, the agent thanks him and closes the conversation. The exchange looks straightforward: ask, listen, acknowledge, move on. Making those transitions reliable is where the implementation becomes more interesting.

3:233:29
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

3:23 · section reference included

Make question navigation an application event

The first implementation used the OpenAI Realtime API with a large prompt containing the interview instructions, all the questions, and guidance on navigating between them. That approach became awkward when the team wanted a sidebar roadmap: a list of questions, an indication of the current question, and controls for jumping between them. The application could not reliably tell which question the model was asking, or coax it into the right place after a user clicked elsewhere.

The team changed the contract. Supply only the current question, and give the model a tool for requesting the next one. When the model calls that tool, application code deterministically supplies the next question. A transition becomes observable because it must pass through the application. The following TypeScript captures that initial navigation rule using the two questions from the demo:

typescript

const questions = [
  {
    id: "role",
    text: "What is your name and role in your organization?",
  },
  {
    id: "goals",
    text: "What do you hope to accomplish with this interview?",
  },
] as const;

let currentIndex = 0;

function currentQuestion() {
  return questions[currentIndex] ?? null;
}

function handleNextQuestionRequest() {
  currentIndex = Math.min(currentIndex + 1, questions.length);
  return currentQuestion();
}

Here, the tool handler advances stored state and returns either the next question or null when none remains. The model requests progression; it does not choose an arbitrary index.

User navigation needs an additional signal. When someone skips ahead or revisits a question, the application injects a prompt explaining why the current question changed. Separate prompts distinguish those cases, allowing the agent to acknowledge that it can return to a skipped topic later or resume something already discussed. This preserves conversational continuity around a transition the user initiated.

4:464:59
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

4:46 · section reference included

Let the interviewer improvise, but detect rabbit holes

A next-question tool solves navigation, but it does not ensure the model will use it at the right time. In repeated interviews, the agent kept encouraging the participant, asking follow-ups, and digging into rabbit holes. Stronger instructions to move on reduced that behavior, but also suppressed the improvisation the product needed.

The team introduced a Drift Detector: a separate text LLM call, with its own prompt, that examines the conversation history in the background. It checks whether the conversation remains on topic, whether the current question has been answered, and whether it is time to advance. The settings shown in the recording distinguish CONTINUE, OFF_TOPIC, and NEXT_QUESTION.

“Rabbit holes” slide showing the Drift Detector settings, model field, temperature slider, and system prompt with CONTINUE, OFF_TOPIC, and NEXT_QUESTION outcomes.
The Drift Detector prompt distinguishes continuing, going off topic, and moving to the next question.

When the detector returns a sufficiently strong indication that the interview should move on, the application requires tool use through an OpenAI API setting. That turns an advisory judgment into an enforced transition. The voice agent can improvise during the answer, while a separate evaluator decides when continued exploration has stopped serving the interview.

6:567:10
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

6:56 · section reference included

Give questions a purpose, then choose the next path

Controlling drift exposed another limitation. An interviewer can follow up too little or too much, and even a reasonable rephrasing can change what a question is meant to uncover. Supplying one question at a time also limits the model’s awareness of the wider interview. With only a linear next-question action, it tends either to dig deeper into the current topic or ask for whatever comes next.

The interview plan therefore gained goals and priorities as explicit fields. The model receives not just the wording of a question, but why it is asking. That purpose guides both rephrasing and follow-up. A separate next question agent adds another decision: what should the interviewer ask next?

The admin example asks, “What are your main responsibilities and daily tasks?” Without further guidance, the model might repeat the question, lightly rephrase it, or decide inconsistently whether an answer is sufficient. For an imaginary interview intended to find opportunities for AI assistance, the plan adds two priorities:

PriorityGoal
HighGet a clear picture of regular activities
MediumIdentify where AI might be useful

The higher-priority goal establishes what the interview must learn. The second gives follow-ups a useful direction without replacing the primary purpose.

The next question agent runs over the transcript while the conversation proceeds. Its prompt teaches it how to assess the interview’s direction and choose another path when appropriate. This separates two judgments that initially looked like one: whether to stop exploring the current question, and what to explore after it.

8:218:35
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

8:21 · section reference included

The transcript is not the audio model’s understanding

The transcript now has two audiences: the background agents that use it to make decisions, and the participant watching the live conversation. In the implementation Siegel describes, the Realtime API’s core model understands audio directly, while a separate Whisper model transcribes the user’s speech. Those are different operations. The audio model can identify a clap, cough, or bang on a table; the transcription model tries to turn its input into text.

That distinction produced some conspicuous failures. Siegel reports sending silence and receiving a transcript that appeared to switch languages despite an English conversation history. In another example, background noise with no speech produced “Creeping dippity, dippity, dippity, dippity.” Displaying such text tells the participant that the system heard words they never said.

Siegel reports that the Realtime integration available to this implementation did not expose the transcription controls needed to address these errors, even though working with Whisper at a lower level might offer tuning options. That is a historical constraint: today’s Realtime transcription guide describes model-dependent controls for context and expected language. The team’s response was to add another agent that examines the full transcript and decides whether a suspected error should be hidden from the user. Its displayed prompt considers grammatical coherence, relevance, speech patterns, and context.

“Transcript woes” slide with a Transcript filter agent label, robot illustration, and prompt listing four transcript quality criteria.
A transcript filter evaluates grammatical coherence, relevance, speech patterns, and context.

Hiding a transcript block does not correct the transcription. The system still captures the block; it suppresses its display. Meanwhile, the core audio model can recognize that it did not receive an intelligible answer and ask the participant to repeat it. That makes the visible interaction more coherent without pretending that the stored transcript has become accurate.

10:5111:07
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

10:51 · section reference included

Evaluate the conversation and the fixes

Each additional agent addressed a concrete failure, but the growing collection of prompts made iteration harder. Initially, the team would conduct a test interview, notice something wrong, and patch the behavior. Once several agents were involved, it became difficult to identify which prompt needed changing or whether the change helped. Fixing one Drift Detector failure could reintroduce a problem from an earlier interview.

The team added an automated evaluation suite that runs over conversations, using an LLM as judge with a separately tuned prompt for each attribute:

  • Clarity: How clear was the conversation?
  • Completeness: How complete was the conversation?
  • Professionalism: How professionally did the agent behave?

These checks give prompt changes a more systematic basis than whether the latest manual interview felt good.

The judges still need tuning, and there is no perfect ground truth for a good interview. An ideal evaluation setup would combine objective metrics with historical data against which to compare the current system; this application does not have that combination. The value of the suite is structured measurement that can guide iteration despite that uncertainty.

13:2613:43
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

13:26 · section reference included

Test with a roster of synthetic interviewees

The next problem is obtaining enough conversations to evaluate before users encounter an annoying behavior or a serious edge case. In Siegel’s hypothetical Coca-Cola rollout, discovering those problems from the client would be too late. Repeatedly talking to the computer and clicking through interviews is also tiring. The team instead uses LLMs to play interviewees in synthetic conversations.

The process is straightforward:

  1. Create a persona prompt describing the interviewee. Siegel’s deliberately unusual example is a snarky teenager in charge of a Fortune 500 company.
  2. Build a roster that varies the personalities and job functions expected among actual interviewees.
  3. Have the interview agent question each persona, with the simulated participant answering in character.
  4. Run the same evaluation suite over the resulting conversations and average the metrics across the simulated population.

Those averages estimate behavior across the intended user types; they do not establish real-user quality. The immediate benefit is an automated way to exercise the interviewer against more than the developers’ own conversational habits.

15:5116:07
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

15:51 · section reference included

Make behavior observable enough to improve

An API integration and a well-written prompt can take a voice application a long way. In this case, robustness required additional decisions around the live conversation. Separate text agents checked whether the interview remained useful and redirected it when necessary, leaving the voice model to handle the spoken exchange.

Tool use also supplied something beyond behavioral constraints: instrumentation. If the model must call a tool to change questions, the application knows when that action happens. The same boundary that limits what the agent can do makes its behavior easier to observe.

Evaluation then gives that visibility a purpose. It measures success, but also helps decide what to change next. Even without an objective source of truth for conversational quality, a consistent evaluation process makes development more deliberate than repeatedly editing prompts until one interview sounds right.

17:1817:38
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

17:18 · section reference included

Resources

From the talk

  • OpenAI's original announcement explains the speech-to-speech API and its function-calling capabilities.

  • Documents Whisper's intended uses and limitations, including transcription of words that were not spoken.

Updates since the talk

Read the complete timestamped transcript
  1. 0:02

    Hey, everyone. My name is Eddie Siegel. I'm the CTO at Fractional AI. Uh, and today I'm here to talk to you about AI voice agents and, uh, all the challenges we've run into building with them and ways we've been able to work around those challenges.

  2. 0:15

    So to start, uh, voice models are just generally tough to wrangle. I mean, ability with LLMs is tough to begin with, right? They hallucinate. They're generally difficult to evaluate.

  3. 0:24

    Coming up with metrics to know how well your system works is really challenging, especially if you're dealing with something that is conversational in nature, where there's no objective metric to know how well you did or how poorly you did in a particular interaction.

  4. 0:36

    And latency is challenging for many different kinds of applications that leverage LLMs. They're especially, uh, it's an especially important challenge when you're dealing with conversational UIs that are meant to, to be, uh, sort of fluid the way a human conversation would be fluid.

  5. 0:51

    And when we're dealing with audio, uh, and these voice agents, everything's on hard mode. You deal with all these existing, uh, AI problems, plus you're trying to deal with things like transcription, which is not as straightforward as you might think.

  6. 1:04

    You're dealing with a streaming environment instead of the sort of batched back and forth, uh, uh, kind of interaction that you get with text, and this all makes it really, really hard to do development.

  7. 1:14

    So let's go into a case study with an actual application that we built recently so that we can see in practice why the, the sort of theory, uh, was not exactly what we encountered in practice.

  8. 1:24

    Um, so for this case study, we're, we're talking about, uh, automating this sort of consulting style of, of interview. And what I mean by that is like going into big companies and interviewing employees there to learn information.

  9. 1:38

    It's not, not interview as in a job interview, but interview as in, let me go, uh, into some Fortune 500 company and understand how people are doing their jobs.

  10. 1:45

    This is a thing that consultants do all the time. When they're trying to research how something works within a company, they have to go in and do this sort of in-depth qualitative research where they're going and meeting with employees at a company and asking them questions.

  11. 1:57

    It's a pretty expensive process. Uh, you know, if I wanna send a bunch of consultants into Coca-Cola to ask employees about things they're doing, the consultants have to spend a whole bunch of time.

  12. 2:07

    It's very inefficient. You've got people's schedules to line up and do the sort of, you know, how do, how do you cram a calendar full of these interviews back to back?

  13. 2:13

    Lots of overhead, but it's necessary. This is a kind of a difficult thing to automate, right? You might think, why not just send them, uh, you know, a form to fill out or something?

  14. 2:22

    And there's certain cases where you probably can, but in a lot of cases, you need the human touch, right? You need the interviewer to, to be navigating, you know, when do I sort of improvise?

  15. 2:31

    How do I build trust? What follow-up questions do I wanna ask? Um, and also people being interviewed answer differently when they're asked to type out, uh, questions to specific or answers to specific questions.

  16. 2:43

    Whereas like if they're given the freedom to just ramble, they often say more stuff. And so the goal here is let's build an AI interview agent that can replace this function here, where our AI system should conduct interviews just like a human would conduct these interviews.

  17. 2:58

    It should feel less like filling out a form and more like having a conversation. But our system will be able to interview hundreds of people at once and not deal with this sort of scheduling issue and the high cost of sending consultants into a company.

  18. 3:09

    Um, and one nice outcome of the system should be that we get automatic transcription of what happened during the conversation so that later on we can extract whatever data we need to extract, uh, and aggregate it across all these different interviews.

  19. 3:23

    Uh, so let me just dive into a quick demo and show you what we ended up building so you can see what it looks like in practice.

  20. 3:29

    So here I just set up a test interview that's gonna ask me just a, a few basic questions like, you know, who I am and, and what I'm here to do.

  21. 3:35

    But on the back end, this can be configured with all sorts of different sort of use cases that we'd have in mind.

  22. 3:43

    Hello. Let's begin. What is your name and role in your organization?

  23. 3:50

    Hi, I'm Eddie Siegel. I'm the CTO at Fractional AI.

  24. 3:58

    Pleasure to meet you, Eddie. As we continue, I'm curious to know what you hope to accomplish with this interview. What are your main goals?

  25. 4:06

    Mainly, I just want to show a quick demo of what your capabilities are so that I can talk about what it took to build you.

  26. 4:12

    Got it. You'd like to showcase a demo of what I can do and discuss what went into creating me. That's a clear goal. Shall we move on to another question, or is there anything else you'd like to add?

  27. 4:26

    No, I think that's all I got from my end. Thanks.

  28. 4:31

    Thank you for taking the time to talk to me, Eddie. It was great hearing about your role and your intentions to showcase a demo of my capabilities. I'm looking forward to being a part of your demonstration.

  29. 4:46

    So now you see what the final product looks like, we can talk a little bit about how we started building something like this. And when we first started, we figured there's this great OpenAI Realtime API that lets you build, uh, uh, you know, voice agents like this.

  30. 4:59

    Um, and we just did the naive starting thing. We integrated with the OpenAI API. We built a big prompt that explains, you know, you're trying to conduct this kind of interview, and it tells them all these things about the interview, and then puts all the interview questions we might wanna ask into the prompt and tries to explain

  31. 5:15

    how to navigate asking those questions. Um, the problem is, like, we quickly realized that we wanted some additional functionality here, and the f-- one of the early things we realized we wanted was we wanted to show a little roadmap on the side of the screen that, that shows the list of questions you're gonna be asked, which one's

  32. 5:30

    being asked right now, and ideally would let you click on this and jump around from question to question. Um, and this really just was not well suited to the monolithic prompt approach that we had at the beginning because there's really no way to know what question the LLM is currently asking, and it's difficult to sort of coax

  33. 5:47

    it into moving around and, and asking a different question if they do click around. So something we introduced here was, let's just ask one question at a time, put that one question into the prompt that we're sending to the LLM, uh And then introduce some tool use here where we give the LLM access to a tool where

  34. 6:03

    it can say, "I want to move on to the next question now." And when it says it wants to move on, on to the next question, then we'll feed it the next tool, sort of determine-- Oh, sorry, the next question deterministically.

  35. 6:14

    And then we also added some additional prompts that we inject into the stream with the LLM in the case where the user just clicked around in this roadmap so that the LLM can be made aware, uh, the user is, you know, we're moving on to this question because the user clicked next or because the user skipped around.

  36. 6:32

    And so this is what it ends up looking like on our back end. We have different prompts for what happens when a user's revisiting a question, what's happening when a user is skipping to something new, uh, and this enables some really cool behavior.

  37. 6:42

    When we skip around the, uh, the agent can now do things like saying, "Sure, let's move on to, you know, XYZ. We can come back to that later," or, "Let's go revisit that question we were talking about, about A-ABC."

  38. 6:56

    Very quickly, once we started playing with this and actually using this in practice over and over again, we found that the LLM had a real tendency to, to go down these rabbit holes where, you know, now that we gave it this tool to use to say, "I want to move on to the next question," it was hard

  39. 7:10

    to get it to call that tool the appropriate amount of time. LLMs just love chit-chatting and asking follow-up questions and digging down rabbit holes and being very encouraging about things that they hear.

  40. 7:21

    Uh, and so this resulted in sort of a reluctance to move on to the next question. Uh, and if we forced it too hard, then we would eliminate its ability to improvise at all, which is obviously not what we want.

  41. 7:32

    So we introduced at this point an additional background agent that's listening to the conversation and running a separate side thread to decide with a totally separate call to a te-- non-voice text-based LLM based on the transcript right now, do we think we're kind of like off track or on track?

  42. 7:47

    And we call this the Drift detector agent. And so this is like a totally separate prompt, and it's just looking through the history, and it's trying to decide, how are we doing?

  43. 7:56

    Are we on topic? Are we off topic? Is, has the question we're trying to a-ask been answered, and is it time to move on? And when we get back a result that says pretty strongly it's time to move on, we can prevent this sort of rabbit holing from continuing any further by like forcing the tool use and

  44. 8:11

    s-- you know, flipping the flag on the API call to OpenAI to say, "Okay, you have to use this tool now and have to move on to the next question."

  45. 8:21

    Broadly, it's pretty hard to get these human-like interviews tuned into the right place. They're always either like following up too little or following up too much. You want them to be able to rephrase questions, but sometimes they rephrase them in ways that are not conducive to the overall interview.

  46. 8:35

    And because of our approach of, uh, you know, giving it one question at a time, it doesn't always know what the whole interview is gonna be like. Um, and also this linear flow, the only thing I can do is decide to go on to the next question, is pretty restrictive.

  47. 8:49

    It's either digging in really hard into the question it's on, or it's saying, "Okay, give me what's next." Um, and this sort of limited the, the natural flow of the conversation.

  48. 8:59

    And so we introduced some things to try and correct for this even further.

  49. 9:04

    Um, the first is we added goals and priorities as a first-class concept, uh, in the sort of plan for the interview. So rather than just telling the LLM, "Here's this-- the question you're asking right now," we're telling it the why behind the question so that it can be informed when it's trying to rephrase or informed when it's

  50. 9:21

    like trying to decide how to ask follow-up questions. Um, and then we introduced yet another side agent, uh, which we call our next question agent, and this guy is just in charge of figuring out what should we ask next.

  51. 9:33

    And so the first point is the-- this is what the goals look like. This is a screenshot from our admin interface, but, you know, we have this question that it's, that it's gonna ask.

  52. 9:41

    You know, in this case, the question is, what are your main responsibilities and daily tasks? And without the goals, you know, it, it may repeat this question verbatim. It'll probably repha-phrase it ever so slightly, but it's gonna ask something pretty similar.

  53. 9:54

    And then when it comes to digging into follow-up questions, who knows? Like, if it's gonna be satisfied after your answer, like, "Okay, I understand this person's responsibilities and tasks" or not, sometimes it's gonna be satisfied, sometimes it won't.

  54. 10:06

    So instead, we add in these goals, and we say there's a high priority goal o-of we want to get a clear picture of this person's regular activities and a medium priority goal of we'd like to be able to start to suss out where AI might be useful.

  55. 10:18

    This is an imaginary use case where you, um, the reason you're doing these interviews is you're trying to find ways to help with AI. And so this really can like help guide what the follow-up questions will look like.

  56. 10:28

    And then we have this, the tuning of this side, uh, you know, next question bot that's just running on the transcript in the background, uh, as the conversation's going, and it's sort of taught how to be a good interviewer, and is this interviewer on track?

  57. 10:41

    And it has the ability to say, "No," like, "it's time to go, go down this path now," um, a-and, and guide the rest of the conversation.

  58. 10:51

    Um, speaking of transcripts, you know, these, these background bots are running off of the transcript of the conversation, and you also see the transcript live. When you're being interviewed, you don't just see what the model is asking you, you see what you said to the model.

  59. 11:07

    And luckily, OpenAI makes this really easy. When you make API calls, you get back, you know, what, what did the user actually say? You get a transcript kind of, you know, baked into the API response.

  60. 11:17

    But, uh, a challenge in the implementation here is that, uh, the OpenAI Realtime API, it has its core model that's listening and understanding you, but it uses a side model called Whisper that's doing the transcription of what the user said.

  61. 11:32

    That core model is this fully integrated model that's able to think about what it's hearing. It's operating in the sound domain. It-- if you clap or if you cough or if you bang on the table and you ask it what you just did, it'll be able to tell you.

  62. 11:45

    Whisper does not work that way. Whisper is converting everything into text. And so, uh, you know, if you clap, you might get some surprising results. And so, like, this is the result of me just not speaking.

  63. 11:57

    I just sense some silence for a little while. And despite the long conversation history and all the evidence that I was speaking English, it decided, "I guess he's not speaking English anymore."

  64. 12:06

    Um, or another one where there's like a little bit of background noise, and I didn't say anything, uh, [chuckles] this is the transcript that came out. So, like, clearly, I was not saying, "Creeping dippity, dippity, dippity, dippity," but you know, it said that I was.

  65. 12:19

    And this is not a great user experience, and there's no way to tune this. There's no, uh, you know, if we were working with, um, Whisper at a low level, there might be things we can do here.

  66. 12:31

    The OpenAI Realtime API does not give you knobs to really control this. And so to handle this at the UX level, we added an entire separate agent that is taking in the whole context of the conversation as it's happened so far.

  67. 12:45

    Here's the entirety of the transcript, and, uh, its, its entire task is should we hide this piece of the transcript from the user? Do we think we have a transcription error?

  68. 12:54

    Um, and we still capture the transcript in that case, but now we can at least hide, you know, these embarrassing examples so that it just doesn't show up as anything to the user.

  69. 13:02

    And the nice thing about that is if these, these, uh, blocks are hidden, the core model still knows what's going on. So I don't include in these screenshots what the response was, but typically the response was like, you know, "I didn't really get that.

  70. 13:14

    What..." You know, and sort of re-re-ask the question, "What, what do you hope to accomplish with this interview? I didn't hear what you said before." And so hiding the transcript actually helps a lot in these cases for the user experience.

  71. 13:26

    So as you can tell, this is getting kind of complex. Like, we're just adding lots and lots of agents to sort of Band-Aid over different things. We're doing a test interview and seeing how it went and realizing that we've got these issues and then trying to, uh, you know, piecemeal, uh, uh, fix them in this kind of

  72. 13:43

    vibes-driven way, which is not the worst thing for the very beginning of the development cycle, but this thing is starting to get complex, and now we have a lot of different prompts to update.

  73. 13:51

    We have all these side in agents. When we have an issue, it's not clear which one to update or if it even worked, and sometimes you're gonna introduce regressions, right?

  74. 13:59

    You perform poorly in one interview setting, and so you update your, you know, uh, um, your Drift detector to sort of handle that case, and maybe you just made yourself worse at the last thing you've tried to fix with that Drift detector.

  75. 14:12

    Um, this is a very challenging situation. It's common to all LLM-based development, but it's extra hard in this domain. We wanna know how well it's working, and the answer is evals.

  76. 14:23

    We need some systematic way to sort of measure, uh, the performance of this system. And so what we ended up coming up with in this case was a set of metrics that, that measure all the different attributes we wanted, uh, to, to see.

  77. 14:36

    Um, and each one of these metrics you're looking at is, you know, something, an automated test suite that we're able to run over a conversation, and then we ask an LLM as judge to measure how clear was this conversation, how complete was this conversation, how professional was the agent, um, all of these different things we see here.

  78. 14:53

    And behind each one of these is a, uh, a prompt that we've tuned to try and do this evaluation. Um, this is really, really useful for getting, uh, more objective.

  79. 15:03

    It's still not completely objective. You know, we don't have a perfect ground truth to measure against here. Um, there's always improvement that we can make in the prompts that are measuring these things, but this is really useful for getting further outside of this sort of purely vibes-driven style of, of iteration and more sort of metrics-driven style of

  80. 15:21

    iteration. Um, as I mentioned, there's no good ground truth here. When you're designing evals for, uh, you know, any system that is gonna do sort of, uh, you know, the sorts of things you'd want to use AI to do, your ideal situation is you've got some objective metrics, you've got some historical data to run, uh, your metrics

  81. 15:43

    and your current system against, and you can know objectively, like, how well are you doing. That clearly doesn't exist here. There's no way to say

  82. 15:51

    with perfect, uh, understanding how well does my system work. But still, we wanna make sure that, like, we don't ship a system that we think is okay and then find out from users in practice, you know, we have a bunch of, uh, these interview agents go out into Coca-Cola, and we find out from Coca-Cola we're annoying all

  83. 16:07

    their users for some reason, or we've got this horrible edge case. Uh, so as we thought about this problem, um, what we ended up introducing was synthetic conversations where we would come up with-- we would use LLMs to fake users and to do fake interviews as the interviewee, and we'd run a whole bunch of these and at

  84. 16:26

    least be able to measure, uh, how well we think we would do against the types of users we want to be able to interview. This also just helps with automation, so that it's not us just clicking around a bunch and taking these interviews.

  85. 16:35

    It gets very tiring to talk to your computer to, to test this thing out. Um, and so the way these synthetic conversations work is we can just create a persona.

  86. 16:44

    That persona is used as a prompt to the LLM, where we tell it who it is. You know, in this case, I said, "You're a snarky teenager that's in charge of a Fortune 500 company."

  87. 16:52

    In practice, we've come up with a whole list of the types of people we expect to be interviewing and their different personalities, their different job functions, uh, and we have a whole roster of them.

  88. 17:02

    And then for each one, we can run it, uh, where the, the agent interviews it, and then it uses that persona to try and answer the questions. Um, and then afterward, we can run that very same eval suite over them, and now we can get average metrics over a broad population of the types of people we'd be,

  89. 17:18

    uh, we'd be interviewing. So to wrap it up, you know, that was a case study with us building with voice, but I think it highlights in general that this approach of, uh, you know, maybe we just call OpenAI, it's got these nice voice capabilities, now we'll have a nice robust voice app, is kind of wishful thinking.

  90. 17:38

    Um, you know, the basic kinda call the API, do some prompt engineering, and get it into a good place is very helpful. It gets you a very, uh, uh, uh, gets you very far in the development process, but it's not enough to build you a robust app.

  91. 17:52

    As you're trying to build that more robust app, some really helpful additions are adding some out-of-band checks, where you've got separate agents operating in the text domain instead of the audio domain, trying to make decisions about whether the thing you're trying to do is, is working properly, um, trying to get the, the overall thing back on track.

  92. 18:09

    And tool use can be very, um, powerful for constraining behavior and for getting, uh, sort of, uh, as like sort of a hack to instrument the LLM and understand what's going on.

  93. 18:20

    Instead of letting it just sort of do whatever it wants, it's gotta call your tools in order to do what it wants, and so now your tools know what's happening.

  94. 18:27

    Um, and then lastly, as with all LLM-based projects, evals are critical to measure success. Uh, they're also critical to guide development. It's, it's hard to know what to do without some metric.

  95. 18:36

    And even in this domain where you've got no objective source of truth, there are still ways to harness evals, uh, to get a really robust development process.