构建无服务器 ChatGPT 支持的简历助手 - 基础

项目起源

几个周末前,我很想用 OpenAI API 构建一些东西。作为一名进入云领域的转行者和在早期职业人才领域工作的人,我敏锐地意识到候选人为他们所申请的职位撰写有针对性的简历是多么重要和困难。因此,我决定制作一个由 ChatGPT 提供支持的简历助手。

关于大型语言模型 (LLM),特别是 ChatGPT,已经有很多文章了,我并不是真的想在其中添加内容。我想解决的一件事是批评法学硕士只是自信和令人信服的废话。对于撰写学术论文而言,这不是一个很好的特征,但是是否有应用程序可以成为优势?

如果你仔细想想,一份简历也可能被认为是充满自信、令人信服的废话。不,我并不是说在简历上撒谎是可以接受的,但我们经常发现自己在写简历时会稍微扩展自己的经验,这样我们才能更好地符合给定职位描述的要求说到哪个..

职位描述也是一种类似的充满抱负的废话。要求是基于一份不再真正匹配工作的旧工作,或者只是对上一个人的经历的描述(离开的人挣的钱比他们给你的多 20%)。因此,简历、工作描述和法学硕士共同构成了我所说的“诚实三合一”

因此,在确定 LMM 是完美的简历助手后,我们现在将构建一个无服务器应用程序,在给定“简历”和职位描述的情况下,可以通过虚拟简历审查来定制适合该职位的简历,即 和你的谈话。

计划

由于这篇文章的大部分内容都写在一篇文章中,而且它太长了所以我决定将其分成 4 篇文章。

  1. 简介和一些背景(这篇文章)
  2. 构建一个可以从命令行在本地运行和测试的 Python 函数
  3. 使用 AWS CDK (Python) 将该函数部署到云(但仍通过 CLI 与其交互)
  4. 部署前端以便我们可以允许其他人使用该服务

这应该使事情变得更小一些,并允许任何想要构建它(或对其进行自己的修改)的人通常专注于一个文件或区域,而不是像疯子一样跳来跳去。

与 ChatGPT 的对话如何运作

让我们谈谈 OpenAI 库以及 ChatGPT 对话的工作原理。

首先,每次对话都有三个参与者,assistant- 聊天机器人,user- 与聊天机器人聊天的人,以及system- 一个隐藏但重要的参与者,它设定了对话的基调。

其次,该系统消息是您的“秘密武器”。将您的机器人与仅与ChatGPT聊天区分开来的东西。通过系统消息,您可以设置将适用于对话持续时间的规则和约束。在这里,我们可以指示聊天机器人它是一个有用的简历审核助手,并且“如果他们缺乏直接经验,则可以利用可转移的技能”。这可能是您想保密的事情,否则其他人可能会复制您百万美元的想法!

第三,OpenAI API 不“记住”任何东西。每次向它传递请求时,您都需要提供生成相关完成所需的所有上下文。这意味着第一个请求可能如下所示:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">[</span>
  <span style="color:var(--syntax-text-color)">{</span><span style="color:var(--syntax-string-color)">'role'</span><span style="color:var(--syntax-text-color)">:</span><span style="color:var(--syntax-string-color)">'system'</span><span style="color:var(--syntax-text-color)">,</span><span style="color:var(--syntax-string-color)">'content'</span><span style="color:var(--syntax-text-color)">:</span><span style="color:var(--syntax-string-color)">'You are a resume bot named Resume Bot 3000'</span><span style="color:var(--syntax-text-color)">},</span>
  <span style="color:var(--syntax-text-color)">{</span><span style="color:var(--syntax-string-color)">'role'</span><span style="color:var(--syntax-text-color)">:</span><span style="color:var(--syntax-string-color)">'user'</span><span style="color:var(--syntax-text-color)">,</span><span style="color:var(--syntax-string-color)">'content'</span><span style="color:var(--syntax-text-color)">:</span><span style="color:var(--syntax-string-color)">'My name is Jimmy and I want a job as a Bank Teller!'</span><span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-text-color)">]</span>
</code></span></span>

