当前位置: 首页 > article >正文

CryptoGPT:基于LangChain的AI智能体实现链上金融操作实践

1. 项目概述当大语言模型学会“自己赚钱”最近在捣鼓一个挺有意思的实验性项目叫 CryptoGPT。这名字听起来可能有点唬人但它的核心想法其实挺直接的让像 ChatGPT 这样的大语言模型LLM能够自主地进行链上金融操作比如发送交易、兑换代币甚至未来可能进行更复杂的 DeFi 交互。简单说就是给 AI 一个钱包让它自己学着“花钱”和“赚钱”探索一种所谓的“金融自主权”。这项目最初是开发者 junhoyeo 的一个概念验证。它基于一个很自然的疑问如果 AI 能理解我们的指令并生成代码那它能不能直接理解我们对金融行为的描述并生成可执行的区块链交易呢比如我告诉它“给这个地址转 0.1 个 ETH”或者“把一半的 WETH 换成 USDC”它能否像调用 API 一样自动完成签名和广播CryptoGPT 就是对这个想法的一次实践。它结合了 LangChain 的智能体框架、以太坊的 Web3 库以及一个前端界面试图构建一个能让 LLM 驱动钱包操作的管道。这个项目非常适合对 AI 智能体、区块链开发以及两者交叉领域感兴趣的开发者、研究员和极客。它不是一个成熟的产品更像一个开放的实验沙盒展示了将自然语言指令转化为链上动作的技术可能性。通过拆解它你不仅能学到如何用 LangChain 构建具备工具调用能力的 AI 智能体还能深入理解以太坊交易构建、签名以及前端如何安全地与智能体交互的完整流程。当然我必须强调当前版本存在严重的安全风险私钥是以明文形式传输的绝对不应用于任何生产环境或关联真实资产的钱包。但这恰恰是学习和实验的价值所在——在安全可控的测试环境中探索技术的边界。2. 核心架构与设计思路拆解CryptoGPT 的整体架构可以看作一个典型的“AI 智能体 专业工具”模式。它的核心目标是让 LLM 扮演一个“金融操作员”的角色而 LangChain 则提供了让这个操作员学会使用“工具”即区块链交互能力的框架。2.1 技术栈选型背后的逻辑项目采用了 Next.js TailwindCSS 作为前端Vercel Serverless Functions 作为后端 APILangChain.js 作为 AI 智能体框架并通过 ethers.js 或 viem 与区块链交互。这个选型组合有其清晰的考量Next.js Vercel 的无缝集成对于需要快速原型验证的项目Next.js 的全栈能力API Routes配合 Vercel 的极简部署是黄金组合。开发者可以专注于业务逻辑几乎不用操心服务器运维。将敏感的逻辑如私钥处理、AI 调用放在 Serverless Function 中也能在一定程度上进行隔离。LangChain.js 的智能体抽象LangChain 的核心价值在于它提供了一套高层次的抽象用于构建基于 LLM 的应用程序。其Agent和Tool的概念非常适合本项目。我们可以将“发送交易”、“查询余额”、“兑换代币”等每个区块链操作封装成一个独立的Tool。LLM如 GPT-3.5/4在理解用户自然语言指令后会自主决定调用哪个工具、传入什么参数。这比我们手动解析指令并调用对应函数要灵活和强大得多。以太坊开发库的选择项目初期可能使用 ethers.js这是一个功能全面、文档完善的库。但在更现代、轻量且类型安全的趋势下像 viem 这样的库也值得考虑。它的模块化设计和优秀的 Tree-shaking 支持能显著优化最终的前端包体积。这个架构的流程大致是用户在前端输入自然语言指令 - 前端调用部署在 Vercel 上的 Serverless Function - Serverless Function 初始化 LangChain 智能体并加载所有区块链工具 - 智能体与 LLM如 OpenAI API交互规划行动步骤 - 智能体调用相应的工具生成原始交易数据 - 工具使用本地配置的私钥对交易进行签名 - 将已签名的交易广播到区块链网络。注意安全设计的核心矛盾。当前 PoC 版本最突出的安全问题就是将私钥硬编码在环境变量中并随请求发送到后端。这意味着私钥会在网络传输和服务器内存中明文出现。在任何情况下都不应将控制着资产的私钥交给一个可能产生不可预测行为的 LLM 智能体。项目路线图中提到的“允许用户通过钱包批准交易”是唯一正确的演进方向即采用类似 MetaMask 的交互模式智能体生成未签名的交易前端将其发送给用户的钱包如 MetaMask、Rabby进行签名批准然后再广播。这确保了私钥永远只存在于用户本地。2.2 智能体工作流设计LangChain 智能体的工作流是其大脑。我们需要设计一个高效的“思考-行动”循环。指令解析与规划用户说“给我在 Goerli 测试网的地址转 0.5 个 ETH”。LLM 首先需要理解这个指令包含几个关键信息action发送交易、amount0.5 ETH、recipient“我的地址”这可能需要先通过另一个工具查询出来、networkGoerli。工具选择与调用LLM 根据其内部知识由我们通过提示词提供知道有一个叫sendTransaction的工具可以完成这个任务。但它需要参数to,value,chainId。这时它可能会先调用一个getWalletAddress工具来解析“我的地址”具体是什么或者调用getBalance来确认余额是否足够。交易构建与执行收集齐参数后sendTransaction工具被调用。它在内部会使用 ethers.js 构建一个交易对象用私钥签名并通过 JSON-RPC 提供商如 Infura、Alchemy发送到 Goerli 网络。观察结果与继续交易发送后会返回一个交易哈希。智能体可以将这个哈希作为结果返回给用户或者再调用一个getTransactionReceipt工具来等待交易确认并将最终状态反馈给用户。这个循环可能不止一次。复杂的指令如“将 10% 的 ETH 换成 USDC然后将其存入 Aave 赚取利息”会触发一连串的工具调用查询余额、在 Uniswap 进行兑换、查询 Aave 池子、进行存款。LangChain 的SequentialChain或AgentExecutor会管理这个多步过程。3. 核心模块深度解析与实操要点让我们深入到几个核心模块看看代码层面是如何实现的以及有哪些必须注意的细节。3.1 LangChain 工具Tool的封装艺术将区块链操作封装成 LangChain 能识别的Tool是项目的基础。一个健壮的工具封装需要考虑以下几点工具描述Description的撰写这是 LLM 能否正确使用工具的关键。描述必须清晰、无歧义并说明输入参数的格式。例如对于发送交易的工具// 不好的描述 const sendTransactionTool new Tool({ name: “send_money“, description: “Sends cryptocurrency“, func: async (input) { … } }); // 好的描述 const sendTransactionTool new Tool({ name: “send_transaction“, description: Sends a transaction of native currency (e.g., ETH) to a specified address. Input should be a JSON string with the following keys: - ‘to‘: string, the recipient‘s Ethereum address (must start with 0x). - ‘value‘: string, the amount to send in Ether (e.g., “0.1“ for 0.1 ETH). - ‘chainId‘: number (optional), the blockchain network ID (1 for Mainnet, 5 for Goerli). Defaults to 5 (Goerli). Example input: {\“to\“: \“0x742d35Cc6634C0532925a3b844Bc9e…\“, \“value\“: \“0.5\“, \“chainId\“: 5}‘, func: async (input) { const { to, value, chainId 5 } JSON.parse(input); // … 实现逻辑 } });好的描述明确了输入必须是 JSON 字符串列出了所有必需的参数及其类型、格式和可选性并给出了示例。这能极大提高 LLM 调用工具的准确率。错误处理与反馈工具内部必须有完善的错误处理try-catch。当出现错误时如余额不足、RPC 调用失败、地址格式错误工具应该返回一个结构化的错误信息而不是抛出异常导致智能体崩溃。这个错误信息能被 LLM 理解从而让它有机会调整策略或告知用户。例如{“error“: true, “message“: “Insufficient balance. Required: 0.5 ETH, Available: 0.3 ETH“}。状态无副作用理想情况下每个工具调用都应该是幂等的但这在区块链交易中很难因为交易一旦发送就不能重复。我们需要在工具内部处理 nonce 管理、Gas 价格估算等有状态的操作但对 LLM 暴露的接口应尽可能简单。3.2 交易构建与签名安全雷区这是整个系统中最敏感的部分。在 PoC 中私钥从环境变量读取这本身就是高风险操作。私钥管理当前不安全模式// .env 文件中 WALLET_PRIVATE_KEY0x你的私钥 // 在工具中危险 import { Wallet } from ‘ethers‘; const privateKey process.env.WALLET_PRIVATE_KEY; const wallet new Wallet(privateKey);这种方式意味着任何能访问到运行此代码的服务器环境的人都可能窃取私钥。绝对禁止在生产环境使用。交易参数估算一个完整的交易需要to,value,data,gasLimit,gasPrice/maxFeePerGas,nonce,chainId。LLM 只能提供to和value对于原生代币转账其他参数需要工具智能填充。gasLimit: 对于简单的 ETH 转账可以是一个固定值如 21000。对于合约交互需要通过eth_estimateGasRPC 调用进行估算。估算失败通常意味着交易会失败这是一个重要的前置验证。gasPrice/maxFeePerGas: 需要从网络获取当前 Gas 价格。可以使用eth_gasPrice获取传统 Gas 价格或eth_feeHistory来估算 EIP-1559 类型的maxFeePerGas和maxPriorityFeePerGas。这里有一个策略为了确保交易快速确认可以取当前平均 Gas 价格的 110%-120%。nonce: 需要通过eth_getTransactionCount查询当前地址的下一个 nonce。必须妥善管理 nonce特别是在智能体可能并发调用工具的场景下否则会导致交易覆盖或阻塞。一个简单的办法是使用一个带锁的计数器。签名与广播使用私钥签名后通过eth_sendRawTransactionRPC 调用广播交易。务必保存返回的txHash它是查询交易状态的唯一凭证。3.3 前端与后端的交互设计前端Next.js的主要职责是提供聊天界面和安全管理用户凭证在未来版本中。聊天界面使用简单的文本框和消息列表即可。关键是将用户的自然语言消息发送到后端 API 路由如/api/chat。API 路由设计位于pages/api/chat.js或app/api/chat/route.jsexport default async function handler(req, res) { if (req.method ! ‘POST‘) return res.status(405).end(); const { message } req.body; // 1. 初始化 LangChain 智能体加载工具注入私钥等配置 const agent await initializeCryptoGPTAgent(); // 2. 运行智能体 try { const response await agent.call({ input: message }); res.status(200).json({ text: response.output }); } catch (error) { console.error(‘Agent execution error:‘, error); res.status(500).json({ text: An error occurred: ${error.message} }); } }这个处理函数是后端逻辑的入口。initializeCryptoGPTAgent函数会创建 LangChain 的OpenAI实例、工具列表并组装成AgentExecutor。流式响应Streaming路线图中提到了 Stream Responses。这是一个提升用户体验的重要功能。与其等待智能体完成所有思考、工具调用步骤后再一次性返回结果不如将思考过程和中间结果实时流式传输到前端。这可以通过 Vercel 的 AI SDK 或使用 Server-Sent Events (SSE) 来实现。当智能体调用一个工具时可以立即向前端发送一个事件如[ACTION] Querying balance...让用户感知到进度。4. 从零开始环境搭建与核心功能实现让我们抛开项目原有的脚手架从一个更清晰的角度一步步实现 CryptoGPT 的核心功能。我们将聚焦于 Goerli 测试网因为获取测试币很容易。4.1 基础环境与依赖安装首先创建一个新的 Next.js 项目并安装核心依赖。# 创建 Next.js 项目使用 TypeScript 和 Tailwind CSS 模板 npx create-next-applatest cryptogpt-demo --typescript --tailwind --app cd cryptogpt-demo # 安装 LangChain 和 OpenAI 官方库 npm install langchain langchain/openai # 安装以太坊交互库这里选择 viem更现代 npm install viem # 安装用于解析 .env 文件的库 npm install dotenv接下来创建项目根目录下的.env.local文件用于存储敏感信息。切记这个文件必须被加入.gitignore绝不提交到代码仓库。# .env.local # 你的 OpenAI API 密钥 OPENAI_API_KEYsk-your-openai-key-here # 一个 JSON-RPC 提供商端点用于连接 Goerli 测试网 # 可以从 Infura (https://infura.io)、Alchemy (https://alchemy.com) 获取免费端点 JSON_RPC_URLhttps://eth-goerli.g.alchemy.com/v2/YOUR_ALCHEMY_KEY # 用于测试的私钥务必使用测试网钱包且该钱包没有真实资产 WALLET_PRIVATE_KEY0x你的测试网钱包私钥4.2 实现第一个核心工具查询余额在lib/tools目录下创建balanceTool.ts。这个工具相对简单没有写操作适合作为起点。// lib/tools/balanceTool.ts import { Tool } from “langchain/core/tools“; import { createPublicClient, http, formatEther } from “viem“; import { goerli } from “viem/chains“; // 初始化一个公共客户端用于只读操作 const publicClient createPublicClient({ chain: goerli, transport: http(process.env.JSON_RPC_URL), }); export class BalanceTool extends Tool { name “get_balance“; description Gets the balance of the configured wallet in Ether. Input should be empty or a JSON string with an optional ‘address‘ key to check a specific address. Example input: {} or {\“address\“: \“0x…\“}‘; // 核心方法执行工具逻辑 protected async _call(arg: string): Promisestring { try { // 解析输入参数 let address: 0x${string}; const input arg ? JSON.parse(arg) : {}; if (input.address /^0x[a-fA-F0-9]{40}$/.test(input.address)) { address input.address as 0x${string}; } else { // 如果没有提供地址则使用环境变量中私钥对应的地址 // 注意这里仅为演示。实际应从安全的存储中获取地址。 const { privateKeyToAccount } await import(“viem/accounts“); const account privateKeyToAccount(process.env.WALLET_PRIVATE_KEY as 0x${string}); address account.address; } // 使用 viem 查询余额 const balanceWei await publicClient.getBalance({ address }); const balanceEth formatEther(balanceWei); return The balance of address ${address} is ${balanceEth} ETH.; } catch (error) { return Failed to get balance: ${error instanceof Error ? error.message : String(error)}; } } }这个工具展示了几个要点使用viem的createPublicClient创建只读客户端。输入参数通过 JSON 字符串解析并做了简单的地址格式校验。错误被捕获并返回给 LLM而不是抛出。余额从 Wei 单位转换为易读的 ETH 单位。4.3 实现第二个核心工具发送 ETH 交易这是关键且危险的工具。在lib/tools下创建sendTransactionTool.ts。// lib/tools/sendTransactionTool.ts import { Tool } from “langchain/core/tools“; import { createWalletClient, http, parseEther } from “viem“; import { goerli } from “viem/chains“; import { privateKeyToAccount } from “viem/accounts“; export class SendTransactionTool extends Tool { name “send_transaction“; description Sends ETH to a specified address. Input must be a JSON string with: - ‘to‘: string, the recipient‘s Ethereum address (must start with 0x). - ‘value‘: string, the amount to send in Ether (e.g., “0.1“). Optional: - ‘chainId‘: number, defaults to 5 (Goerli). Example: {\“to\“: \“0x…\“, \“value\“: \“0.05\“}‘; protected async _call(arg: string): Promisestring { try { const { to, value, chainId 5 } JSON.parse(arg); // 1. 参数验证 if (!to || !/^0x[a-fA-F0-9]{40}$/.test(to)) { return “Error: Invalid ‘to‘ address format.“; } const valueNum parseFloat(value); if (isNaN(valueNum) || valueNum 0) { return “Error: ‘value‘ must be a positive number.“; } // 2. 初始化钱包客户端包含私钥危险操作 const account privateKeyToAccount(process.env.WALLET_PRIVATE_KEY as 0x${string}); const walletClient createWalletClient({ account, chain: goerli, transport: http(process.env.JSON_RPC_URL), }); // 3. 准备交易参数 const valueInWei parseEther(value); // 4. 发送交易 const hash await walletClient.sendTransaction({ to: to as 0x${string}, value: valueInWei, // viem 会自动处理 gas, nonce 等参数 }); return Transaction sent successfully! Hash: ${hash}. You can check its status on a block explorer like https://goerli.etherscan.io/tx/${hash}; } catch (error: any) { // 特别处理常见的 RPC 错误 let errorMsg error?.message || String(error); if (errorMsg.includes(‘insufficient funds‘)) { errorMsg “Error: Insufficient balance for this transaction.“; } else if (errorMsg.includes(‘nonce too low‘)) { errorMsg “Error: Nonce issue. Please try again.“; } return Failed to send transaction: ${errorMsg}; } } }这个工具的实现有几个致命的安全缺陷但作为 PoC 它说明了流程私钥直接暴露在代码中privateKeyToAccount使用了环境变量中的私钥。在生产中私钥绝不应出现在后端代码里。自动 Gas 估算viem的sendTransaction会自动估算 Gas 和获取 nonce这简化了代码但也隐藏了细节。在更复杂的合约交互中可能需要手动控制。错误处理我们特别处理了“余额不足”和“nonce 过低”这两种常见错误并返回了更友好的信息给 LLM。4.4 组装 LangChain 智能体并创建 API在app/api/chat/route.ts中我们将所有工具组装起来并创建一个简单的聊天端点。// app/api/chat/route.ts import { NextRequest, NextResponse } from “next/server“; import { ChatOpenAI } from “langchain/openai“; import { AgentExecutor, createReactAgent } from “langchain/agents“; import { BalanceTool } from “/lib/tools/balanceTool“; import { SendTransactionTool } from “/lib/tools/sendTransactionTool“; // 初始化工具实例 const tools [new BalanceTool(), new SendTransactionTool()]; // 初始化 LLM const llm new ChatOpenAI({ openAIApiKey: process.env.OPENAI_API_KEY, modelName: “gpt-3.5-turbo“, // 或 “gpt-4“ temperature: 0, // 设置为0以获得更确定性的输出 }); export async function POST(request: NextRequest) { try { const { message } await request.json(); // 创建智能体执行器 const agent await createReactAgent({ llm, tools, }); const agentExecutor new AgentExecutor({ agent, tools, verbose: true, // 在控制台输出详细日志便于调试 }); // 执行智能体 const result await agentExecutor.invoke({ input: message, }); return NextResponse.json({ text: result.output }); } catch (error) { console.error(“API Error:“, error); return NextResponse.json( { text: Server error: ${error instanceof Error ? error.message : String(error)} }, { status: 500 } ); } }4.5 实现一个简单的前端界面在app/page.tsx中创建一个极简的聊天界面。// app/page.tsx “use client“; import { useState } from “react“; export default function Home() { const [input, setInput] useState(““); const [messages, setMessages] useState{ role: string; content: string }[]([ { role: “assistant“, content: “Hello! I‘m your Crypto Assistant. You can ask me to check your balance or send ETH on Goerli testnet.“ }, ]); const [isLoading, setIsLoading] useState(false); const handleSubmit async (e: React.FormEvent) { e.preventDefault(); if (!input.trim() || isLoading) return; const userMessage input; setInput(““); setMessages((prev) [...prev, { role: “user“, content: userMessage }]); setIsLoading(true); try { const response await fetch(“/api/chat“, { method: “POST“, headers: { “Content-Type“: “application/json“ }, body: JSON.stringify({ message: userMessage }), }); const data await response.json(); setMessages((prev) [...prev, { role: “assistant“, content: data.text }]); } catch (error) { console.error(error); setMessages((prev) [...prev, { role: “assistant“, content: “Sorry, something went wrong.“ }]); } finally { setIsLoading(false); } }; return ( div className“min-h-screen bg-gradient-to-br from-gray-900 to-black text-white p-8“ div className“max-w-4xl mx-auto“ h1 className“text-4xl font-bold mb-2“CryptoGPT Demo/h1 p className“text-gray-400 mb-8“An AI agent with a wallet. (Goerli Testnet Only)/p div className“bg-gray-800 rounded-xl p-6 mb-6 h-[500px] overflow-y-auto“ {messages.map((msg, idx) ( div key{idx} className{mb-4 p-4 rounded-lg ${msg.role ‘user‘ ? ‘bg-blue-900 ml-auto max-w-[80%]‘ : ‘bg-gray-700 max-w-[80%]‘}} div className“font-semibold mb-1“{msg.role ‘user‘ ? “You“ : “Assistant“}/div div className“whitespace-pre-wrap“{msg.content}/div /div ))} {isLoading ( div className“text-gray-400 italic“Assistant is thinking…/div )} /div form onSubmit{handleSubmit} className“flex gap-2“ input type“text“ value{input} onChange{(e) setInput(e.target.value)} placeholder“Ask me to check balance or send 0.01 ETH to 0x…“ className“flex-grow p-4 bg-gray-800 border border-gray-700 rounded-xl focus:outline-none focus:ring-2 focus:ring-blue-500“ disabled{isLoading} / button type“submit“ disabled{isLoading} className“px-8 py-4 bg-gradient-to-r from-blue-600 to-purple-600 rounded-xl font-semibold hover:opacity-90 disabled:opacity-50 disabled:cursor-not-allowed“ {isLoading ? “Sending…“ : “Send“} /button /form p className“text-sm text-gray-500 mt-4 text-center“ ⚠️ This is a demo. It uses a testnet wallet. DO NOT use a private key with real funds. /p /div /div ); }现在运行npm run dev访问http://localhost:3000你就可以和你的 CryptoGPT 智能体对话了。尝试输入“What‘s my balance?”或“Send 0.001 ETH to 0xYourFriend‘sTestAddress”。5. 常见问题、安全陷阱与进阶路线在实际操作和实验过程中你会遇到各种各样的问题。这里记录了一些典型场景和避坑指南。5.1 常见错误与排查清单问题现象可能原因排查步骤与解决方案智能体返回“I don‘t know how to do that”或调用错误工具1. 工具描述不清晰。2. LLM 温度temperature设置过高导致输出不稳定。3. 提示词Prompt没有明确约束智能体的能力范围。1.优化工具描述确保描述清晰列出输入格式和工具用途。参考 OpenAI 的 Function Calling 文档让描述更结构化。2.降低温度在ChatOpenAI初始化时设置temperature: 0。3.强化系统提示词在创建智能体时传入一个强大的系统消息如“你是一个只能使用特定工具进行以太坊操作的助手。如果用户请求超出这些工具范围请直接说明你无法做到。”交易发送失败提示“insufficient funds”测试网钱包余额不足。1. 前往 Goerli 水龙头如 https://goerlifaucet.com/获取测试 ETH。2. 在工具中增加余额检查逻辑在发送前先查询余额如果不足则提前返回错误避免浪费 Gas。交易一直处于 Pending 状态1. Gas 价格设置过低。2. Nonce 冲突。3. 网络拥堵。1.提高 Gas 费用在sendTransaction参数中手动设置maxFeePerGas和maxPriorityFeePerGas略高于当前网络平均水平。2.检查 Nonce确认是否之前有交易卡住。可以尝试重置钱包的 nonce谨慎操作。3.使用加速服务或取消交易发送一笔具有相同 nonce 但 Gas 费更高的交易来替换或者发送一笔 value 为 0、to 为自己地址、相同 nonce 的交易来取消。RPC 提供商返回“rate limit exceeded”或“project ID not found”免费 tier 的 RPC 调用次数用尽或配置错误。1. 检查JSON_RPC_URL是否正确特别是 Alchemy/Infura 的项目 ID 或密钥。2. 考虑轮换多个 RPC 提供商或在工具中实现简单的重试和降级机制。前端报跨域CORS错误开发环境下前端 (localhost:3000) 调用后端 API (localhost:3000/api/chat) 通常没问题。如果部署后出现问题可能是 Vercel 函数配置问题。在 API 路由的响应头中添加 CORS 头。对于 Next.js API Routes可以安装nextjs-cors中间件或手动设置res.setHeader(‘Access-Control-Allow-Origin‘, ‘*‘)生产环境应限制为具体域名。5.2 核心安全陷阱与演进方向再次强调当前 PoC 的最大风险是私钥管理。任何将私钥交给远程服务器和 LLM 的架构都是不可接受的。正确的演进方向如下钱包连接模式Wallet Connection Pattern这是路线图中提到的正确方案。前端集成如 MetaMask、WalletConnect 或 Rabby 等钱包 SDK。当用户需要执行交易时后端智能体生成未签名的交易对象to,value,data,gas,nonce等。前端将这个交易对象发送给用户连接的钱包。钱包弹出签名请求用户本地确认并签名。前端将用户签名后的原始交易rawTransaction发回后端由后端广播。私钥全程不离开用户设备。会话隔离与权限控制即使采用钱包连接模式也需要考虑一个智能体会话能执行哪些操作。应该引入“操作许可”的概念。例如用户可以预先授权智能体在单次会话中最多使用 0.1 ETH或者只能与特定的合约如某个 DEX交互。交易模拟Simulation与预览在执行任何交易前先在本地或通过 Tenderly、OpenZeppelin Defender 等服务的模拟功能运行一遍交易预测其结果是成功、失败还是会有多少代币转出。将模拟结果清晰地展示给用户让用户在签名前完全知情。审计与日志所有智能体发起的交易意图、生成的交易数据、最终的执行结果都应该被不可篡改地记录下来例如存储到 IPFS 或某个区块链上供用户事后审计。这对于建立信任至关重要。5.3 性能优化与扩展思路支持多链和 Layer 2工具不应硬编码 Goerli。可以将链配置RPC URL, Chain ID, 原生货币符号抽象出来。智能体需要能理解用户指令中的链信息如“在 Arbitrum 上…”并选择对应的工具配置。这可以通过在工具描述或系统提示词中注入当前支持的链列表来实现。集成更多 DeFi 工具封装 Uniswap/SushiSwap 的兑换、Aave/Compound 的存款借贷、NFT 市场如 OpenSea的购买/上架等。每个操作都是一个独立的工具。关键在于如何让 LLM 理解复杂的合约交互参数如 slippage tolerance, deadline。一种方法是将常见操作模板化LLM 只需填充关键参数。使用更强大的提示工程技术项目路线图提到了microsoft/guidance。像 Guidance 或 LangChain 的StructuredOutputParser这样的库可以强制 LLM 以特定格式如 JSON输出这对于精确提取交易参数非常有用能减少工具调用错误。引入记忆Memory让智能体记住对话上下文和之前的操作。例如用户说“把刚才换到的一半 USDC 存进去”智能体需要知道“刚才换的”指的是哪笔交易“一半”是多少“存进去”是存到哪里。LangChain 提供了多种记忆后端如缓冲区、向量存储。这个实验项目打开了一扇门让我们看到了 LLM 作为自动化金融操作接口的潜力。虽然前路充满挑战尤其是在安全和可靠性方面但它无疑是一个激动人心的探索方向。对于开发者而言理解其背后的架构、亲手实现核心工具、并深刻认识到其中的风险是迈向构建更安全、更强大 AI 金融智能体的第一步。记住永远把安全和控制权放在用户手中。

