双源验证与强制推演:生产级 AI 投研 Agent 的幻觉抑制方案

18 阅读6分钟

前言

本文系前篇技术方案的进阶优化版本,核心聚焦于解决生成式 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 循环

  1. Thought: LLM 分析需要调用什么工具
  2. Action: 调用 get_realtime_market_datafinancial_market_search
  3. Observation: 接收工具返回数据
  4. Repeat: 如有需要,继续调用工具
  5. Final Answer: 生成结构化投研报告

🎯 完整工作流程图解

用户输入主题
    ↓
[Agent 启动 ReAct 循环]
    ↓
┌─────────────────┐
│ 并行调用双工具  │
├─────────────────┤
│ 1. 搜索新闻基本面 │ → Tavily API2. 扫描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 协作、动态策略回测等方向持续迭代。