从零构建 DeepSeek + LangChain 智能 Agent:实现联网搜索与投资决策分析
前言
本教程将带你从零构建一个具备联网搜索能力的智能 Agent,使用 DeepSeek 大模型作为推理引擎,LangChain 作为编排框架。
前置要求
| 依赖 | 版本/说明 |
|---|---|
| Node.js | 20.0+(LangChain v1 已弃用 Node 18) |
| DeepSeek API Key | 官网获取 |
| Tavily API Key | 官网获取,用于联网搜索 |
项目初始化
准备:已经安装了node,以及准备好有deepseekapi
# 创建并进入项目目录
mkdir my-first-agent && cd my-first-agent
# 初始化项目
npm init -y
# 安装核心依赖
npm install langchain @langchain/core @langchain/langgraph zod
npm install @langchain/openai # 兼容 DeepSeek 的 OpenAI 格式接口
npm install @langchain/tavily # 搜索工具
# 安装开发依赖
npm install -D typescript ts-node @types/node
# 初始化 TypeScript 配置
npx tsc --init
# 项目启动指令
npx tsx ./src/index.ts
项目目录
my-first-agent/
├── src/
│ ├── index.ts # Agent 主入口
│ ├── tools.ts # 工具定义
│ └── config.ts # 配置管理
├── .env # 环境变量
├── package.json
└── tsconfig.json
环境变量配置
创建 .env 文件:
# DeepSeek 配置
DEEPSEEK_API_KEY=your_deepseek_api_key_here
DEEPSEEK_API_BASE_URL=https://api.deepseek.com/v1
# Tavily 搜索配置
TAVILY_API_KEY=your_tavily_api_key_here
核心代码实现
1.工具定义(src/tools.ts)
import * as dotenv from "dotenv";
dotenv.config();
import { tool } from "@langchain/core/tools";
import { z } from "zod";
import { TavilySearch } from "@langchain/tavily";
// 创建一个简单的天气工具(模拟)
const weatherTool = tool(
async ({ location }) => {
// 这里通常是调用 API,现在我们返回模拟数据
return `2026年4月1日,${location} 的天气是:晴朗,25°C。`;
},
{
name: "get_weather",
description: "获取指定城市的实时天气",
schema: z.object({
location: z.string().describe("城市名称,例如:北京"),
}),
}
);
// 创建一个搜索工具实例
const searchTool = new TavilySearch({
// 注意:在 v1.2.0 中,有些版本要求 apiKey 放在外层,有些要求放在 fields 内
// 最标准的写法如下:
// apiKey: process.env.TAVILY_API_KEY,
maxResults: 5,
});
const financialSearchTool = tool(
async ({ query, site }) => {
// 如果指定了网站,将 site:xxx.com 加入查询语句
const fullQuery = site ? `${query} site:${site}` : query;
const result = await searchTool.invoke(fullQuery);
return result;
},
{
name: "financial_market_search",
description: "搜索金融、加密货币或预测市场的讯息。可以指定网站以获取更专业的数据。",
schema: z.object({
query: z.string().describe("具体的搜索关键词,例如:'以太坊 坎昆升级'"),
site: z.string().optional().describe("指定搜索的域名,例如:'polymarket.com' 或 'coindesk.com'"),
}),
}
);
// 导出工具数组给 Agent 使用
// export const tools = [searchTool];
export const tools = [ searchTool, financialSearchTool];
2. Agent 主入口 (src/index.ts)
import * as dotenv from "dotenv";
dotenv.config();
import { ChatOpenAI } from "@langchain/openai";
// 关键:改用 langgraph 的 createReactAgent
import { createReactAgent } from "@langchain/langgraph/prebuilt";
import { MemorySaver } from "@langchain/langgraph";
import { tools } from "./tools";
async function runAgent() {
const llm = new ChatOpenAI({
apiKey: process.env.DEEPSEEK_API_KEY,
modelName: "deepseek-chat",
configuration: {
baseURL: process.env.DEEPSEEK_API_BASE_URL,
},
temperature: 0,
});
const memory = new MemorySaver();
const systemMessage = `你是一个专业的投资分析助手。
你的任务是:
1. 搜索指定网站(如 Polymarket, Binance, Twitter)的最新讯息。
2. 对比不同平台的信息差,寻找套利方向(Arbitrage)。
3. 分析行业趋势,给出具体的投资建议。
4. 必须输出逻辑链:现状描述 -> 数据对比 -> 风险评估 -> 结论建议。`;
// --- 修复点:使用标准的 createReactAgent ---
const agent = createReactAgent({
llm,
tools, // 这里的 tools 包含了你的 TavilySearch
checkpointSaver: memory,
messageModifier: systemMessage,
});
console.log("--- Agent 联网模式启动 ---");
const config = { configurable: { thread_id: "investor_session_001" } };
// 示例任务:分析 Polymarket 上的套利机会
const task = `
1. 访问 Polymarket 搜索 "Nothing Ever Happens: April" 市场,记录其中关于 "WTI 原油突破 $200" 和 "美军进入伊朗" 的当前概率(价格)。
2. 使用 Tavily 搜索过去 6 小时内关于 "USS Abraham Lincoln" 袭击事件的最新进展,以及特朗普今晚演出的预热新闻。
3. 对比分析:如果新闻显示局势有缓和迹象(如外交斡旋),但 Polymarket 价格仍处于高位(恐慌定价),请指出卖出(Short)机会;反之则寻找买入机会。
`;
const result = await agent.invoke({
messages: [{ role: "user", content: task }],
}, config);
console.log("\n[分析报告]:\n");
console.log(result.messages[result.messages.length - 1].content);
}
runAgent().catch(console.error);
启动项目
# 开发模式(使用 tsx 支持 TypeScript 直接运行)
npx tsx src/index.ts
# 或先编译再运行
npx tsc
node dist/index.js
生成的分析报告(示例)
[分析报告]:
基于我收集到的信息,现在让我为您提供完整的分析报告:
## 投资分析报告:Polymarket与地缘政治套利机会
### 1. 现状描述
根据搜索结果,目前存在以下关键情况:
**Polymarket市场数据:**
- WTI原油突破$120/桶的概率:62%(截至6月底)
- WTI原油突破$110/桶的概率:83%
- WTI原油突破$105/桶的概率:92%
- 霍尔木兹海峡4月底恢复正常航运的概率:仅22%
- 冲突在5月中旬前结束的概率:36%(一周内下降18个百分点)
**地缘政治局势:**
- 特朗普总统于4月1日晚发表全国讲话,更新伊朗战争进展
- 美国海军林肯号航母战斗群在伊朗附近海域活动
- 伊朗继续发射导弹袭击,但特朗普声称伊朗新领导人已请求停火
- 全球石油库存已减少1.3亿桶,霍尔木兹海峡航运量降至正常水平的5%
### 2. 数据对比分析
**信息差识别:**
1. **Polymarket恐慌定价 vs 实际缓和信号**
- Polymarket显示:原油价格高企概率极高(92%突破$105)
- 实际新闻:特朗普暗示战争可能"很快结束",伊朗新领导人请求停火
- 信息差:市场仍处于恐慌定价,但外交信号显示可能缓和
2. **时间窗口套利机会**
- 短期(4月底):霍尔木兹海峡恢复概率仅22%
- 中期(5月中旬):冲突结束概率36%
- 长期(6月底):原油价格仍被高估
### 3. 风险评估
**风险因素:**
1. **地缘政治风险**:伊朗仍可能升级冲突,导弹袭击持续
2. **市场流动性风险**:Polymarket市场规模相对较小
3. **时间风险**:停火谈判可能破裂
4. **信息滞后风险**:新闻传播与市场反应的时间差
**风险等级:中等偏高**
- 地缘政治不确定性仍然存在
- 但特朗普政府的明确缓和信号值得关注
### 4. 结论与投资建议
**套利机会识别:**
**建议操作:卖出(Short)机会**
**逻辑链:**
1. **基本面**:特朗普明确表示伊朗新领导人请求停火,这是强烈的外交缓和信号
2. **技术面**:Polymarket原油价格概率仍处于恐慌高位(92%突破$105)
3. **时间差**:市场尚未充分消化缓和信号,存在定价错误
4. **风险回报比**:如果停火实现,原油价格可能迅速回落至$90-95区间
**具体建议:**
1. **短期套利**:在Polymarket上卖出"WTI原油突破$105"的合约
- 当前价格:约0.92(92%概率)
- 目标价格:如果停火进展顺利,可能降至0.60-0.70
- 潜在回报:约25-35%
2. **中期对冲**:同时买入"冲突在5月中旬前结束"的合约
- 当前价格:0.36(36%概率)
- 如果停火进展顺利,可能升至0.60-0.70
- 提供对冲保护
3. **风险控制**:
- 仓位控制:建议不超过总资金的20%
- 止损设置:如果原油价格突破$110,考虑止损
- 时间框架:重点关注未来2-3周的外交进展
**监控指标:**
1. 特朗普政府与伊朗的进一步外交接触
2. 霍尔木兹海峡航运恢复迹象
3. 国际油价实时走势
4. Polymarket相关合约价格变化
**最终结论:**
当前存在明显的卖出套利机会。Polymarket的恐慌定价尚未充分反映特朗普政府发出的缓和信号。建议采取谨慎但积极的卖出策略,同时通过相关合约进行对冲,以控制地 缘政治风险。
结语
至此,我们已完成基于 LangChain 的 Agent 最小可行产品(MVP)。当前实现验证了核心链路通畅,但距离生产级应用仍需完善:异常重试机制、调用链路追踪、输入输出校验、成本配额控制等。本文提供基础架构参考,实际落地时请结合具体场景调整工具配置与提示词策略。