相关文章:

CryptoGPT:基于LangChain的AI智能体实现链上金融操作实践

1. 项目概述:当大语言模型学会“自己赚钱” 最近在捣鼓一个挺有意思的实验性项目,叫 CryptoGPT。这名字听起来可能有点唬人,但它的核心想法其实挺直接的: 让像 ChatGPT 这样的大语言模型(LLM)能够自主地进…...

查看与管理团队API Key使用情况的审计日志功能详解

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 查看与管理团队API Key使用情况的审计日志功能详解 1. 功能概述与核心价值 在团队协作使用大模型API的场景中,API Key…...

基于Aleo与零知识证明的隐私社交应用LoveSpark技术解析

1. 项目概述:当隐私计算遇上浪漫表达最近在开源社区里闲逛,发现了一个挺有意思的项目,叫“LoveSpark”。光看名字,你可能会觉得这跟技术没啥关系,更像是个情感类应用。但点进去一看,它的技术栈和定位让我这…...

Windows 11 24H2中近期被披露了一个高危本地权限提升漏洞

导语:一个普通用户,无需任何特殊权限,只需在锁屏界面上触发一次竞争条件,就能获得系统的最高控制权——这正是CVE-2026-24291(代号RegPwn)所实现的效果。2026年3月,这个潜伏在Windows辅助功能AT…...

