无服务器AI代理搭建:生成冷邮件助力求职者获取理想工作 原创

发布于 2025-3-7 08:26
浏览
0收藏

冷邮件(cold email:是一种未经对方事先许可或请求,主动向潜在客户或雇主、合作伙伴等发送的商业电子邮件,目的通常是为了推销产品、求助、服务或建立业务联系等)在求职过程中能够发挥重要作用,然而,撰写一封堪称完美的冷邮件却颇为耗时。你不仅需要精准地将自身技能与职位描述相匹配,还要拿捏好恰当的邮件语气,并且往往需要反复修改——这无疑是一项繁重的工作。

本指南将指导你使用Langbase的无服务器内存代理,构建冷邮件生成器代理,从而实现整个冷邮件撰写流程的自动化。我们会把内存代理集成至一个Node.js项目中,使其具备读取简历、剖析职位描述的能力,并能在短短几秒内,为你生成一封个性化且极具影响力的冷邮件。

目录

1. 大语言模型(LLMs)的无状态属性

2. 内存代理(Memory Agents)定义

3. 先决条件

4. 参考架构

5. 步骤 1:创建一个目录并初始化npm

6. 步骤 2:创建一个无服务器的管道代理

7. 步骤 3:添加一个.env文件

8. 步骤 4:创建一个无服务器的内存代理

9. 步骤 5:向内存代理中添加文档

10. 步骤 6:生成内存嵌入

  • 理解内存嵌入
  • 如何生成嵌入?

11. 步骤 7:在管道代理中集成内存

12. 步骤 8:在Node.js中集成内存代理

13. 步骤 9:启动BaseAI服务器

14. 步骤 10:运行内存代理

15. 最终呈现

大语言模型(LLMs)的无状态属性

大语言模型(LLMs)具有无状态属性,这是因为它们不会留存任何有关先前交互的记忆,也不会保留过去查询的上下文信息,仅处理会话中输入的内容。每次大语言模型处理提示时,都是针对该特定提示进行操作,不会受到任何先前提示历史记录的影响。

这种无状态特性使得模型能够将每个请求都视作独立的个体,进而简化了模型的架构与训练流程。然而这也意味着,倘若缺乏诸如检索增强生成(RAG)或长期内存等机制,大语言模型便无法将信息从一次交互传递至下一次交互。

为了使交互具备连续性或引入上下文信息,开发人员可通过实现外部系统来管理并注入上下文,但模型自身在不同请求之间不会“记住”任何内容 。  

解决方案

通过集成Langbase的内存代理(Memory Agents),我们能够为大语言模型赋予长期内存功能。这使得模型可以动态地存储、检索并运用信息,从而让大语言模型在实际应用场景中发挥更大的作用。

内存代理(Memory Agents)定义

Langbase 的无服务器内存代理(作为一种长期内存解决方案),其设计目标旨在实现信息的无缝获取、处理、存储以及检索。这些代理能够将私有数据动态地关联到任何大语言模型上,进而在实时交互中实现具备上下文感知能力的响应,并有效减少模型“幻觉”现象的出现。

这些代理融合了矢量存储、检索增强生成(RAG)以及互联网访问功能,构建出强大的托管上下文搜索 API。开发人员能借此打造出更智能、功能更卓越的人工智能(AI)应用程序。

在检索增强生成(RAG)的设置环境中,当内存直接与Langbase 管道代理(Pipe Agent)相连接时,便形成了内存代理。这种组合方式让大语言模型得以获取相关数据,并给出精确且上下文准确的回答,成功克服了大语言模型在处理私有数据方面存在的局限性。

内存代理能够确保本地内存存储的安全性。用于生成内存嵌入的数据会得到妥善保护,在安全的环境中进行处理,并且只有在经过明确配置的情况下,才会将数据发送至外部。同时,通过 API 密钥对访问权限进行严格管控,切实保障敏感信息的安全。

需注意的是,管道是一个无服务器AI代理,它有自己的代理内存和工具。

先决条件

在开始创建冷邮件生成器代理之前,你需要完成以下设置并准备好相应工具。

在本教程中,我将采用以下技术栈:

  • BaseAI:这是一个用于在本地构建AI代理的Web框架。
  • Langbase:该平台用于构建和部署无服务器AI代理。
  • OpenAI:借助它来获取首选模型的大语言模型密钥 。

