1. 项目概述:从“满屏的智能体”到实战落地
最近和不少同行交流,大家聊起AI大模型,话题总绕不开“智能体”。无论是技术社区、行业峰会还是投资人的PPT里,“智能体”这个词出现的频率高得惊人,几乎到了“满屏皆是”的程度。但热闹归热闹,真正能把这个概念讲清楚、并且能动手做出一个能解决实际问题的智能体应用的人,其实并不多。很多人感觉智能体像是一个飘在空中的概念,听起来很酷,但不知道从哪里下手,更不清楚它和传统的“大模型调用”或者“RAG问答”到底有什么区别。
我干了十多年应用开发,从早期的规则引擎到后来的机器学习模型,再到如今的大模型应用,一个深刻的体会是:任何技术从概念到落地,中间都隔着一道巨大的鸿沟。智能体也不例外。它不是一个单一的技术,而是一套以大型语言模型为“大脑”,通过规划、记忆、工具使用等模块协同工作,从而自主或半自主地完成复杂任务的系统工程框架。简单来说,传统的RAG是“你问我答,我查资料告诉你”,而智能体是“你提需求,我来分析、拆解、调用工具、执行步骤,最后给你一个完整的结果”。
这个项目,我们就来一起动手,把一个“满屏的智能体”概念,落地成一个实实在在的、能解决特定领域问题的应用。我们将聚焦于一个非常经典且需求明确的场景:金融大模型问答机器人。这不仅仅是做一个聊天界面,而是构建一个能理解复杂金融问题、检索多源信息、进行推理计算,并最终给出专业、准确回答的智能体系统。通过这个实战案例,你会清晰地看到智能体的核心组件如何协作,以及如何用代码将它们串联起来。
2. 项目核心设计:构建一个“金融分析师”智能体
在动手写代码之前,我们必须先把设计思路理清楚。一个健壮的智能体系统,其设计远比一个简单的函数调用复杂。我们需要为它赋予“角色”,设计它的“工作流”,并准备好它所需的“工具箱”。
2.1 角色定义与核心职责
首先,我们要明确这个智能体的“人设”。它不是一个通用的聊天机器人,而是一位专业的金融信息分析助理。这个角色定位决定了它的能力边界和行为模式。
- 角色:资深金融信息分析助理。
- 核心职责:
- 理解意图:准确解析用户关于金融市场、公司财报、宏观经济、投资产品等方面的复杂或开放式问题。
- 信息检索与整合:从指定的、可靠的金融数据源(如财经新闻、上市公司公告、研报摘要、宏观数据库)中,精准查找相关信息。
- 推理与计算:对检索到的信息进行对比、分析和简单计算(如增长率计算、比率分析等)。
- 结构化输出:以清晰、专业、可读性强的格式(如分点论述、对比表格、总结性语句)呈现答案,并注明关键信息的来源或依据。
- 风险提示:在涉及投资建议或预测时,自动附加合规性风险提示,声明信息仅供参考。
这个角色定义会直接融入到给大模型的系统提示(System Prompt)中,引导其以专业分析师的口吻和逻辑进行思考。
2.2 架构设计与技术选型
基于上述职责,我们设计一个模块化的智能体架构。整个系统可以看作一个“大脑”(LLM)指挥着几个“功能模块”协同工作。
整体架构图(逻辑描述):
用户提问 -> API网关 -> 智能体协调器(LLM + 规划模块) | v [任务规划与拆解] | +---------------------+---------------------+ | | | v v v [工具调用:检索] [工具调用:计算] [工具调用:信息验证] | | | v v v 知识库(RAG) 代码解释器 网络搜索API | | | +---------------------+---------------------+ | v [信息综合与推理] | v [结构化答案生成] | v 用户回复核心技术栈选型与理由:
LLM(大脑核心):
- 主选:Qwen(通义千问)系列。选择理由:第一,性能强大,在中文理解和生成、推理能力上表现优异,非常适合中文金融场景。第二,API稳定,且有丰富的上下文长度选项(如Qwen-Max支持128K),便于处理长文档。第三,性价比高,是国内开发者的务实之选。备用方案为GPT-4,但其API成本和稳定性需考虑。
- 微调技术储备:LoRA / SFT(监督微调)。虽然初期我们可以使用预训练模型,但为了让它更精通金融领域的专业术语、报告格式和合规话术,后续可以采用少量高质量的金融问答对数据进行SFT微调,或使用LoRA进行高效参数微调,让模型“更专业”。
框架(智能体骨架):
- LangChain:几乎是当前构建LLM应用的事实标准。它提供了
Agent、Tools、Chains、Memory等高级抽象,能极大地简化智能体的编排逻辑。我们将用它来搭建智能体的主干工作流。 - LlamaIndex:专精于数据连接和检索增强生成(RAG)。我们将用它来构建和管理我们的金融知识库,它提供了比LangChain原生RAG更丰富、更高效的文档加载、索引和检索策略,比如可以轻松集成混合搜索(关键词+向量)。
- LangChain:几乎是当前构建LLM应用的事实标准。它提供了
后端与服务:
- FastAPI:轻量级、高性能的现代Python Web框架。用于构建提供智能体服务的RESTful API,方便前端或其他系统集成。它的异步特性非常适合处理LLM调用这类I/O密集型任务。
- GraphRAG(可选进阶):如果我们的知识库文档内部关联性很强(比如公司股权关系、产业链上下游),可以引入GraphRAG。它能在向量检索的基础上,利用图数据库揭示实体间的深层关系,让智能体的回答更具洞察力,例如回答“美联储加息对A股哪些板块影响最大?”这类问题。
记忆与状态管理:
- 短期记忆:依靠LLM的长上下文(如Qwen-128K)在单次会话中记住对话历史。
- 长期记忆:使用向量数据库(如Chroma, Pinecone或国产的Milvus)来存储和检索历史对话中的关键信息或用户偏好,实现跨会话的“记忆力”。LangChain提供了便捷的集成接口。
工具集(智能体的“手脚”):
- 检索工具(RAG):基于LlamaIndex构建,连接内部金融知识库。
- 计算工具:集成一个安全的Python代码解释器(如
langchain_experimental.utilities.PythonREPL),让智能体能执行简单的金融计算(如复利、夏普比率)。 - 搜索工具:集成SerpAPI或Tavily Search API,用于获取最新的市场新闻、股价等实时信息。
- 专用API工具:封装内部金融数据API,如获取实时K线、财务指标等。
2.3 数据管道与知识库构建
智能体的专业性,很大程度上取决于它的“知识储备”。我们需要构建一个高质量的金融知识库。
数据源:
- 上市公司年报、招股说明书(PDF/HTML)。
- 券商研报(PDF)。
- 宏观经济统计数据(CSV/Excel)。
- 财经新闻稿(RSS/API)。
- 金融百科词条(Markdown)。
处理流程:
- 加载:使用LlamaIndex的
SimpleDirectoryReader或各种DataConnector加载多格式文档。 - 清洗与分割:去除无关格式(页眉页脚)。采用语义分割而非固定长度分割,确保每个文本块意思完整(如一个财务指标说明、一段风险提示)。
- 嵌入与索引:使用
text-embedding-3-small或BGE-M3等嵌入模型将文本块转换为向量,存入向量数据库。同时建立关键词倒排索引,支持混合检索。 - 元数据关联:为每个文本块附加元数据,如
source(来源文件)、date(发布日期)、company(相关公司)、type(年报/新闻/研报)。这能极大提升检索的精准度和答案的可追溯性。
- 加载:使用LlamaIndex的
实操心得:金融文档中表格和数字非常多。简单的文本分割很容易把表格拆散,导致信息丢失。一个技巧是:先用
unstructured或pdfplumber库尝试提取表格结构,将表格转为Markdown或HTML格式作为一个整体文本块处理,或者在元数据中标记为contains_table,在检索时给予不同的权重。
3. 核心模块实现详解
有了清晰的设计,我们就可以开始编码了。这里我将分模块拆解关键实现步骤和代码片段。
3.1 环境搭建与基础配置
首先,创建一个干净的Python环境并安装核心依赖。
# 创建并激活虚拟环境 python -m venv venv_agent source venv_agent/bin/activate # Linux/Mac # venv_agent\Scripts\activate # Windows # 安装核心包 pip install langchain langchain-community langchain-experimental pip install llama-index llama-index-embeddings-openai llama-index-llms-openai pip install fastapi uvicorn pydantic pip install chromadb # 轻量级向量数据库,用于演示 pip install sentence-transformers # 可选,用于本地嵌入模型 pip install python-dotenv # 管理环境变量接下来,创建配置文件.env,管理你的API密钥等敏感信息。
# .env QIANWEN_API_KEY=your_qianwen_api_key_here QIANWEN_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1 OPENAI_API_KEY=sk-xxx # 如果你用GPT或兼容OpenAI的嵌入模型 TAVILY_API_KEY=your_tavily_key # 用于搜索工具然后,在代码中初始化核心组件。
# core/init.py import os from dotenv import load_dotenv from langchain.agents import AgentExecutor, create_react_agent from langchain.memory import ConversationBufferWindowMemory from langchain_community.llms import Tongyi # 假设使用DashScope提供的LangChain集成 from langchain.agents import Tool from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, StorageContext from llama_index.vector_stores.chroma import ChromaVectorStore import chromadb load_dotenv() # 1. 初始化LLM llm = Tongyi( model="qwen-max", # 例如 qwen-max, qwen-plus api_key=os.getenv("QIANWEN_API_KEY"), base_url=os.getenv("QIANWEN_BASE_URL"), temperature=0.1, # 金融场景需要稳定性,温度调低 top_p=0.8, ) # 2. 初始化记忆 memory = ConversationBufferWindowMemory( memory_key="chat_history", k=5, # 保留最近5轮对话 return_messages=True, output_key="output" ) # 3. 准备工具列表 (将在后续步骤中填充) tools = []3.2 工具一:金融知识库检索工具(RAG)的实现
这是智能体的“专业知识库”。我们使用LlamaIndex构建。
# tools/rag_tool.py from llama_index.core import Settings, VectorStoreIndex, SimpleDirectoryReader from llama_index.embeddings.openai import OpenAIEmbedding from llama_index.vector_stores.chroma import ChromaVectorStore from llama_index.core import StorageContext import chromadb from langchain.tools import Tool import os def setup_knowledge_base(): """初始化或加载知识库索引""" # 持久化路径 persist_dir = "./data/chroma_db" # 加载文档 documents = SimpleDirectoryReader("./knowledge_base").load_data() # 初始化嵌入模型 (这里使用OpenAI兼容接口,实际可用BGE等) embed_model = OpenAIEmbedding( api_key=os.getenv("OPENAI_API_KEY"), base_url="https://api.openai.com/v1" # 或你的兼容端点 ) Settings.embed_model = embed_model # 初始化Chroma客户端 chroma_client = chromadb.PersistentClient(path=persist_dir) chroma_collection = chroma_client.get_or_create_collection("financial_knowledge") # 创建向量存储 vector_store = ChromaVectorStore(chroma_collection=chroma_collection) storage_context = StorageContext.from_defaults(vector_store=vector_store) # 创建索引 index = VectorStoreIndex.from_documents( documents, storage_context=storage_context, embed_model=embed_model ) return index def query_financial_knowledge(query: str) -> str: """查询金融知识库的工具函数""" index = setup_knowledge_base() # 生产环境应缓存index,避免重复初始化 query_engine = index.as_query_engine( similarity_top_k=3, # 返回最相关的3个片段 response_mode="compact", # 紧凑模式,将检索到的内容整合后生成答案 ) response = query_engine.query(query) return str(response) # 将函数包装成LangChain Tool financial_rag_tool = Tool( name="Financial_Knowledge_Base", func=query_financial_knowledge, description="""使用此工具查询公司财报、金融术语、宏观经济原理等静态专业知识。 输入应为具体的金融问题,例如:‘什么是市盈率?’、‘贵州茅台2023年的净利润增长率是多少?’。 对于需要最新市场数据或实时股价的问题,请使用搜索工具。""" )3.3 工具二:实时信息搜索工具的实现
智能体需要获取最新信息,比如今日股价、突发新闻。
# tools/search_tool.py from langchain_community.tools import TavilySearchResults from langchain.tools import Tool # 使用Tavily搜索API search_tool = TavilySearchResults( api_key=os.getenv("TAVILY_API_KEY"), max_results=3, # 限制结果数量,控制成本和信息过载 search_depth="advanced" # 获取更全面的结果 ) # 也可以包装一下,增加一些后处理,比如提取关键信息 def refined_search(query: str) -> str: """增强版搜索工具,对结果进行简要总结""" raw_results = search_tool.invoke({"query": query}) # 简单处理:拼接前几个结果的标题和摘要 summary = [] for i, res in enumerate(raw_results[:2]): summary.append(f"[{i+1}] {res.get('title', 'No Title')}: {res.get('content', 'No Content')[:200]}...") return "\n".join(summary) if summary else "未找到相关实时信息。" real_time_search_tool = Tool( name="Real_Time_Search", func=refined_search, description="""使用此工具获取最新的金融市场新闻、实时股价、宏观经济数据发布等动态信息。 输入应为对实时信息的需求,例如:‘今天特斯拉的股价是多少?’、‘最新公布的美国CPI数据如何?’、‘关于央行降息有什么最新新闻?’。 不要用它来查询静态的金融知识。""" )3.4 工具三:金融计算工具的实现
让智能体能进行简单的数学运算,比如计算收益率、年化回报。
# tools/calc_tool.py from langchain_experimental.utilities import PythonREPL from langchain.tools import Tool import re def safe_financial_calculation(calculation_query: str) -> str: """一个相对安全的Python计算工具,仅限于金融计算""" # 1. 输入清洗和验证:只允许数字、基本运算符、金融常用函数和变量名 allowed_pattern = r'^[\d\s\.\+\-\*\/\(\)\%\^\,\=\>\<\!]+$' # 简单检查,防止恶意代码。生产环境需要更严格的沙箱。 if not re.match(allowed_pattern, calculation_query.replace(' ', '')): return "错误:查询包含不被允许的字符,仅支持基本数学计算。" # 2. 尝试将自然语言转换为计算表达式(这里简化,实际可用LLM做转换) # 例如,用户输入“100万投资,年化5%,3年后是多少?” # 我们可以预设一些模板,或者用一个小型LLM来解析。 # 此处为演示,假设用户直接输入Python表达式。 try: python_repl = PythonREPL() # 为计算环境添加一些常用金融库(需提前安装numpy, pandas) # 这里简单演示,实际应在隔离环境中进行 result = python_repl.run(f"print({calculation_query})") return f"计算结果:{result}" except Exception as e: return f"计算过程中出现错误:{str(e)}。请确保输入的是合法的数学表达式。" calculation_tool = Tool( name="Financial_Calculator", func=safe_financial_calculation, description="""使用此工具执行金融相关的数学计算,如收益率、现值、终值、年化回报率等。 输入应为清晰的数学表达式或可被解析为表达式的问题。 例如:‘(1+0.05)**3’,或‘计算100万本金,年利率5%,复利3年后的总额’(后者需要智能体先解析成前者)。 注意:工具仅执行计算,不提供投资建议。""" )3.5 智能体协调器的组装与提示工程
这是最核心的一步,我们将所有工具和记忆组装起来,并设计一个强大的系统提示来驱动智能体。
# agent/orchestrator.py from langchain.agents import AgentExecutor, create_react_agent from langchain.prompts import PromptTemplate from tools.rag_tool import financial_rag_tool from tools.search_tool import real_time_search_tool from tools.calc_tool import calculation_tool # 1. 组装工具列表 tools = [financial_rag_tool, real_time_search_tool, calculation_tool] # 2. 设计系统提示词 - 这是智能体的“灵魂” system_prompt = """你是一位资深的金融信息分析助理。你的职责是专业、准确、清晰地回答用户关于金融市场的所有问题。 你必须遵循以下工作流程: 1. **理解与分析**:仔细分析用户问题,判断问题类型(概念查询、数据查询、计算分析、实时信息、综合问题)。 2. **规划与工具选择**: a) 如果是静态金融概念、历史财报数据、理论原理 -> 优先使用`Financial_Knowledge_Base`工具。 b) 如果是实时股价、最新新闻、刚刚发布的经济数据 -> 使用`Real_Time_Search`工具。 c) 如果涉及收益率、比率、增长计算等数学问题 -> 使用`Financial_Calculator`工具。 d) 如果是复杂问题,可能需要按顺序或组合使用多个工具。 3. **执行与综合**:调用相应工具获取信息,并对工具返回的结果进行批判性思考、对比和整合。如果信息冲突,以权威来源或最新数据为准。 4. **生成回答**: - 答案应结构清晰,可分段、分点。 - 关键数据或结论应加粗。 - 如果引用了工具结果,应在末尾简要说明信息来源(例如:“根据实时搜索信息...”,“根据知识库记载...”)。 - **务必在回答涉及投资建议或预测的部分末尾,自动添加以下合规声明**: “【风险提示】以上分析基于公开信息,不构成任何投资建议。市场有风险,投资需谨慎。” 5. **无法回答**:如果所有工具都无法提供有效信息,请诚实告知用户“根据目前掌握的信息,我无法给出确切答案”,并尝试提供相关查询思路。 请开始你的工作。当前对话历史:{chat_history} 用户问题:{input} 请一步步思考(Thought),决定需要采取的行动(Action)和使用的工具(Action Input),然后根据观察(Observation)得出最终答案(Final Answer)。 """ # 3. 创建ReAct风格的智能体 prompt_template = PromptTemplate.from_template(system_prompt) agent = create_react_agent(llm, tools, prompt_template) # 4. 创建执行器,并注入记忆 agent_executor = AgentExecutor( agent=agent, tools=tools, memory=memory, verbose=True, # 开发时打开,可以看到智能体的思考过程 handle_parsing_errors=True, # 优雅处理解析错误 max_iterations=5, # 防止智能体陷入循环 early_stopping_method="generate", # 达到最大迭代或找到答案后停止 ) # 5. 查询函数 def ask_financial_agent(question: str) -> str: """向金融智能体提问""" response = agent_executor.invoke({"input": question}) return response["output"]3.6 服务层封装与API暴露
最后,我们用FastAPI将智能体包装成一个Web服务。
# main.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel from agent.orchestrator import ask_financial_agent import uvicorn app = FastAPI(title="金融大模型问答智能体API") class QueryRequest(BaseModel): question: str class QueryResponse(BaseModel): answer: str session_id: str = None # 可用于扩展多会话管理 @app.post("/query", response_model=QueryResponse) async def query_agent(request: QueryRequest): """接收用户问题,返回智能体答案""" try: answer = ask_financial_agent(request.question) return QueryResponse(answer=answer) except Exception as e: raise HTTPException(status_code=500, detail=f"智能体处理出错:{str(e)}") @app.get("/health") async def health_check(): return {"status": "healthy"} if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000)现在,运行python main.py,你的智能体服务就在本地8000端口启动了。你可以通过curl或Postman发送请求:
curl -X POST "http://localhost:8000/query" \ -H "Content-Type: application/json" \ -d '{"question": "请帮我对比一下贵州茅台和宁德时代2023年的净利润增长率,并计算如果我从三年前开始每年定投10万到沪深300指数,年化收益假设为8%,现在总资产大概是多少?"}'4. 性能优化与进阶技巧
一个基础的智能体跑起来后,我们还需要关注它的稳定性、准确性和效率。以下是几个关键的优化方向。
4.1 提示工程优化:让思考更可控
基础的ReAct提示有时会“胡思乱想”或调用错误的工具。我们可以通过以下方式优化:
- 少样本示例(Few-Shot):在系统提示中提供几个正确调用工具的例子。
示例1: 用户:茅台今天的股价多少? 思考:用户需要实时股价信息,应使用实时搜索工具。 行动:使用`Real_Time_Search`工具,查询“贵州茅台 今日股价”。 观察:[工具返回结果...] 最终答案:根据实时市场数据,贵州茅台(600519.SH)今日收盘价为... - 结构化输出要求:明确要求智能体以特定JSON格式输出思考步骤,便于后端解析和错误处理。
- 后处理校验:对智能体生成的最终答案,可以用一个简单的规则或另一个轻量级LLM调用进行事实性、合规性校验。
4.2 检索增强生成(RAG)的深度优化
RAG的效果直接决定答案的专业性。
- 混合检索:结合向量检索(语义相似度)和关键词检索(BM25)。LlamaIndex的
VectorIndexAutoRetriever可以轻松配置。 - 重排序(Re-ranking):初步检索出10个片段后,使用一个更精细的交叉编码器模型(如
bge-reranker)对它们进行重排序,选出最相关的3个,能显著提升精度。 - 元数据过滤:在检索时加入过滤器,例如
filters=[("company", "==", "贵州茅台"), ("year", "==", "2023")],确保信息精准。 - 查询扩展:使用LLM将用户原始问题扩展或重写为多个相关查询,同时进行检索,然后合并结果,避免遗漏。
4.3 记忆管理的策略
- 摘要式记忆:对于长对话,不要简单地把所有历史对话都塞进上下文。可以使用LLM定期对之前的对话进行摘要,只将摘要和最近几轮对话作为短期记忆,节省token并聚焦重点。
- 实体记忆:自动从对话中提取关键实体(如公司名、产品名、用户偏好),存入长期记忆(向量库或传统数据库),在后续对话中主动关联。
4.4 评估与持续改进
如何知道你的智能体好不好?
- 构建测试集:整理一批涵盖各类金融问题的测试用例(概念、计算、实时、综合)。
- 定义评估指标:
- 答案相关性:答案是否直接回应了问题?
- 事实准确性:答案中的数据、事实是否正确?可人工或基于知识库验证。
- 工具调用准确率:智能体是否在合适的时候调用了正确的工具?
- 合规性:风险提示是否在需要时被正确添加?
- A/B测试:对比不同提示词、不同检索策略、不同LLM模型下的表现。
- 日志与反馈循环:记录所有用户交互,特别是智能体出错的案例。定期分析这些日志,找出系统弱点,反过来优化提示、工具或知识库。
5. 常见问题与避坑指南
在实际开发和调试中,我遇到了不少坑,这里分享一些典型的排查思路和解决方案。
5.1 智能体陷入循环或调用错误工具
- 现象:智能体反复调用同一个工具,或者在一个简单问题上进行多轮无意义的“思考-行动-观察”。
- 原因:提示词中对任务终止的条件描述不清晰;工具的描述不够准确,导致LLM无法正确匹配。
- 解决:
- 在
AgentExecutor中设置max_iterations(如5次)和early_stopping_method。 - 优化工具的描述(
description字段),务必清晰说明何时使用以及输入格式。 - 在系统提示中明确加入:“如果你已经通过工具获得了足够的信息来回答问题,请直接给出最终答案,不要继续调用工具。”
- 在
5.2 RAG检索结果不相关,导致答案胡编乱造
- 现象:回答看起来有模有样,但仔细核对发现数据或结论与知识库内容不符。
- 原因:文本分割不合理,导致检索到的片段语义不完整;嵌入模型对专业术语表征不好;没有进行重排序。
- 解决:
- 检查分割:打印出每次查询检索到的原始文本片段,看是否完整表达了某个意思。
- 尝试不同嵌入模型:对于中文金融文本,可以测试
text-embedding-3-small、BGE-M3、M3E等,选择在相似任务上评估效果好的。 - 引入重排序:这是提升RAG精度性价比最高的方法之一。
- 增加元数据过滤:让用户问题中的实体(公司、时间)作为过滤条件。
5.3 计算工具的安全风险
- 现象:用户输入恶意代码
__import__('os').system('rm -rf /')。 - 原因:直接执行未经严格校验的Python代码。
- 解决:
- 输入清洗:像之前代码所示,使用严格的正则表达式白名单过滤。
- 沙箱环境:在Docker容器或
restrictedpython等沙箱中运行计算代码。 - 限制功能:只暴露有限的、安全的数学函数和库(如
math,numpy的部分函数),禁止导入和文件操作。 - 自然语言转表达式:不让用户直接输入代码,而是让LLM先将问题解析成安全的数学表达式字符串,再交给计算工具执行。
5.4 响应速度慢
- 现象:用户查询需要等待10秒以上才有响应。
- 原因:LLM API调用延迟高;串行调用多个工具;检索过程慢。
- 解决:
- 异步调用:如果多个工具调用之间没有依赖关系,可以使用
asyncio并发执行。 - 缓存:对常见的、结果变化不频繁的查询(如“什么是市盈率?”)的结果进行缓存。
- 优化检索:确保向量索引已构建好并加载到内存;考虑使用更快的向量数据库(如PGVector的IVFFlat索引、Milvus)。
- 流式输出:对于长答案,可以采用流式传输(Server-Sent Events),让用户先看到一部分结果,提升体验。
- 异步调用:如果多个工具调用之间没有依赖关系,可以使用
5.5 成本控制
- 挑战:智能体每次调用都可能涉及多次LLM API请求(规划、工具调用解析、最终生成)和向量检索,成本可能快速上升。
- 策略:
- 分层模型:对于工具选择、查询改写等简单任务,使用便宜的小模型(如Qwen-1.8B-Chat的API);对于最终答案合成,使用能力强的大模型。
- 设置预算和限流:在API网关层对用户或API Key设置每分钟/每日调用次数和Token消耗上限。
- 监控与告警:建立成本监控仪表盘,对异常高的调用量或Token消耗设置告警。
构建一个“满屏的智能体”概念下的实战应用,就像组装一台精密仪器。它需要清晰的架构设计、扎实的模块实现、细致的调优和持续的关注。这个金融问答机器人项目提供了一个完整的蓝图,你可以在此基础上,更换知识库、增加新工具(如连接数据库查询持仓、接入风控模型),就能将其快速适配到法律咨询、医疗诊断、客服自动化等无数个领域。智能体的时代,真正的门槛不在于理解概念,而在于拥有将概念工程化、产品化的能力。希望这篇详尽的实战指南,能成为你跨越这道门槛的一块坚实垫脚石。