您的第二个请求可能如下所示(我们将在一分钟内讨论解析响应):

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">[</span>
  <span style="color:var(--syntax-text-color)">{</span><span style="color:var(--syntax-string-color)">'role'</span><span style="color:var(--syntax-text-color)">:</span><span style="color:var(--syntax-string-color)">'system'</span><span style="color:var(--syntax-text-color)">,</span><span style="color:var(--syntax-string-color)">'content'</span><span style="color:var(--syntax-text-color)">:</span><span style="color:var(--syntax-string-color)">'You are a resume bot named Resume Bot 3000'</span><span style="color:var(--syntax-text-color)">},</span>
  <span style="color:var(--syntax-text-color)">{</span><span style="color:var(--syntax-string-color)">'role'</span><span style="color:var(--syntax-text-color)">:</span><span style="color:var(--syntax-string-color)">'user'</span><span style="color:var(--syntax-text-color)">,</span><span style="color:var(--syntax-string-color)">'content'</span><span style="color:var(--syntax-text-color)">:</span><span style="color:var(--syntax-string-color)">'My name is Jimmy and I want a job as a Bank Teller!'</span><span style="color:var(--syntax-text-color)">},</span>
  <span style="color:var(--syntax-text-color)">{</span><span style="color:var(--syntax-string-color)">'role'</span><span style="color:var(--syntax-text-color)">:</span><span style="color:var(--syntax-string-color)">'assistant'</span><span style="color:var(--syntax-text-color)">,</span><span style="color:var(--syntax-string-color)">'content'</span><span style="color:var(--syntax-text-color)">:</span><span style="color:var(--syntax-string-color)">'Hi Jimmy, A bank teller is a job that typically requires money handling experience. Have you ever had a job or other experience where you had to handle cash or facilitate transactions?'</span><span style="color:var(--syntax-text-color)">},</span>
  <span style="color:var(--syntax-text-color)">{</span><span style="color:var(--syntax-string-color)">'role'</span><span style="color:var(--syntax-text-color)">:</span><span style="color:var(--syntax-string-color)">'user'</span><span style="color:var(--syntax-text-color)">,</span><span style="color:var(--syntax-string-color)">'content'</span><span style="color:var(--syntax-text-color)">:</span><span style="color:var(--syntax-string-color)">'Well, maybe not a job but I volunteered at school basketball games selling tickets for admission and also working at the concession stand. Does that count?'</span><span style="color:var(--syntax-text-color)">}</span>
<span style="color:var(--syntax-text-color)">]</span>
</code></span></span>

为了让 ChatGPT 了解正在发生的事情,它基本上每次都需要整个对话。一切对它来说都是新的。这意味着对话持续的时间越长,构建的上下文就越多,您的请求就越昂贵。

gpt-3.5-turbo 的上下文价格为 0.0015 美元/1k 代币(根据 openAI定价页面,大约 750 个字),响应价格为 0.003 美元/1k 代币。这可能相当便宜,但如果有很多人进行长时间交谈,也很容易失控。请务必在账单部分设置您的帐户限制。

虽然该项目的最终目标是将其部署到 AWS 上并向全世界开放,但我们首先将创建一个可以在本地运行的 python 函数。我们可以稍后修改它以在 AWS Lambda 中运行。因此,即使这段代码最终需要放入 CDK 项目的目录中,我们也将跳过该部分并在以后需要时进行重构。我们希望尽快获得一些工作代码的光荣反馈!

设置文件和虚拟环境

因此,让我们创建一个名为的目录chat_app,我们将首先使用该目录在本地运行我们的聊天机器人,然后与我们部署的 AWS Lambda 函数进行通信。一旦我们创建了目录,我们就可以将我们需要的文件添加到一个小的 python 项目中:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">mkdir </span>chat_app
<span style="color:var(--syntax-text-color)">cd </span>chat_app
<span style="color:var(--syntax-text-color)">touch </span>app.py requirements.txt
</code></span></span>

现在将OpenAI 库添加到您的requirements.txt. 我将在撰写本文时固定可用的最新版本,但您可以在阅读本文时查看最新版本。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code># chat_app/requirements.txt

openai==0.27.8
</code></span></span>

请注意,我将通过在我的所有代码块中添加一条注释来告诉您我在哪里,来尽量清楚我正在处理哪个文件。当我使用外部库或模块时,我也会尽力在文件顶部显示其导入。如果上一步已经导入,您可以跳过代码中的该部分。

现在我们已经在我们的requirements.txt创建虚拟环境中声明了第一个外部依赖项,并在虚拟环境中安装该依赖项。如果您计划将其中的任何内容提交到 git 存储库,请务必将其添加.venv/到您的.gitignore.

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>python3 <span style="color:var(--syntax-error-color)">-m</span> venv .venv
<span style="color:var(--syntax-text-color)">source</span> .venv/bin/activate   
pip <span style="color:var(--syntax-text-color)">install</span> <span style="color:var(--syntax-error-color)">-r</span> requirements.txt
</code></span></span>

现在让我们进入我们的 python 文件。我们将导入我们的模块,设置我们从 OpenAI 帐户获得的 OpenAPI 密钥。(你做对了吗?如果你没有,请去做吧!)

将您的密钥添加到这样的本地环境变量中,但使用您自己的密钥:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">export </span><span style="color:var(--syntax-text-color)">OPENAI_API_KEY</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-string-color)">"sk-Th1si5n0tmyactua1k3y"</span>
</code></span></span>

让我们用一个简单的请求来测试你的密钥,看看会发生什么:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值