法律NLP实战:基于mclaw的法律文本智能分析与问答系统

1. 项目概述:一个为法律文本分析而生的智能工具最近在整理一些合同和法规文件时,我又一次被海量的文本和复杂的条款搞得头大。相信很多法务、律师、合规或者像我一样需要经常处理法律文档的朋友都有同感:动辄几十上百页的文件,要快…...

法律文本智能解析:基于BERT与信息抽取的法律NLP实践

1. 项目概述:一个为法律文本分析而生的智能工具最近在和一些做法律科技的朋友聊天,发现一个挺有意思的现象:无论是律所的法务助理,还是法律科技公司的产品经理,都在为一个问题头疼——怎么高效地从海量的法律文书、合同…...

如何将影像组学与计算病理特征关联肿瘤微环境“反应/荒漠”基质表型建立关联,并进一步解释其与胰腺癌术后早期复发及ECM重塑的机制联系

01导语各位同学,大家好。做影像组学最怕的是什么?是模型精度刷到0.99,但一问“为什么能预测”就哑口无言——特征到底对应什么生物学过程?细胞、基质、还是血管?完全说不清。今天咱们通过一篇发表于Advanced Science的…...

3步告别英文困扰:FigmaCN中文界面插件的完整解决方案

3步告别英文困扰:FigmaCN中文界面插件的完整解决方案 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma的英文界面而头疼吗?专业术语看不懂&#xff0c…...

