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

之前我们制作了一个简洁的小命令行工具,可以用来帮助我们构建更好的简历。现在我们将该应用程序部署到云中!

我将使用 AWS CDK,因为我喜欢它,而且它使此类事情变得相对简单。如果愿意,您当然可以将这些说明改编为 Terraform。首先让我们开始一个 CDK 项目,然后我们可以讨论我们需要为项目的这一部分提供什么。

启动一个新的CDK项目

创建一个新的项目目录和cdk init项目。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">mkdir </span>resume-assistant
<span style="color:var(--syntax-text-color)">cd </span>resume-assistant
cdk init app <span style="color:var(--syntax-error-color)">--language</span> python
</code></span></span>

设置虚拟环境并安装软件包。

<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>

现在我们已经设置了存储库,以下是我们要放入其中的内容。

  1. 包含 Lambda 代码的目录(我们将对其进行一些修改)
  2. 用于创建 S3 存储桶来存储我们的对话“状态”的 CDK 代码
  3. 用于创建 Lambda 函数来运行我们的代码的 CDK 代码
  4. CDK代码创建一个函数URL以便我们可以调用该函数

让我们开始吧!

Python 应用程序的新栖息地

在 CDK 存储库的根目录中创建一个名为的新文件夹,并从我们之前会话的目录中chat_lambda复制您的文件app.pyrequirements.txt文件。chat_app

我们本质上是分叉这些代码,并将以不同的方式修改它们中的每一个,以达到我们想要的目标。chat_lambdaCDK 将被告知 lambda 函数的代码所在的目录。假设您正在运行 docker(确保您正在运行 docker),CDK 将根据您指定的运行时创建一个容器,在requirements.txt 中安装依赖项,添加您的代码,然后将整个内容压缩并将其部署为拉姆达函数。它太酷了。让我们开始 Lambda-fying 我们的代码。

首先,由于最近的一些原因,我们需要减少

lambda_handler传统规定我们通过带有一些参数(特别是参数)的方法进入函数event。让我们重构lambda_handler并期望我们要发送的请求将位于bodyevent

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-comment-color)"># chat_lambda/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-error-color)">import</span> <span style="color:var(--syntax-text-color)">json</span>
<span style="color:var(--syntax-error-color)">import</span> <span style="color:var(--syntax-text-color)">logging</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)">logger</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">logging</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">getLogger</span><span style="color:var(--syntax-text-color)">()</span>
<span style="color:var(--syntax-text-color)">logger</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">setLevel</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">logging</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">INFO</span><span style="color:var(--syntax-text-color)">)</span>


<span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">lambda_handler</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">event</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">context</span><span style="color:var(--syntax-text-color)">):</span>
    <span style="color:var(--syntax-text-color)">logger</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">info</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">event</span><span style="color:var(--syntax-text-color)">)</span>

    <span style="color:var(--syntax-text-color)">payload</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">json</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">loads</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">event</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-string-color)">"body"</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)">payload</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-string-color)">"resume"</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)">payload</span><span style="color:var(--syntax-text-color)">[</span><span style="color:var(--syntax-string-color)">"jd"</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 transferrable 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-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)">resume</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)">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)">"Description of the job they want: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">jd</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)">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)">)</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)">logger</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">info</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)">return</span> <span style="color:var(--syntax-text-color)">{</span>
        <span style="color:var(--syntax-string-color)">"statusCode"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-literal-color)">200</span><span style="color:var(--syntax-text-color)">,</span>
        <span style="color:var(--syntax-string-color)">"headers"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-text-color)">{</span>
            <span style="color:var(--syntax-string-color)">"Access-Control-Allow-Headers"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-string-color)">"*"</span>
        <span style="color:var(--syntax-text-color)">},</span>
        <span style="color:var(--syntax-string-color)">"body"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-text-color)">json</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">dumps</span><span style="color:var(--syntax-text-color)">({</span>
            <span style="color:var(--syntax-string-color)">"message"</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-text-color)">}</span>
</code></span></span>

所以您会注意到我们还添加了一些日志记录。因为它处于 INFO 级别,所以如果我们在本地运行它,我们将无法在 stdout 中看到它,但它会登录 Lambda 并在 CloudWatch 中可用,以帮助我们在做错了什么时进行故障排除。我们通常这样做!

您还会注意到,该函数将在事件正文中查找简历和工作描述作为 和 的值resumejd当我们调用这个函数时,我们需要确保提供它们。

最后,我们以一种实际上不允许我们继续对话的方式返回助理的响应。那将在以后出现。

S3 状态桶

桶很简单。我们将确保对象是加密且非公开的,并设置索引。因为我们只是玩玩,所以我们还将 和 设置removal_policyauto_delete_objects使清理更容易的值。我们将在函数本身之前进行此操作,以便我们可以将其标识作为环境变量传递给函数。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-comment-color)"># resume_assistant/resume_assistant_stack.py
</span>
<span style="color:var(--syntax-error-color)">from</span> <span style="color:var(--syntax-text-color)">aws_cdk</span> <span style="color:var(--syntax-error-color)">import</span> <span style="color:var(--syntax-text-color)">aws_s3</span> <span style="color:var(--syntax-declaration-color)">as</span> <span style="color:var(--syntax-text-color)">s3</span>
<span style="color:var(--syntax-error-color)">from</span> <span style="color:var(--syntax-text-color)">aws_cdk</span> <span style="color:var(--syntax-error-color)">import</span> <span style="color:var(--syntax-text-color)">RemovalPolicy</span>

