用 NodeJS 10分钟快速实现基于 ChatGPT 的简历智能解析 Agent
ReAct 及其局限性
无论是对于工具(外部数据源、API 或函数)的功能描述还是对于语言模型整体输出内容的结构性描述都是使用自然语言进行的,因此很难保证可靠性,会有概率出现不符合预期的输出。
整个过程还涉及到与语言模型的多个轮次的交互,且语言模型还会把完整的用自然语言表述的思考过程也一并输出,因此需要占用大量的 Token。无论是从对模型的最大 Token Window 的限制来看,还是从大多数 MaaS 形态的模型按 Token 计费的商业模式来看都是极其不经济的。
关于 Flappy
Flappy 受到了 ReWOO 论文( Binfeng Xu, Zhiyuan Peng, Bowen Lei, Subhabrata Mukherjee, Yuchen Liu, & Dongkuan Xu. (2023). ReWOO: Decoupling Reasoning from Observations for Efficient Augmented Language Models.) 的启发,将行动计划的规划阶段和执行阶段拆开来实现。
例如同样的场景下,Flappy 可以语言模型生成 1 个执行计划(这个执行计划里已经一次性规划好了,每一步需要执行的操作)。 接着 Flappy 会根据每一步的具体需求调用对应的外部接口或语言模型来完成计划的执行。从而减少了每个步骤都需要语言模型参与的局限性。
另一方面,这样的设计还有 1 个好处是,可以使用不同能力的模型来分别进行任何规划和落地执行。 例如在任务规划阶段使用 GPT-4,具体的数据结构化任务的执行则可以交给 7B 的开源模型来做。从而最优化生产环境下的成本问题。
Node.js 案例
现在我们尝试用 Flappy 来做一个简历筛选的 Node.js 应用,帮助 HR 快速筛选和整理简历信息。
筛选简历的关键,在于提炼简历信息。有了结构化的简历信息后,我们只需提供合适的筛选方法供使用者调用即可。
因此应用需要做的事情包括:
- 读取所有简历文件。
- 分析每一份简历文件,生成结构化的简历数据集。
- 提供便于使用者调用的简历筛选方法。
现在假设我们的数据库中有几份不同格式的简历,我们希望能提取出简历中的关键数据,包括:
- 应聘者名称(name)
- 职位(profession)
- 工作年限(experienceYears)
- 工作技能(skills)
- 教育程度(education)
- 学位(degree)
- 专业(fieldOfStudy)
- 大学(university)
- 毕业年份(year)
筛选目的则是:获取所有工作年限大于7年的应聘者简历。
那我们就朝这个目标开始吧。
下面我将创建一个 TypeScript Node.js 项目来完成这个案例。我将把完整的创建过程用到的命令和代码都贴在文章中,你也可以按照相同的方式来玩一下。
mkdir resume-assistant cd resuem-assistant yarn init yarn add typescript ts-node --dev yarn tsc --init yarn add @pleisto/node-flappy@next touch index.ts
import { createFlappyAgent, ChatGPT, } from '@pleisto/node-flappy' const gpt35 = new ChatGPT( new OpenAI({ apiKey: process.env.OPENAI_API_KEY!, baseURL: process.env.OPENAI_API_BASE! }), 'gpt-3.5-turbo' ) const resumeAssistant = createFlappyAgent({ llm: gpt35, functions: [ ] })
创建实例时,需要提供一个 LLM 模块给 flappy agent 使用。flappy 内置了对 ChatGPT,以及 Baichuan 的支持。这里以 ChatGPT 为例,当然我们建议不要将 apiKey 直接暴露在代码里,此处是通过环境变量引入。至于 functions
变量,将在下文做详细介绍。
运行文件,如果一切配置正常,将不会报错。
export OPENAI_API_KEY=xxx export OPENAI_API_BASE=xxx <
原文链接:https://blog.csdn.net/moyilongamd/article/details/134034970?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171851494916800185853451%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=171851494916800185853451&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~times_rank-20-134034970-null-null.nonecase&utm_term=AI%E7%AE%80%E5%8E%86