如何用猫抓浏览器扩展打造终极网页媒体资源管理神器

如何用猫抓浏览器扩展打造终极网页媒体资源管理神器 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓(cat-catch)是一款专为技术开发者和高级用…...

NeMo AutoModel:基于PyTorch DTensor与SPMD的工业级大模型分布式训练框架

1. 项目概述:NeMo AutoModel,一个为PyTorch大模型训练而生的“工业级加速器”如果你正在用PyTorch和Hugging Face做LLM或VLM的微调、预训练,并且被“如何高效地扩展到多卡、多机”这个问题困扰过,那么NeMo AutoModel就是你一直在找…...

ROS2 不只是节点通信

公众号致力于点云处理,SLAM,三维视觉,具身智能,自动驾驶等领域相关内容的干货分享,欢迎各位加入,有兴趣的可联系dianyunpcl163.com。文章未申请原创,未经过本人允许请勿转载,有意转载…...

QtScrcpy:解锁跨设备协同的终极方案,实现30ms低延迟投屏

QtScrcpy:解锁跨设备协同的终极方案,实现30ms低延迟投屏 【免费下载链接】QtScrcpy Android real-time display control software 项目地址: https://gitcode.com/GitHub_Trending/qt/QtScrcpy 你是否曾经遇到过这样的困扰:想要在电脑…...