此外,你还需进行以下操作:

  • 在Langbase平台完成注册,以此获取API密钥。
  • 在OpenAI平台注册,进而生成你所使用模型的大语言模型密钥(在本次演示中,我将使用GPT - 4o mini)。你可在此处生成密钥。

参考架构

以下以图解形式呈现构建无服务器AI代理以生成工作申请冷邮件的完整流程:

无服务器AI代理搭建:生成冷邮件助力求职者获取理想工作-AI.x社区

让我们开始构建代理吧!

步骤 1:创建一个目录并初始化npm

若要着手创建用于为职位空缺生成冷电子邮件的无服务器 AI 代理,你需在本地计算机上创建一个目录,并在该目录中安装所有相关的开发依赖项。你可通过定位到该目录,并在终端中运行以下命令来完成此项操作:

mkdir my-project
npm init -y
npm install dotenv

此命令会在项目目录中创建一个带有默认值的 package.json 文件。同时,它还会安装 dotenv 包,以便从.env 文件中读取环境变量。  

步骤 2:创建一个无服务器的管道代理(Pipe Agent)

接下来,我们将创建一个管道代理。管道代理与其他代理有所不同,因其属于配备代理工具的无服务器AI代理,能够与任何编程语言或框架协同工作。它们部署简便,仅需一个 API,便能将250多个大语言模型与任何数据进行连接,从而能构建出任何开发人员所需的API工作流程。

若要创建你的AI管道代理,请先点进项目目录。运行以下命令:

npx baseai@latest pipe

运行后,你将看到以下提示信息:

BaseAI is not installed but required to run. Would you like to install it? Yes/No
Name of the pipe? email-generator-agent
Description of the pipe? Generates emails for your dream job in seconds
Status of the pipe? Public/Private
System prompt? You are a helpful AI assistant

当你完成对 AI 代理管道的名称、描述及状态的设置后,系统会自动为你完成所有相关配置。你的管道将成功创建于 /baseai/pipes/email-generator-agent.ts 路径下。

步骤 3:添加一个.env文件

在项目的根目录下创建一个名为.env 的文件,并在该文件中添加 OpenAI 和 Langbase 的 API 密钥。你可从此处获取你的 Langbase API 密钥 。  

步骤 4:创建一个无服务器的内存代理

接下来,我们要创建一个内存模块,随后将其附加到管道(Pipe)中,从而使其成为一个具备内存功能的代理。要实现这一点,请在你的终端中运行以下命令:

npx baseai@latest memory

运行此命令后,你将得到以下提示信息:

Name of the memory? email-generator-memory
Description of the memory? Contains my resume
Do you want to create memory from the current project git repository? Yes/No

在此操作完成后,所有设置将自动为你完成。届时,你可以访问成功创建在 /baseai/memory/email-generator-memory.ts 路径下的内存。  

步骤 5:向内存代理中添加文档

在 /baseai/memory/email-generator-memory.ts 文件所在的目录中,你会看到另一个名为“documents”的文件夹。此文件夹是用于存储期望 AI 代理能够访问的文件的位置。请将你的简历保存为.pdf 或.txt 文件。之后,你需要将其转换为 markdown 文件,并将转换后的文件放置在/baseai/memory/email-generator-memory/documents目录中。

此步骤能够确保内存代理具备处理和检索文档中信息的能力,进而让AI代理依据所附简历里呈现的经验与技能,生成精准的冷邮件。  

步骤 6:生成内存嵌入

将文档添加到内存之后,接下来的步骤是生成内存嵌入。不过在此之前,请允许我简要解释一下什么是嵌入,以及它们为何如此重要。

理解内存嵌入

内存嵌入是文档的一种数字表征形式,它能让AI理解文本中的上下文、关系以及含义。这些嵌入如同桥梁一般,把原始数据转化为人工智能能够处理的结构化数据格式,以便进行语义搜索与检索。

倘若没有嵌入,AI代理便无法有效地将用户的查询与相关内容建立联系。生成嵌入的过程会创建一个可搜索的索引,借助这个索引,内存代理就能高效地给出准确且具备上下文感知能力的响应。  

如何生成嵌入

若要为你的文档生成嵌入,请在终端中运行以下命令:

npx baseai@latest embed -m email-generator-memory

你的内存现已准备就绪,可与管道(即内存代理)进行连接。通过这一连接,你的 AI 代理便能从你的文档中获取精准的、基于上下文理解的响应。  