<span style="color:var(--syntax-declaration-color)">class</span> <span style="color:var(--syntax-name-color)">ResumeAssistantStack</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">Stack</span><span style="color:var(--syntax-text-color)">):</span>
    <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">__init__</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">scope</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-text-color)">Construct</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">construct_id</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-text-color)">str</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-error-color)">**</span><span style="color:var(--syntax-text-color)">kwargs</span><span style="color:var(--syntax-text-color)">)</span> <span style="color:var(--syntax-error-color)">-></span> <span style="color:var(--syntax-text-color)">None</span><span style="color:var(--syntax-text-color)">:</span>
        <span style="color:var(--syntax-text-color)">super</span><span style="color:var(--syntax-text-color)">().</span><span style="color:var(--syntax-text-color)">__init__</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">scope</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">construct_id</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-error-color)">**</span><span style="color:var(--syntax-text-color)">kwargs</span><span style="color:var(--syntax-text-color)">)</span>

        <span style="color:var(--syntax-text-color)">chat_log_bucket</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">s3</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">Bucket</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">"ChatLogBucket"</span><span style="color:var(--syntax-text-color)">,</span>
            <span style="color:var(--syntax-text-color)">versioned</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">True</span><span style="color:var(--syntax-text-color)">,</span>
            <span style="color:var(--syntax-text-color)">encryption</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">s3</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">BucketEncryption</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">S3_MANAGED</span><span style="color:var(--syntax-text-color)">,</span>
            <span style="color:var(--syntax-text-color)">enforce_ssl</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">True</span><span style="color:var(--syntax-text-color)">,</span>
            <span style="color:var(--syntax-text-color)">block_public_access</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">s3</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">BlockPublicAccess</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">BLOCK_ALL</span><span style="color:var(--syntax-text-color)">,</span>
            <span style="color:var(--syntax-text-color)">removal_policy</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">RemovalPolicy</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">DESTROY</span><span style="color:var(--syntax-text-color)">,</span>
            <span style="color:var(--syntax-text-color)">auto_delete_objects</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">True</span><span style="color:var(--syntax-text-color)">,</span>
            <span style="color:var(--syntax-text-color)">public_read_access</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">False</span><span style="color:var(--syntax-text-color)">,</span>
        <span style="color:var(--syntax-text-color)">)</span>
</code></span></span>

__init__注意:将来对 CDK 代码的所有添加(减去模块导入)都将在类中的该函数内ResumeAssistantStack以与上述相同的缩进级别完成chat_log_bucket。因此,这意味着如果您复制并粘贴代码块,您将必须自己进行一些缩进。

拉姆达函数

这个应用程序的明星!我们需要重构函数代码主体(我们之前“分叉”的代码)中的一些东西,但首先,让我们在 CDK 中创建函数基础结构。要让 CDK 实际构建和打包 lambda,您需要使用 alpha 模块。

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

aws-cdk.aws-lambda-python-alpha
</code></span></span>

安装它

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code>pip <span style="color:var(--syntax-text-color)">install</span> <span style="color:var(--syntax-error-color)">-r</span> requirements.txt
</code></span></span>