【三维路径规划】基于遗传实现考虑水下生物 雷达 高炮威胁的导弹航路规划附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 🔥 内容介绍 一、 概…...

如何高效使用Iwara视频下载工具:5个专业技巧提升动漫资源获取体验

如何高效使用Iwara视频下载工具:5个专业技巧提升动漫资源获取体验 【免费下载链接】IwaraDownloadTool Iwara 下载工具 | Iwara Downloader 项目地址: https://gitcode.com/gh_mirrors/iw/IwaraDownloadTool 作为动漫爱好者,您是否经常在Iwara平台…...

百度网盘直链解析工具:3分钟解锁全速下载新体验

百度网盘直链解析工具:3分钟解锁全速下载新体验 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘的龟速下载而烦恼吗?每次下载大文件都要…...

构建AI客服系统时利用Taotoken实现模型热切换与降级

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 构建AI客服系统时利用Taotoken实现模型热切换与降级 在构建在线客服系统并接入AI对话能力时,开发团队通常面临两个核心…...

蛋白与核酸小分子对接#生物医学科研 #生信分析 #生物信息学 #科研 #科研绘图

蛋白与核酸小分子对接#生物医学科研 #生信分析 #生物信息学 #科研 #科研绘图...

ComfyUI-Manager终极指南:如何轻松管理AI绘画工作流扩展