步骤 7:在管道代理中集成内存

接下来,你需要将创建好的内存附加到管道(Pipe)代理上,以使其成为一个内存代理。要实现这一点,请转到 /baseai/pipes/email-generator-agent.ts 文件。以下是该文件目前的内容:

import { PipeI } from '@baseai/core';

const pipePipeWithMemory = (): PipeI => ({
    apiKey: process.env.LANGBASE_API_KEY!, // Replace with your API key https://langbase.com/docs/api-reference/api-keys
    name: 'email-generator-agent',
    description: 'Generates emails for your dream job in seconds',
    status: 'public',
    model: 'openai:gpt-4o-mini',
    stream: true,
    json: false,
    store: true,
    moderate: true,
    top_p: 1,
    max_tokens: 1000,
    temperature: 0.7,
    presence_penalty: 1,
    frequency_penalty: 1,
    stop: [],
    tool_choice: 'auto',
    parallel_tool_calls: false,
    messages: [
        { role: 'system', content: You are a helpful AI assistant. }],
    variables: [],
    memory: [],
    tools: []});
export default pipePipeWithMemory;

现在,需将内存集成到管道中。具体做法是在文件顶部导入内存,并将其作为内存数组中的函数进行调用。此外,还需在messages内容中添加以下内容:

Based on the job description and my resume attached, write a compelling cold email tailored to the job, highlighting my most relevant skills, achievements, and experiences. Ensure the tone is professional yet approachable, and include a strong call to action for a follow-up or interview.

完成上述所有操作后,代码如下所示:

import { PipeI } from '@baseai/core';
import emailGeneratorMemoryMemory from '../memory/email-generator-memory';

const pipeEmailGeneratorAgent = (): PipeI => ({
 // Replace with your API key https://langbase.com/docs/api-reference/api-keys
 apiKey: process.env.LANGBASE_API_KEY!,
 name: 'email-generator-agent',
 description: 'Generates emails for your dream job in seconds',
 status: 'private',
 model: 'openai:gpt-4o-mini',
 stream: true,
 json: false,
 store: true,
 moderate: true,
 top_p: 1,
 max_tokens: 1000,
 temperature: 0.7,
 presence_penalty: 1,
 frequency_penalty: 1,
 stop: [],
 tool_choice: 'auto',
 parallel_tool_calls: true,
 messages: [{ role: 'system', content: Based on the job description and my resume attached, write a compelling cold email tailored to the job, highlighting my most relevant skills, achievements, and experiences. Ensure the tone is professional yet approachable, and include a strong call to action for a follow-up or interview. }],
 variables: [],
 memory: [emailGeneratorMemoryMemory()],
 tools: []});

export default pipeEmailGeneratorAgent;

步骤 8:在Node.js中集成内存代理

我们将创建的内存代理集成到Node.js项目中,从而为所附文档创建一个交互式命令行界面(CLI)。该Node.js项目将作为测试内存代理以及与内存代理进行交互的基础(在本教程开篇,我们通过初始化npm设置了一个Node.js项目)。

现在,创建一个index.ts文件:

touch index.ts

在这个TypeScript文件里,导入你之前创建的管道代理。我们会借助@baseai/core里的管道原语(pipe primitive:是一种系统接口,允许进程间通信和数据交换。它是一个单向的数据流通道,一个进程写入数据,另一个进程从中读取数据)来运行该管道。

请将以下代码添加至 index.ts 文件中:

import 'dotenv/config';
import { Pipe } from '@baseai/core';
import inquirer from 'inquirer';import ora from 'ora';
import chalk from 'chalk';
import pipeEmailGeneratorAgent from './baseai/pipes/email-generator-agent';
const pipe = new Pipe(pipeEmailGeneratorAgent());
async function main() {

   const initialSpinner = ora('Conversation with Memory agent...').start();
   try {
       const { completion: calculatorTool} = await pipe.run({
           messages: [{ role: 'user', content: 'Hello' }],
       });
       initialSpinner.stop();
       console.log(chalk.cyan('Report Generator Agent response...'));
       console.log(calculatorTool);
   } catch (error) {
       initialSpinner.stop();
       console.error(chalk.red('Error processing initial request:'), error);
   }

   while (true) {
       const { userMsg } = await inquirer.prompt([
           {
               type: 'input',
               name: 'userMsg',
               message: chalk.blue('Enter your query (or type "exit" to quit):'),
           },
       ]);

       if (userMsg.toLowerCase() === 'exit') {
           console.log(chalk.green('Goodbye!'));
           break;
       }

       const spinner = ora('Processing your request...').start();

       try {
           const { completion: reportAgentResponse } = await pipe.run({
               messages: [{ role: 'user', content: userMsg }],
           });

           spinner.stop();
           console.log(chalk.cyan('Agent:'));
           console.log(reportAgentResponse);
       } catch (error) {
           spinner.stop();
           console.error(chalk.red('Error processing your request:'), error);
       }
   }}
