双源验证与强制推演:生产级 AI 投研 Agent 的幻觉抑制方案
前言
本文系前篇技术方案的进阶优化版本,核心聚焦于解决生成式 AI 在实际应用中的三大典型问题:幻觉生成(Hallucination)、语义模糊(Ambiguity)及输出精度不足(Low Precision) 。
前篇内容主要围绕基础环境配置与端到端流程验证展开,侧重于确保系统可正常运行,尚未对业务逻辑层进行深度优化与精细化处理。
整体架构概览
这是一个 LangChain/LangGraph 驱动的 AI 投研 Agent,专门用于分析地缘政治事件对预测市场(Polymarket)和能源市场的影响,寻找套利机会。
🔧 第一部分:tools.ts —— 工具层实现
1. 环境配置与依赖
import * as dotenv from "dotenv"; // 环境变量管理
import { tool } from "@langchain/core/tools"; // LangChain 工具装饰器
import { z } from "zod"; // 参数校验
import { TavilySearch } from "@langchain/tavily"; // Tavily AI 搜索引擎
import axios from "axios"; // HTTP 请求
import { HttpsProxyAgent } from "https-proxy-agent"; // 代理支持
2. 网络代理配置
const agent = new HttpsProxyAgent("http://127.0.0.1:3067"); // 本地代理
const axiosConfig = { timeout: 15000, httpsAgent: agent, proxy: false };
- 通过本地 3067 端口代理访问外部 API
- 15秒超时设置
3. 工具一:financialSearchTool —— Tavily 新闻搜索
| 属性 | 说明 |
|---|---|
| 功能 | 搜索最新新闻背景、套利机会或市场异动 |
| 底层引擎 | TavilySearch (maxResults: 5) |
| 输入格式 | {"query": "搜索关键词"} |
| 输出 | JSON 格式化的搜索结果 |
核心用途:获取基本面信息(政策、突发事件、市场情绪)
4. 工具二:marketDataTool —— Polymarket 套利扫描器 ⭐核心
这是一个高度优化的智能过滤系统:
4.1 语义映射表(中英关键词转换)
"原油" → ["oil", "crude", "energy", "brent", "wti"]
"中东" → ["israel", "gaza", "iran", "lebanon", "middle east"]
"战争" → ["war", "military", "strike", "attack"]
"选举" → ["election", "trump", "harris"]
"套利" → ["arbitrage", "mispricing", "spread", "basis"]
4.2 智能组合搜索策略
const hotSuffixes = ["ceasefire", "rate cut", "ath", "trump", "deadline"];
// 生成组合词:baseTerm + hotSuffix
// 例如:输入"以色列" → 生成 "israel ceasefire", "israel rate cut" 等
4.3 数据获取与过滤流程
1. 调用 Polymarket API → 获取最活跃的 50 个市场
2. 语义匹配 → 检查标题是否包含关注词或其组合
3. 噪音过滤 → 剔除体育类市场 (NBA, NHL, soccer等)
4. 结果排序 → 按相关度返回
4.4 输出格式
{
"status": "success",
"count": 3,
"data": [
{"question": "市场问题", "price": 0.65, "endDate": "2024-12-31"},
...
],
"hint": "请分析以上市场之间是否存在隐含概率冲突或定价偏差"
}
🤖 第二部分:主程序 —— ReAct Agent 实现
1. 核心架构组件
┌─────────────────────────────────────────┐
│ ReAct Agent 架构 │
├─────────────────────────────────────────┤
│ LLM: DeepSeek Chat (via OpenAI SDK) │
│ Memory: MemorySaver (对话状态持久化) │
│ Tools: [搜索工具, 行情工具] │
│ System Prompt: 投研专家角色定义 │
└─────────────────────────────────────────┘
2. LLM 配置详解
const llm = new ChatOpenAI({
apiKey: process.env.DEEPSEEK_API_KEY,
modelName: "deepseek-chat",
configuration: { baseURL: process.env.DEEPSEEK_API_BASE_URL },
temperature: 0, // 确定性输出,适合分析任务
});
3. 系统提示词(System Message)核心逻辑
【双源验证策略】
┌─────────────┐ ┌─────────────┐
│ 盘面赔率 │ ←→ │ 新闻基本面 │
│ (Polymarket)│ │ (Tavily搜索) │
└─────────────┘ └─────────────┘
↓ ↓
寻找定价偏差 ←──── 验证/补充信息
【 fallback 机制】
如果没搜到预测市场数据 → 禁止只说"没搜到" → 必须基于新闻进行逻辑推演
【输出模板强制结构】
| 章节 | 内容要求 |
|---|---|
| 一、实时盘面观测 | 赔率数据或"未定价原因分析" |
| 二、核心驱动因子 | 3条最关键新闻摘要 |
| 三、投研推演 | 深度见解 + 概率判断 + 套利建议 |
4. Agent 执行流程
const result = await agent.invoke({
messages: [{ role: "user", content: "分析 Israel(以色列)局势..." }]
}, config);
ReAct 循环:
- Thought: LLM 分析需要调用什么工具
-
Action: 调用
get_realtime_market_data或financial_market_search - Observation: 接收工具返回数据
- Repeat: 如有需要,继续调用工具
- Final Answer: 生成结构化投研报告
🎯 完整工作流程图解
用户输入主题
↓
[Agent 启动 ReAct 循环]
↓
┌─────────────────┐
│ 并行调用双工具 │
├─────────────────┤
│ 1. 搜索新闻基本面 │ → Tavily API
│ 2. 扫描Polymarket│ → 智能语义匹配 → 过滤体育噪音
└─────────────────┘
↓
[数据融合分析]
↓
┌─────────────────────────┐
│ 定价偏差检测算法 │
│ - 赔率 vs 新闻热度对比 │
│ - 相似市场概率冲突检测 │
│ - 时间差套利机会识别 │
└─────────────────────────┘
↓
[生成结构化报告]
↓
📊 深度投研报告(三章节固定格式)
💡 核心创新点
| 特性 | 说明 |
|---|---|
| 语义智能映射 | 中文输入自动扩展为英文关键词组合 |
| 组合搜索策略 | 基础词 + 热点后缀,捕获最新市场 |
| 噪音过滤 | 自动剔除体育等无关市场 |
| 强制推演机制 | 无数据时必须逻辑推演,禁止空返回 |
| 套利导向设计 | 输出明确提示寻找定价偏差 |
这是一个生产级的地缘政治-能源套利分析 Agent,结合了实时预测市场数据与 AI 搜索能力,输出具备实战价值的投研报告。
核心代码
工具(Tools.ts)
import * as dotenv from "dotenv";
dotenv.config();
import { tool } from "@langchain/core/tools";
import { z } from "zod";
import { TavilySearch } from "@langchain/tavily";
import axios from "axios";
import { HttpsProxyAgent } from "https-proxy-agent";
const agent = new HttpsProxyAgent("http://127.0.0.1:3067");
const axiosConfig = { timeout: 15000, httpsAgent: agent, proxy: false };
const searchInstance = new TavilySearch({ maxResults: 5 }); // 增加搜索结果以捕捉更多套利新闻
// 1. 搜索工具:强化了对套利/异动新闻的搜索描述
export const financialSearchTool = tool(
async (input) => {
const query = typeof input === 'string' ? input : (input.query || JSON.stringify(input));
console.log(`\n[🔍 正在执行深度搜索]: ${query}`);
try {
const res = await searchInstance.invoke(query);
return JSON.stringify(res);
} catch (e: any) { return `搜索暂时不可用`; }
},
{
name: "financial_market_search",
description: "搜索最新新闻背景、套利机会或市场异动。请输入关键词对象,例如:{\"query\": \"Polymarket arbitrage opportunities\"}",
schema: z.object({ query: z.string() }),
}
);
// 2. 深度优化的行情工具 (Arbitrage & Trend Ready)
export const marketDataTool = tool(
async (input) => {
const userInput = typeof input === 'string' ? input : (input.marketName || JSON.stringify(input));
// 1. 行业语义映射表 (包含最新套利关键词)
const mapping: Record<string, string[]> = {
"原油": ["oil", "crude", "energy", "brent", "wti", "gasoline"],
"油价": ["oil", "crude", "energy"],
"中东": ["israel", "gaza", "iran", "lebanon", "middle east", "hezbollah", "conflict"],
"战争": ["war", "military", "strike", "attack", "invasion"],
"选举": ["election", "trump", "vance", "harris", "walz"],
"停火": ["ceasefire", "truce", "peace"],
"核": ["nuclear", "facility", "isfahan"],
"海峡": ["hormuz", "strait", "shipping"],
"宏观": ["fed", "rate cut", "inflation", "recession", "gdp"],
"套利": ["arbitrage", "mispricing", "spread", "basis", "hedging"],
"时间差": ["deadline", "expiry", "until", "before", "sooner"],
"美联储": ["powell", "fomc", "interest rate", "basis points"],
"加密货币": ["bitcoin", "etf", "ethereum", "solana", "ath"]
};
// 获取基础关注词
let baseTerms = [userInput.toLowerCase()];
for (const [zh, ens] of Object.entries(mapping)) {
if (userInput.includes(zh)) {
baseTerms = ens;
break;
}
}
// --- 优化点:自动生成组合搜索词(捕获最新最热) ---
const hotSuffixes = ["ceasefire", "rate cut", "ath", "trump", "deadline"];
const focusTerms = [
...baseTerms,
...baseTerms.flatMap(term => hotSuffixes.map(suffix => `${term} ${suffix}`))
];
console.log(`\n[📊 正在扫描套利机会]: 领域 -> ${userInput} | 衍生词数 -> ${focusTerms.length}`);
try {
// 获取全平台最火的 50 个市场
const url = `https://gamma-api.polymarket.com/markets?active=true&closed=false&limit=50`;
const res = await axios.get(url, axiosConfig);
if (!res.data || res.data.length === 0) return "Polymarket 暂无活跃市场。";
// 2. 精准过滤逻辑
const relevantMarkets = res.data.filter((m: any) => {
const title = m.question.toLowerCase();
// 必须包含正向词,剔除体育等干扰噪音
const hasFocus = focusTerms.some(term => title.includes(term));
const isNoise = ["nhl", "nba", "cup", "game", "soccer", "football"].some(noise => title.includes(noise));
return hasFocus && !isNoise;
});
if (relevantMarkets.length > 0) {
// 按相关度或题目排序,方便 Agent 对比相似市场寻找套利空间
const marketList = relevantMarkets.map((m: any) => ({
question: m.question,
price: m.lastTradePrice,
endDate: m.endDate
}));
return JSON.stringify({
status: "success",
count: marketList.length,
data: marketList,
hint: "请分析以上市场之间是否存在隐含概率冲突或定价偏差。"
});
}
return `[提示]:热门榜单中暂无直接对标 "${userInput}" 的套利交易对。`;
} catch (e: any) { return `行情接口异常: ${e.message}`; }
},
{
name: "get_realtime_market_data",
description: "获取 Polymarket 实时赔率与套利机会。支持组合搜索。",
schema: z.object({ marketName: z.string() }),
}
);
export const tools = [financialSearchTool, marketDataTool];
主程(index.ts)
import * as dotenv from "dotenv";
dotenv.config();
import { ChatOpenAI } from "@langchain/openai";
import { createReactAgent } from "@langchain/langgraph/prebuilt";
import { MemorySaver } from "@langchain/langgraph";
import { tools } from "./tools1";
// ... 其他 import 保持不变
const systemMessage = `你是一位 Web3 顶级投研专家。你的目标是产出具备实战价值的地缘政治与能源市场报告。
【分析逻辑链条】:
1. 优先调用 get_realtime_market_data 寻找“盘面赔率”(最真实的真金白银预测)。
2. 同时调用 financial_market_search 搜索“基本面动态”(新闻、政策、突发事件)。
【核心指令】:
- 如果搜到了预测市场数据:请对比“盘面价格”与“新闻热度”,寻找定价偏差。
- 如果【没搜到】预测市场数据:你绝对不能只说“没搜到”。你必须利用搜索到的新闻事实,基于你的专业知识进行“逻辑推演”,分析当前局势对未来油价的潜在影响路径。
【报告输出模板】:
## 📊 [主题] 深度投研报告
---
### 一、 实时盘面观测 (On-chain Data)
[列出获取到的赔率,若无则分析为何市场尚未定价]
### 二、 核心驱动因子 (News Context)
[列出 Tavily 搜索到的 3 条最关键新闻摘要]
### 三、 投研推演与套利建议 (Expert Thesis)
[基于以上两点给出深度见解,必须包含对未来走势的概率判断]`;
// 创建 Agent 的配置
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 agent = createReactAgent({
llm,
tools,
checkpointSaver: memory,
messageModifier: systemMessage,
});
// 在运行前,我们可以通过一段逻辑拦截并修正 (这步是关键)
async function run() {
console.log("🚀 正在启动一劳永逸版 Agent...");
const config = { configurable: { thread_id: "final_test" }, recursionLimit: 50 };
const result = await agent.invoke({
messages: [{ role: "user", content: "分析 Israel(以色列)局势对预测市场的影响。" }]
}, config);
// 打印最后结果
const lastMsg = result.messages[result.messages.length - 1];
console.log("\n--- 最终报告 ---");
console.log(lastMsg.content);
}
run();
结语
至此,关于 LangChain/LangGraph 驱动的 AI 投研 Agent 从理论架构到工程实现的完整链路已全部落地。
该方案通过双源验证策略(盘面赔率 + 新闻基本面)与强制推演机制,有效抑制了生成式 AI 的幻觉与模糊输出问题,为地缘政治与能源市场的量化分析提供了可复用的技术框架。后续可围绕多 Agent 协作、动态策略回测等方向持续迭代。