ComfyUI-Manager终极指南:如何轻松管理AI绘画工作流扩展 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various cus…...

别再手动点播放了!用Vue3+Web Speech API实现数组语音自动轮播(附完整代码)

Vue3与Web Speech API打造智能语音轮播系统 在信息过载的时代,语音交互正成为提升用户体验的关键技术。想象一下,当用户打开你的教育类应用时,课程要点自动以清晰流畅的语音播放;或者在新闻阅读场景中,不同栏目的内容无…...

如何免费解锁原神60帧限制:终极FPS解锁工具完全指南

如何免费解锁原神60帧限制:终极FPS解锁工具完全指南 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 你是否在原神中体验过画面卡顿、动作不够流畅的困扰?当其他游…...

5分钟掌握:SketchUp STL插件实战指南,轻松实现3D打印模型转换

5分钟掌握:SketchUp STL插件实战指南,轻松实现3D打印模型转换 【免费下载链接】sketchup-stl A SketchUp Ruby Extension that adds STL (STereoLithography) file format import and export. 项目地址: https://gitcode.com/gh_mirrors/sk/sketchup-s…...

Oracle VPS web console入口

找了半天,终于在一个不起眼的地方找到了,做个记录。如图:...

VR/AR市场破局:硬件降本与内容生态的七年博弈与未来展望