main();
导入 'dotenv/config';import { Pipe } from '@baseai/core';import inquirer from 'inquirer';import ora from 'ora';从 'chalk' 导入 chalk;import pipeEmailGeneratorAgent from './baseai/pipes/email-generator-agent'; const pipe = new Pipe(pipeEmailGeneratorAgent()); async function main() { const initialSpinner = ora('与内存代理的对话...').start();   try { const { completion: calculatorTool} = await pipe.run({ messages: [{ role: 'user', content: 'Hello' }], });       初始Spinner.stop();       console.log(chalk.cyan('Report Generator Agent 响应...'));       console.log(calculatorTool);   } catch (错误) { initialSpinner.stop();       console.error(chalk.red('处理初始请求时出错:'), error);   } while (true) { const { userMsg } = await inquirer.prompt([ { type: 'input', name: 'userMsg', message: chalk.blue('输入你的查询(或键入 “exit” 退出):'), }, ]);         if (userMsg.toLowerCase() === 'exit') { console.log(chalk.green('Goodbye!'));           破;       } const spinner = ora('正在处理你的请求...').start();         try { const { completion: reportAgentResponse } = await pipe.run({ messages: [{ role: 'user', content: userMsg }], });             spinner.stop();           console.log(chalk.cyan('代理:'));           console.log(reportAgentResponse);       } catch (错误) { spinner.stop();           console.error(chalk.red('处理你的请求时出错:'), error);       } } } main();

这段代码创建了一个交互式命令行界面(CLI),用于与 AI 代理进行聊天,它利用 @baseai/core 库中的管道来处理用户输入。以下是具体的运行流程:

  • 导入必要库:代码首先导入了多个必要的库。其中,dotenv用于环境配置,inquirer用于获取用户输入,ora用于展示加载微调器,chalk用于实现彩色输出。请务必首先在终端中使用以下命令安装这些库:npm install ora inquirer。
  • 创建管道对象:使用 BaseAI 库中名为 email-generator-agent的预定义内存,创建一个管道对象。

main() 函数中的操作:

  • 启动交互:在main()函数中,当与AI代理的初始对话启动时,旋转图标会随之启动,并显示 “Hello” 消息。
  • 显示响应:将显示来自 AI 的响应。
  • 循环交互:通过循环持续要求用户输入,并将用户的查询发送给 AI 代理。
  • 每次接收到 AI 的响应后,便会将其显示出来,这一过程会一直持续,直至用户输入 “exit”。

步骤 9:启动BaseAI服务器

要在本地运行内存代理,你需要先启动 BaseAI 服务器。在终端中运行以下命令:

npx baseai@latest dev

步骤 10:运行内存代理

使用以下命令运行index.ts文件:

npx tsx index.ts

最终呈现

在你的终端中,系统会提示“输入你的查询”。例如,我们可以粘贴一份职位描述,然后要求系统基于我们这边的情况生成一封表达求职兴趣的电子邮件。系统也会给出带有正确来源或引用说明的回应。

通过这样的设置,我们便成功搭建了一个冷邮件生成代理(Cold Email Generator agent)。该代理借助大语言模型以及Langbase内存代理的强大功能,有效克服了大语言模型的局限性,确保生成准确的响应,且不会在处理私人数据时出现虚构信息的情况。   

以下是最终结果的演示:

无服务器AI代理搭建:生成冷邮件助力求职者获取理想工作-AI.x社区

译者介绍

刘涛,51CTO社区编辑,某大型央企系统上线检测管控负责人。

原文标题:How to build a serverless AI agent to generate cold emails for your dream job,作者:Maham Codes

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2025-3-7 08:32:22修改
收藏
回复
举报
回复
相关推荐