现在您将能够在 CDK 代码中使用这两个模块。
我们还可以为您的 lambda 添加读取和写入最后一个存储桶的权限。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-comment-color)"># resume_assistant/resume_assistant_stack.py
</span>
<span style="color:var(--syntax-error-color)">from</span> <span style="color:var(--syntax-text-color)">aws_cdk</span> <span style="color:var(--syntax-error-color)">import</span> <span style="color:var(--syntax-text-color)">aws_lambda_python_alpha</span> <span style="color:var(--syntax-declaration-color)">as</span> <span style="color:var(--syntax-text-color)">p_lambda</span>
<span style="color:var(--syntax-error-color)">from</span> <span style="color:var(--syntax-text-color)">aws_cdk</span> <span style="color:var(--syntax-error-color)">import</span> <span style="color:var(--syntax-text-color)">aws_lambda</span> <span style="color:var(--syntax-declaration-color)">as</span> <span style="color:var(--syntax-text-color)">_lambda</span>
<span style="color:var(--syntax-error-color)">from</span> <span style="color:var(--syntax-text-color)">aws_cdk</span> <span style="color:var(--syntax-error-color)">import</span> <span style="color:var(--syntax-text-color)">Duration</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)">chat_lambda</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">p_lambda</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">PythonFunction</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">"ChatFunction"</span><span style="color:var(--syntax-text-color)">,</span>
    <span style="color:var(--syntax-text-color)">runtime</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">_lambda</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">Runtime</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">PYTHON_3_10</span><span style="color:var(--syntax-text-color)">,</span>
    <span style="color:var(--syntax-text-color)">timeout</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">Duration</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">seconds</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-literal-color)">60</span><span style="color:var(--syntax-text-color)">),</span>
    <span style="color:var(--syntax-text-color)">memory_size</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-literal-color)">256</span><span style="color:var(--syntax-text-color)">,</span>
    <span style="color:var(--syntax-text-color)">entry</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-string-color)">"chat_lambda"</span><span style="color:var(--syntax-text-color)">,</span>
    <span style="color:var(--syntax-text-color)">index</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-string-color)">"app.py"</span><span style="color:var(--syntax-text-color)">,</span>
    <span style="color:var(--syntax-text-color)">handler</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-string-color)">"lambda_handler"</span><span style="color:var(--syntax-text-color)">,</span>
    <span style="color:var(--syntax-text-color)">environment</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">{</span>
        <span style="color:var(--syntax-string-color)">"CHAT_LOG_BUCKET"</span><span style="color:var(--syntax-text-color)">:</span> <span style="color:var(--syntax-text-color)">chat_log_bucket</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">bucket_name</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)">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-string-color)">"empty"</span><span style="color:var(--syntax-text-color)">)</span>
    <span style="color:var(--syntax-text-color)">},</span>
<span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-text-color)">chat_log_bucket</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">grant_read_write</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">chat_lambda</span><span style="color:var(--syntax-text-color)">)</span>
</code></span></span>

上面的代码中有很多地方需要注意。首先,lambda 没有为其配置太多内存。这可能没问题。它实际上不会做太多计算,只是向 OpenAI 发送请求,然后传递响应。OPENAI_API_KEY其次,我们从本地环境变量进行设置,因为我将在本地构建和部署它,因此它可以访问我的环境变量。如果您打算从管道或其他东西构建和部署它,您必须确保您的管道也从管道秘密加载该值。

这是您第二次提醒请记住在 OpenAI 计费选项卡中为自己设置非常低的使用限制。您可能永远不会花费超过一美元左右,但如果您公开这一点,那么您就不会想要一个意外的账单。

函数地址

因为在很多情况下 OpenAI API 需要花费时间来响应我们(例如,当我们告诉它使用我们给它的所有上下文来解析完全格式化的简历时),我们不能使用API 网关在 29 秒后超时。我们将改用 Lambda 函数 URL。我们暂时将 CORS 保持打开状态,并确保输出该函数 URL。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-comment-color)"># resume_assistant/resume_assistant_stack.py
</span>
<span style="color:var(--syntax-error-color)">from</span> <span style="color:var(--syntax-text-color)">aws_cdk</span> <span style="color:var(--syntax-error-color)">import</span> <span style="color:var(--syntax-text-color)">aws_lambda</span> <span style="color:var(--syntax-declaration-color)">as</span> <span style="color:var(--syntax-text-color)">_lambda</span>
<span style="color:var(--syntax-error-color)">from</span> <span style="color:var(--syntax-text-color)">aws_cdk</span> <span style="color:var(--syntax-error-color)">import</span> <span style="color:var(--syntax-text-color)">CfnOutput</span>

<span style="color:var(--syntax-text-color)">function_url</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">chat_lambda</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">add_function_url</span><span style="color:var(--syntax-text-color)">(</span>
    <span style="color:var(--syntax-text-color)">auth_type</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">_lambda</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">FunctionUrlAuthType</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">NONE</span><span style="color:var(--syntax-text-color)">,</span>
    <span style="color:var(--syntax-text-color)">cors</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-color)">_lambda</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">FunctionUrlCorsOptions</span><span style="color:var(--syntax-text-color)">(</span>
        <span style="color:var(--syntax-text-color)">allowed_origins</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-text-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)">allowed_header
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值