1. 从“潜力无限”到“现实骨感”:VR市场的七年之痒与破局关键2017年那会儿,我还在一个消费电子展上第一次体验了当时最顶级的VR头显。那种沉浸感确实震撼,但当我问及价格和能玩的内容时,得到的答案让我这个从业者都倒吸一口凉气。…...

在Agent工作流中集成Taotoken实现稳定且低成本的多模型调用

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在Agent工作流中集成Taotoken实现稳定且低成本的多模型调用 构建自动化AI工作流的开发者,常常需要依赖大模型API来完成…...

Zotero Style:让文献管理变得优雅高效的终极指南

Zotero Style:让文献管理变得优雅高效的终极指南 【免费下载链接】zotero-style Ethereal Style for Zotero 项目地址: https://gitcode.com/GitHub_Trending/zo/zotero-style 还在为海量文献管理而烦恼吗?Zotero Style插件正是你需要的文献管理神…...

FPGA如何重塑数据中心NVMe闪存卡:应对闪存碎片化与计算存储新范式

1. 数据中心存储架构的演进与FPGA的机遇十年前,如果有人告诉我,数据中心里那些笨重、吵闹、耗电的硬盘阵列,会被一块块巴掌大小、静默无声的卡片逐渐取代,我可能会觉得这是科幻小说里的情节。但今天,这已经是每天都在发…...

