项目起源
几个周末前,我很想用 OpenAI API 构建一些东西。作为一名进入云领域的转行者和在早期职业人才领域工作的人,我敏锐地意识到候选人为他们所申请的职位撰写有针对性的简历是多么重要和困难。因此,我决定制作一个由 ChatGPT 提供支持的简历助手。
关于大型语言模型 (LLM),特别是 ChatGPT,已经有很多文章了,我并不是真的想在其中添加内容。我想解决的一件事是批评法学硕士只是自信和令人信服的废话。对于撰写学术论文而言,这不是一个很好的特征,但是是否有应用程序可以成为优势?
如果你仔细想想,一份简历也可能被认为是充满自信、令人信服的废话。不,我并不是说在简历上撒谎是可以接受的,但我们经常发现自己在写简历时会稍微扩展自己的经验,这样我们才能更好地符合给定职位描述的要求。说到哪个..
职位描述也是一种类似的充满抱负的废话。要求是基于一份不再真正匹配工作的旧工作,或者只是对上一个人的经历的描述(离开的人挣的钱比他们给你的多 20%)。因此,简历、工作描述和法学硕士共同构成了我所说的“诚实三合一”
因此,在确定 LMM 是完美的简历助手后,我们现在将构建一个无服务器应用程序,在给定“简历”和职位描述的情况下,可以通过虚拟简历审查来定制适合该职位的简历,即 和你的谈话。
计划
由于这篇文章的大部分内容都写在一篇文章中,而且它太长了,所以我决定将其分成 4 篇文章。
- 简介和一些背景(这篇文章)
- 构建一个可以从命令行在本地运行和测试的 Python 函数
- 使用 AWS CDK (Python) 将该函数部署到云(但仍通过 CLI 与其交互)
- 部署前端以便我们可以允许其他人使用该服务
这应该使事情变得更小一些,并允许任何想要构建它(或对其进行自己的修改)的人通常专注于一个文件或区域,而不是像疯子一样跳来跳去。
与 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>
让我们用一个简单的请求来测试你的密钥,看看会发生什么:
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-comment-color)"># chat_app/app.py
</span>
<span style="color:var(--syntax-error-color)">import</span> <span style="color:var(--syntax-text-color)">openai</span>
<span style="color:var(--syntax-error-color)">import</span> <span style="color:var(--syntax-text-color)">os</span>
<span style="color:var(--syntax-text-color)">openai</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">api_key</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">os</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">environ</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">get</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">'OPENAI_API_KEY'</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-text-color)">messages</span> <span style="color:var(--syntax-error-color)">=</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)">"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 Cat named Mr. Boots"</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)">"What is your name?"</span><span style="color:var(--syntax-text-color)">},</span>
<span style="color:var(--syntax-text-color)">]</span>
<span style="color:var(--syntax-text-color)">completion</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">openai</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">ChatCompletion</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">create</span><span style="color:var(--syntax-text-color)">(</span>
<span style="color:var(--syntax-text-color)">model</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-string-color)">"gpt-3.5-turbo"</span><span style="color:var(--syntax-text-color)">,</span>
<span style="color:var(--syntax-text-color)">messages</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">messages</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">completion</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">choices</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-literal-color)">0</span><span style="color:var(--syntax-text-color)">].</span><span style="color:var(--syntax-text-color)">message</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">content</span><span style="color:var(--syntax-text-color)">)</span>
</code></span></span>
因此,我们正在创建一个由该系统消息引发的消息对话,并向用户发送一个有关助理名字的问题。
可以访问测试响应.choices[0].message.content
,因此我们打印出该响应。
这是我运行时得到的响应:
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code> ⚡ python app.py
I am a language model AI and my name is OpenAI. But for the purpose of this conversation, you can refer to me as Mr. Boots, the cat. Meow!
</code></span></span>
你可能会得到一些稍微不同的东西。语言模型就是这样。但猜猜怎么了!我们已经完成聊天工作了!现在让我们把它变成一个无限循环(有一些转义),这样我们就可以和布茨先生进行真正的对话了。
我们将从用户那里获取一些输入,并假设它不是我们的转义命令之一,然后进入我们的循环。我们将该输入添加到消息列表中并请求完成。然后我们将打印该响应并将其附加到消息列表中,并等待另一个用户响应。用户输入将决定是否再次进入循环,或者是否退出循环。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-comment-color)"># chat_app/app.py
</span>
<span style="color:var(--syntax-error-color)">import</span> <span style="color:var(--syntax-text-color)">openai</span>
<span style="color:var(--syntax-error-color)">import</span> <span style="color:var(--syntax-text-color)">os</span>
<span style="color:var(--syntax-text-color)">openai</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">api_key</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">os</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">environ</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">get</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">'OPENAI_API_KEY'</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-text-color)">messages</span> <span style="color:var(--syntax-error-color)">=</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)">"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 Cat named Mr. Boots"</span><span style="color:var(--syntax-text-color)">},</span>
<span style="color:var(--syntax-text-color)">]</span>
<span style="color:var(--syntax-text-color)">user_input</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">input</span><span style="color:var(--syntax-text-color)">()</span>
<span style="color:var(--syntax-declaration-color)">while</span> <span style="color:var(--syntax-text-color)">user_input</span> <span style="color:var(--syntax-error-color)">not</span> <span style="color:var(--syntax-error-color)">in</span> <span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-string-color)">"exit"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">"Exit"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">"quit"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">"Quit"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">"stop"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">"Stop"</span><span style="color:var(--syntax-text-color)">]:</span>
<span style="color:var(--syntax-text-color)">messages</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">append</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-text-color)">user_input</span> <span style="color:var(--syntax-text-color)">})</span>
<span style="color:var(--syntax-text-color)">completion</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">openai</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">ChatCompletion</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">create</span><span style="color:var(--syntax-text-color)">(</span>
<span style="color:var(--syntax-text-color)">model</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-string-color)">"gpt-3.5-turbo"</span><span style="color:var(--syntax-text-color)">,</span>
<span style="color:var(--syntax-text-color)">messages</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">messages</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-text-color)">assistant_response</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">completion</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">choices</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-literal-color)">0</span><span style="color:var(--syntax-text-color)">].</span><span style="color:var(--syntax-text-color)">message</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">content</span>
<span style="color:var(--syntax-text-color)">messages</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">append</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-text-color)">assistant_response</span> <span style="color:var(--syntax-text-color)">})</span>
<span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"Mr. Boots: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">assistant_response</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-text-color)">user_input</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">input</span><span style="color:var(--syntax-text-color)">()</span>
<span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"Mr. Boots: GoodBye"</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> ⚡ python app.py
Hello My name is Mr. Dog. What is your name?
Mr. Boots: My name is Mr. Boots. Nice to meet you, Mr. Dog.
Do you like laying in the sun?
Mr. Boots: Yes, I love to bask in the warmth of the sun. It makes me feel cozy and relaxed. How about you, Mr. Dog? Do you enjoy sunbathing?
exit
Mr. Boots: GoodBye
</code></span></span>
我们的第一次谈话!
再见布茨先生!我们有一份简历需要处理!
因此,让我们考虑一下我们的简历助理需要做哪些事情。
- 准备好系统消息
- 获取求职者(候选人)的简历或描述
- 获取某种工作描述
- 与候选人交谈以获取有关他们经历的更多信息
- 准备一份更好的简历
一旦我们将其存储在云中,我们将需要添加一些其他内容,但我们将在下一篇文章中处理这个问题。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-comment-color)"># chat_app/app.py
</span>
<span style="color:var(--syntax-error-color)">import</span> <span style="color:var(--syntax-text-color)">openai</span>
<span style="color:var(--syntax-error-color)">import</span> <span style="color:var(--syntax-text-color)">os</span>
<span style="color:var(--syntax-text-color)">openai</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">api_key</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">os</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">environ</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">get</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">'OPENAI_API_KEY'</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-text-color)">messages</span> <span style="color:var(--syntax-error-color)">=</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)">"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 review assistant. You will be provided information about a job candidate. that information might be in the form of a formatted resume, or just a sentence about themselves. You also may also receive a description of a job or position sought by the candidate. Your task as the assistant is to prompt the candidate for additional information they could add to their resume to make it better generally, and more well suited for the job they are seeking specifically. Don't shy away from asking and promoting transferable and soft skills."</span><span style="color:var(--syntax-text-color)">},</span>
<span style="color:var(--syntax-text-color)">]</span>
<span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"Please provide your resume or tell me about yourself"</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-text-color)">user_input</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">input</span><span style="color:var(--syntax-text-color)">()</span>
<span style="color:var(--syntax-text-color)">messages</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">append</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)">f</span><span style="color:var(--syntax-string-color)">"Candidate information: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">user_input</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">})</span>
<span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"What job do you want?"</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-text-color)">user_input</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">input</span><span style="color:var(--syntax-text-color)">()</span>
<span style="color:var(--syntax-text-color)">user_input</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"Description of the job they want: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">user_input</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">"</span>
<span style="color:var(--syntax-declaration-color)">while</span> <span style="color:var(--syntax-text-color)">user_input</span> <span style="color:var(--syntax-error-color)">not</span> <span style="color:var(--syntax-error-color)">in</span> <span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-string-color)">"exit"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">"Exit"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">"quit"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">"Quit"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">"stop"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">"Stop"</span><span style="color:var(--syntax-text-color)">]:</span>
<span style="color:var(--syntax-text-color)">messages</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">append</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-text-color)">user_input</span> <span style="color:var(--syntax-text-color)">})</span>
<span style="color:var(--syntax-text-color)">completion</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">openai</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">ChatCompletion</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">create</span><span style="color:var(--syntax-text-color)">(</span>
<span style="color:var(--syntax-text-color)">model</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-string-color)">"gpt-3.5-turbo"</span><span style="color:var(--syntax-text-color)">,</span>
<span style="color:var(--syntax-text-color)">messages</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">messages</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-text-color)">assistant_response</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">completion</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">choices</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-literal-color)">0</span><span style="color:var(--syntax-text-color)">].</span><span style="color:var(--syntax-text-color)">message</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">content</span>
<span style="color:var(--syntax-text-color)">messages</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">append</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-text-color)">assistant_response</span> <span style="color:var(--syntax-text-color)">})</span>
<span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"Mr. Boots: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">assistant_response</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-text-color)">user_input</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">input</span><span style="color:var(--syntax-text-color)">()</span>
<span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"Mr. Boots: GoodBye"</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> ⚡ python app.py
Please provide your resume or tell me about yourself
My name is Jimmy Jimbert and I worked at McDonalds as a team member from Jan 10 2022 to now. I did all of the jobs there.
What job do you want?
I would like to be a bank teller.
Mr. Boots: Great, Jimmy! It sounds like you have experience working in a customer service-oriented role, which is helpful when working as a bank teller. Can you please provide more information about your responsibilities at McDonald's, especially those that could be transferable to a bank teller role, such as handling financial transactions, upholding high levels of accuracy and attention to detail, and working as a team with colleagues and customers? Additionally, do you have any experience handling cash efficiently and accurately? Finally, do you have any additional education or certification related to banking or finance that may be relevant for a bank teller role?
exit
Mr. Boots: GoodBye
</code></span></span>
首先,这对我来说似乎是一个很好的开始。人工智能助理已经掌握了一些与这两个职位相关的活动,例如现金处理和准确性。这是我们希望它做的核心事情。
我们还需要进行一些更改,例如我们将助理响应的格式保留为来自“布茨先生”哈哈哈。
其次,很明显,我们需要一种更好的方式来为助理提供我们的简历。粘贴多行文本块的工作量大于它的价值,因此最好只让它加载一个名为resume.txt
. 的职位描述也是如此jd.txt
。当我们继续采取进一步措施时,这项工作也不会浪费。
让我们制作这些文件进行测试。我会继续努力让吉米在银行找到一份工作,但如果你自己在做这件事,你还不如使用你的信息和你正在寻找的工作!
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code># chat_app/resume.txt
Jimmy Jimbert
Experience:
Old Navy 3/15/2022 - present
Team member
McDonalds 5/20/2020 - 3/1/2022
Crew member
</code></span></span>
这是我在 Linkedin 上找到的一份银行柜员工作。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code># chat_app/jd.txt
Bank Teller
PARKWAY BANK
Location: 4106 N Milwaukee Ave.
Chicago, IL. 60641
Hours: Tuesday through Friday 9:00 a.m. – 6:00 p.m.
Saturday 7:45 a.m. - 1:00 p.m.
Hours may change based on the needs of the bank, one day off during the week.
Parkway Bank is looking for a Full-Time Teller at our Six-Corners Branch in Chicago, IL. We are a locally owned and operated financial institution committed to offering the best in customer service, financial products, and services. We maintain a strong presence in our communities through donations, volunteer work, and education. Come be a part of our growing team!
Job Duties:
Responsible for receiving deposits for credit to customer’s deposit and loan accounts (personal and commercial); verifying cash withdrawals and signature endorsements within established limits and securing required approval as necessary; scanning daily work; balancing daily transactions. In addition, tellers are responsible for ensuring quality customer service; maintaining acceptable teller difference records; and referring sales opportunities to the appropriate banking staff. Tellers are required to meet and/or exceed appropriate referral goals and perform other job functions as assigned by supervisor/manager.
Requirements:
High school diploma, GED or currently pursuing.
Three months cash handling
Effective customer service and sales skills
Good math and clerical skills
Ability to effectively communicate (oral and written) with fellow employees and customers.
Must be accurate and detail oriented.
Ability to work varied hours/days as needed.
Proficient using a PC, keyboard, and computer mouse.
Basic knowledge of Outlook, Microsoft Word and Excel preferred.
Ability to walk, sit, stoop, and stand for long periods of time.
Ability to lift, move, push, or pull up to 25 pounds.
Parkway Bank is an Equal Opportunity Employer
Minority/Female/Disability/Veteran
</code></span></span>
现在让我们修改我们的 python代码以导入这些文件,摆脱 Boots 先生(你是一只好猫),并在输出中添加一些空格和一些换行符 () 以使内容更具可读性\n
。
<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-comment-color)"># chat_app/app.py
</span>
<span style="color:var(--syntax-error-color)">import</span> <span style="color:var(--syntax-text-color)">openai</span>
<span style="color:var(--syntax-error-color)">import</span> <span style="color:var(--syntax-text-color)">os</span>
<span style="color:var(--syntax-text-color)">openai</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">api_key</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">os</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">environ</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">get</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">'OPENAI_API_KEY'</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-text-color)">messages</span> <span style="color:var(--syntax-error-color)">=</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)">"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 review assistant. You will be provided information about a job candidate. that information might be in the form of a formatted resume, or just a sentence about themselves. You also may also receive a description of a job or position sought by the candidate. Your task as the assistant is to prompt the candidate for additional information they could add to their resume to make it better generally, and more well suited for the job they are seeking specifically. Don't shy away from asking and promoting transferable and soft skills."</span><span style="color:var(--syntax-text-color)">},</span>
<span style="color:var(--syntax-text-color)">]</span>
<span style="color:var(--syntax-declaration-color)">with</span> <span style="color:var(--syntax-text-color)">open</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"resume.txt"</span><span style="color:var(--syntax-text-color)">)</span> <span style="color:var(--syntax-declaration-color)">as</span> <span style="color:var(--syntax-text-color)">f</span><span style="color:var(--syntax-text-color)">:</span>
<span style="color:var(--syntax-text-color)">resume</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">f</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">readlines</span><span style="color:var(--syntax-text-color)">()</span>
<span style="color:var(--syntax-text-color)">messages</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">append</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)">f</span><span style="color:var(--syntax-string-color)">"Candidate information: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-string-color)">''</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">join</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">resume</span><span style="color:var(--syntax-text-color)">)</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">})</span>
<span style="color:var(--syntax-declaration-color)">with</span> <span style="color:var(--syntax-text-color)">open</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"jd.txt"</span><span style="color:var(--syntax-text-color)">)</span> <span style="color:var(--syntax-declaration-color)">as</span> <span style="color:var(--syntax-text-color)">f</span><span style="color:var(--syntax-text-color)">:</span>
<span style="color:var(--syntax-text-color)">jd</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">f</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">readlines</span><span style="color:var(--syntax-text-color)">()</span>
<span style="color:var(--syntax-text-color)">user_input</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"Description of the job they want: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-string-color)">''</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">join</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">jd</span><span style="color:var(--syntax-text-color)">)</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">"</span>
<span style="color:var(--syntax-declaration-color)">while</span> <span style="color:var(--syntax-text-color)">user_input</span> <span style="color:var(--syntax-error-color)">not</span> <span style="color:var(--syntax-error-color)">in</span> <span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-string-color)">"exit"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">"Exit"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">"quit"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">"Quit"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">"stop"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">"Stop"</span><span style="color:var(--syntax-text-color)">]:</span>
<span style="color:var(--syntax-text-color)">messages</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">append</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-text-color)">user_input</span> <span style="color:var(--syntax-text-color)">})</span>
<span style="color:var(--syntax-text-color)">completion</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">openai</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">ChatCompletion</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">create</span><span style="color:var(--syntax-text-color)">(</span>
<span style="color:var(--syntax-text-color)">model</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-string-color)">"gpt-3.5-turbo"</span><span style="color:var(--syntax-text-color)">,</span>
<span style="color:var(--syntax-text-color)">messages</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">messages</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-text-color)">assistant_response</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">completion</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">choices</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-literal-color)">0</span><span style="color:var(--syntax-text-color)">].</span><span style="color:var(--syntax-text-color)">message</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">content</span>
<span style="color:var(--syntax-text-color)">messages</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">append</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-text-color)">assistant_response</span> <span style="color:var(--syntax-text-color)">})</span>
<span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-literal-color)">\n</span><span style="color:var(--syntax-string-color)">Assistant:</span><span style="color:var(--syntax-literal-color)">\n</span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">assistant_response</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-literal-color)">\n</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-text-color)">user_input</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">input</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"User:</span><span style="color:var(--syntax-literal-color)">\n</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"Assistant: GoodBye"</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>⚡ python app.py
Assistant:
Thank you for sharing your experience, Jimmy. Based on the requirements listed for the Bank Teller position at Parkway Bank, here are some potential areas you could add to your resume to make it more relevant to the job:
- Highlight your experience with cash handling, as it is an important requirement for the job.
- Include any instances where you excelled in customer service, as providing quality customer service is one of the main responsibilities of a bank teller.
- Be sure to mention your proficiency with basic computer programs such as Microsoft Word and Excel, as well as your ability to learn new systems quickly.
- Detail how you have been able to work varied hours or extended shifts in the past, as this is a requirement for the position.
- Are there any sales or referral goals you have met in previous jobs? If so, including that information on your resume would be helpful since tellers are expected to refer sales opportunities to the appropriate staff at Parkway Bank.
Additionally, Parkway Bank seeks individuals who are detail oriented and possess good math and clerical skills. Can you think of any instances where you have been especially detail-oriented or when you have had to use your math skills on the job? These could be good examples to include on your resume.
User:
Im really great and really qualified in all of those things. add them to my resume and show me what that resume would look like.
Assistant:
Certainly, Jimmy! Here's a revised version of your resume that incorporates your qualifications, experience, and the requirements from the job description:
**Jimmy Jimbert**
**Experience**
Old Navy | Team Member | 3/15/2022 - Present
- Assisted customers with product inquiries, fitting room requests, and checkout procedures.
- Maintained store appearance by restocking merchandise and organizing displays.
McDonald's | Crew Member | 5/20/2020 - 3/1/2022
- Prepared food and drinks, operated cash register, maintained cleanliness of the restaurant.
- Provided exceptional customer service and resolved customer concerns.
**Education**
High School Diploma | XYZ High School | Graduated June 2020
**Skills**
- Cash handling: Proficient in accurately counting, verifying, and processing cash transactions.
- Customer service: Able to provide friendly, efficient service and resolve customer concerns.
- Sales and referral: Consistently met or exceeded sales goals and referred opportunities to appropriate staff.
- Math and clerical skills: Possess strong skills in performing basic math calculations and maintaining accurate records.
- Computer proficiency: Proficient in using Microsoft Word, Excel, and Outlook.
- Detail-oriented: Meticulous when handling customer transactions and maintaining records.
- Flexible: Able to work varied hours and days as needed.
I hope this helps! Let me know if there's anything else I can do for you.
User:
exit
Assistant: GoodBye
</code></span></span>
好吧,这很整洁。它能够填补吉米的典型经验,并以我认为大多数人都可以声称的方式触及所有要求,而不会感觉自己在撒谎。
接下来我们将把这个应用程序部署到云端!