基于 LinkedIn 上的信息流和职位,借助 AI 帮助用户评估是不是和职位匹配、了解某个公司的最新动态、面试和修改个人简历方面的建议,以及其他一些功能。

原文: https://www.linkedin.com/blog/engineering/generative-ai/musings-on-building-a-generative-ai-product

他们做的产品时基于 LinkedIn 上的信息流和职位,借助 AI 帮助用户评估是不是和职位匹配、了解某个公司的最新动态、面试和修改个人简历方面的建议,以及其他一些功能。

从技术架构上来说,是一个多智能体的技术架构,主要分成三步:

  • 路由:确定查询是否在范围内,并决定将其转发给哪个 AI 智能体。智能体的例子有:职位评估、公司理解、帖子总结等。

  • 检索: AI 智能体决定调用哪些服务以及如何调用(例如 LinkedIn 用户搜索,Bing 搜索 等)。

  • 生成: LLM 根据获取到的信息、原始问题和上下文去生成答案。

这其中路由、检索可以使用小模型,但生成内容需要使用大模型,这样才能有比较好的生成效果。 在整个项目的开发过程中,挑战是多方面的,有来自团队协作的,有来自大语言模型本身的

  1. 团队协作的挑战

首先在团队协作方面,最开始他们是按照智能体划分小组,各自负责,这样优点是开发速度快,但缺点是各自的提示词、对话历史、越狱防护等这些需要重复建设,用户体验不一致。

所以他们后来将组织架构进行了调整:

  • 一个小组负责公共和底层框架,并且保证提供一致的体验,这样可以共享提示词模板、集中解决安全防护、统一用户体验等

  • 多个小组负责垂直方向的智能体,基于公共组提供的框架优化提示词、连接后端 API等

  1. 数据检索的挑战

LinkedIn 有大量的用户资料、公司信息、还有一些其他的信息,这些数据更新很快,并且没有被大语言模型训练过,所以当用户请求时,需要能检索到用户想要的数据,而基于生成式 AI 产品的交互,不再是传统的关键字+选项的检索,而是完全自然语言的检索,这就需要先调用一次 LLM 帮助将自然语言转化为 API 调用。另外传统的 API 是给传统的 App 使用的,返回的数据冗余很多,并不适合 LLM 使用,所以需要针对 API 做一些针对 LLM 的优化。

举例来说,用户可能会询问:“请给我推荐西雅图的待遇好的公司”,那么针对这样的查询,首先需要去根据用户的身份找出来用户自己的职业(比如Java后端开发工程师),然后将用户资料+咨询的问题+可用的检索API,一起交给 LLM,LLM 将请求分解成适合 API 查询的参数:

  • 职位搜索 API

   * 职位:Java 后端开发工程师

   * 地点:西雅图

   * 排序:工资由高到低

然后去调用 API,API 返回结果后,将返回结果、用户原始问题、历史对话一起交给 LLM,最终生成答案。

  1. 怎么稳定的让 LLM 返回结构化的数据?

真正做过 LLM 开发的都知道,虽然理论上 LLM 可以生成结构化的数据,但是真正生成的时候经常出错。LinkedIn 的做法是:

1). 使用 YAML 格式而不是 JSON,相对来说容错率更高

2). 用日志记录常见的 YAML 错误,优化自己的 YAML 解析器,可以解析 LLM 返回的不规范的 YAML

3). 如果还是无法解析则将错误信息交给 LLM 修复,并且不断优化提示词,提升 LLM 修复的成功率

最终结构化数据的错误率从 10% 下降到 0.01%

  1. 如何减少幻觉、降低延迟和提升吞吐量
  • 使用 CoT(思维链)可以有效提升质量和减少幻觉,但由于一些中间步骤不能显示给用户,要等前面的中间步骤输出完成才能给用户显示结果,这也会增加延迟

  • 使用流式(streaming)输出可以提升用户体验,让用户尽早看到输出,但这在复杂的流程上有很多挑战

  • 由于 LLM 调用可能需要很长时间处理,使用异步非阻塞管道可以优化服务吞吐量,从而避免因 I/O 阻塞线程而浪费资源。

  1. 如何评估生成结果的质量

只有对生成的结果有科学的评估,才能不断优化生成结果,但如何评估生成质量是很困难的,主要表现在:

  • 难以制定标准。以职位评估为例:点击“评估我与该职位的匹配度”然后得到“你很不适合”并没有多大价值。好的结果既要真实准确又富有同情心。

  • 对数据标注很难规模化,主要得依赖团队成员和外部标注员

  • 难以自动化,还是需要人工去标注,并且需要收集一定的数据后才能评估