AI行业入场券如何零成本获取?(SITS2026志愿者身份背后的5层职业跃迁路径)

更多请点击: https://intelliparadigm.com 第一章:AI行业入场券如何零成本获取?(SITS2026志愿者身份背后的5层职业跃迁路径) 成为 SITS2026(Smart Intelligence Technology Summit 2026)志愿者…...

3分钟学会Wand-Enhancer:免费解锁WeMod专业版的终极教程

3分钟学会Wand-Enhancer:免费解锁WeMod专业版的终极教程 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 还在为WeMod专业版的高昂订阅费而犹…...

外籍高管如何用10年攻克日本半导体市场:从破局到筑城的实战方法论

1. 从“破局者”到“筑城者”:一位外籍高管在日本半导体市场的十年征程 在半导体这个以“快”著称的行业里,四年时间足以让一个技术路线从蓝图变为古董,让一家明星初创公司从风口跌落,或者让一个市场格局彻底洗牌。2014年&#xf…...

NASA激光通信革命:从LCRD到DSOC,如何用光速重塑深空互联网

1. 项目概述:从射频到光子,深空通信的范式革命如果你关注航天科技,尤其是深空探测的数据回传,那你一定对“带宽焦虑”深有体会。想象一下,毅力号火星车拍下一张4K高清全景图,却需要花上好几天时间&#xff…...