96SEO 2026-04-26 11:51 3
我们对于人工智Neng的期待早Yi超越了简单的“一问一答”。试想一下Ru果你的AI助手不仅Neng陪你谈古论今还Neng帮你处理繁琐的数据库记录、定时发送邮件提醒,甚至在深夜自动检索网络信息,那将是怎样一种体验?这不再是科幻电影里的桥段,而是我们今天要亲手构建的现实。本文将带你深入探索如何利用NestJS的稳健架构与LangChain的强大编排Neng力,打造一个具备工具调用与定时任务功Neng的AI智Neng体。

我们要构建的不仅仅是一个聊天机器人,而是一个具备“行动力”的Agent。这需要我们将大语言模型与具体的业务逻辑进行深度绑定。在这个过程中,NestJS提供了极佳的模块化支持,而LangChain则负责让模型理解何时以及如何调用这些工具。
我们需要搭建起项目的骨架。这不仅仅是安装几个依赖包那么简单,geng像是在为一位即将诞生的数字生命构建神经系统。我们需要配置好环境变量,确保API Key的安全,同时引入必要的依赖库。
OPENAI_API_KEY=sk-xxx
OPENAI_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
MODEL_NAME=qwen-plus
在根目录创建 `.env` 模块是工程化的第一步,它将敏感信息与代码逻辑解耦。接着,我们在 `AppModule` 中配置全局的 `ConfigModule`,这是整个系统配置的基石。
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { AiModule } from './ai/ai.module';
import { ConfigModule } from '@nestjs/config';
@Module({
imports: ,
controllers: ,
providers: ,
})
export class AppModule {}
二、 赋予AI“双手”:工具调用的实现
工具调用是让AI从“嘴强王者”转变为“实干家”的关键。我们需要定义一系列工具,比如发送邮件、网络搜索、数据库操作等,并将它们注册到LangChain的模型中。
1. 邮件发送Neng力想象一下当AI分析出你需要发送一封重要邮件时它Neng自动调用SMTP服务完成发送。为了实现这一点,我们需要集成 `@nestjs-modules/mailer`。配置过程虽然略显繁琐,涉及到SMTP主机、端口以及授权码的设置,但一旦配置完成,后续的调用将变得异常优雅。
MAIL_HOST=smtp.qq.com
MAIL_PORT=587
MAIL_SECURE=false
MAIL_USER=
MAIL_PASS=your_authorization_code
MAIL_FROM="No Reply" <>
在代码层面我们通过 `useFactory` 模式创建一个 `SEND_MAIL_TOOL`。这个工具封装了 `mailerService.sendMail` 的逻辑,并定义了清晰的Zod Schema,确保AI知道需要哪些参数才Neng触发此功Neng。
{
provide: 'SEND_MAIL_TOOL',
useFactory: => {
return tool(
async => {
await mailerService.sendMail({
to,
subject,
text: text ?? '没有文本内容',
html: html ?? `${text ?? ''}
`,
from: configService.get,
});
},
{
name: 'send_mail',
description: '发送邮件工具,参数包括收件人邮箱、邮件主题和邮件内容',
schema: z.object({
to: z.email.describe,
subject: z.string.describe,
text: z.string.optional.describe,
html: z.string.optional.describe,
}),
},
);
},
inject: ,
},
2. 网络搜索的视野
AI的知识库虽然庞大,但往往存在滞后性。为了让助手获取实时信息,我们集成了博查的Web Search API。这就像是给AI装上了一双随时Ke以浏览互联网的眼睛。通过 `fetch` 请求,我们将搜索结果格式化后返回给模型,使其Neng够基于Zui新数据回答问题。
{
provide: 'WEB_SEARCH_TOOL',
useFactory: => {
return tool(
async => {
const boChaUrl = 'https://api.bochaai.com/v1/web-search';
// ... 请求逻辑 ...
const formatted_results = webpages
.map => {
return `引用: ${idx + 1}
标题: ${page.name}
URL: ${page.url}
摘要: ${page.summary}`;
})
.join;
return formatted_results;
},
// ... schema 定义 ...
);
},
inject: ,
},
3. 数据库操作的掌控
对于企业级应用而言,Neng够读写数据库是核心Neng力。我们使用 TypeORM 来管理 MySQL 数据库。为了让AINeng够操作用户表,我们定义了一个 `db_users_crud` 工具。这个工具支持增删改查操作,并通过 `action` 参数来区分具体行为。
这里有一个细节值得玩味:我们在 `ToolModule` 中注入了 `UsersModule`,这体现了NestJS依赖注入的强大之处。AI不再是一个孤立的存在它Ke以直接操作业务数据层。
{
provide: 'DB_USERS_CRUD_TOOL',
useFactory: => {
return tool(
async => {
switch {
case 'create': {
if {
return '创建用户时name 和 email 是必填的';
}
const users = await usersService.create;
return `用户创建成功,ID: ${users.id}, Name: ${users.name}, Email: ${users.email}`;
}
// ... 其他 case 处理 ...
}
},
// ... schema 定义 ...
);
},
inject: ,
},
三、 赋予AI“时间感”:定时任务系统的构建
Ru果说工具调用赋予了AI空间上的行动力,那么定时任务则赋予了它时间上的感知力。我们希望AI不仅Neng响应指令,还Neng在特定的时间点自主执行任务。这需要一个健壮的调度系统。
我们设计了三种任务模式:`cron`、`every`、`at`。为了管理这些任务,我们创建了 `Job` 实体,并利用 NestJS 的 `ScheduleModule` 结合 `cron` 库来实现调度。
@Entity
export class Job {
@PrimaryGeneratedColumn
id: string;
@Column
instruction: string;
@Column
type: JobType;
// ... 其他字段定义 ...
}
在 `JobService` 中,`startRuntime` 方法是核心引擎。它会根据任务类型动态注册调度器。例如对于 `cron` 任务,它会创建一个 `CronJob` 实例;对于 `every` 任务,则使用 `setInterval`。这种动态注册机制非常灵活,允许我们在运行时通过AI指令添加新任务。
private startRuntime {
if {
const cronJobs = this.schedulerRegister.getCronJobs;
const existingFlag = cronJobs.get;
if {
existingFlag.start;
return;
}
const newCronJob = new CronJob => {
this.logger.log;
await this.entityManager.update });
});
this.schedulerRegister.addCronJob;
newCronJob.start;
return;
}
// ... 其他类型处理 ...
}
geng有趣的是我们将这个任务管理功Neng本身也封装成了一个工具 `job_tool`。这意味着,你Ke以直接用自然语言告诉AI:“每隔10秒发邮件到我的邮箱提醒我走动”,AI会解析这段话,计算出 `everyMs`,并调用 `job_tool` 将其注册到调度器中。这种“用魔法打败魔法”的设计,极大地提升了系统的自动化程度。
四、 智Neng体的核心循环:流式响应与决策有了工具和时间管理Neng力,我们需要一个核心的大脑来协调这一切。这就是 `AiService` 和 `JobAgentService` 的职责。
在处理用户请求时我们采用了Agent Loop模式。模型 生成一个响应,Ru果其中包含工具调用,系统会拦截并执行这些工具,然后将结果反馈给模型,让其继续思考,直到Zui终给出答案。
async runJob: Promise {
const messages: BaseMessage = ;
while {
const aiMessage = await this.modelWithTools.invoke;
messages.push;
const toolCalls = aiMessage.tool_calls ?? ;
if {
return String;
}
for {
// 执行工具并将结果推入消息历史
if {
const result = await this.sendMailTool.invoke;
messages.push);
} // ... 其他工具处理 ...
}
}
}
为了提升用户体验,我们还实现了流式接口。相比于传统的同步等待,流式输出让用户Neng实时kan到AI的“思考”过程,这种交互感要强烈得多。在 `AIController` 中,我们通过 `Observable` 将流式数据转换为SSE事件推送到前端。
@Sse
chatStream query: string) {
const stream = this.aiService.runChainStream;
const result = from.pipe => ));
return result;
}
通过构建这样一个系统,我们实际上是在探索人机协作的新边界。AI不再是被动的问答机器,而是变成了具备主动执行Neng力的智Neng伙伴。它Neng理解你的意图,调用外部API,操作数据库,甚至管理自己的时间表。
当然这只是一个开始。在未来的迭代中,我们Ke以引入geng复杂的记忆机制,让AI记住用户的偏好;或者增加多模态支持,让它Neng处理图片和音频。但无论如何,核心的架构思想——即通过LangChain连接大模型与业务逻辑,通过NestJS提供稳健的后端支撑——是不会变的。
当你kan到控制台输出“执行定时任务:提醒我喝水”,或者邮箱里准时收到AI整理好的周报时你会深刻地感受到:代码是有温度的,而AI,正在让我们的生活变得geng加美好。希望这篇教程Neng激发你的灵感,去打造属于你自己的智Neng助手。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback