有同学春节假期问到这个问题,如何设计一款财经AI智能问答应用。 这里聊一聊技术方案
本文偏技术理论,适合有编程基础的程序员阅读。这里主要分析下技术架构
我们要构建的系统,本质上是一个 “函数调用智能体” 。
传统的RAG(检索增强生成)是从文档中检索文本片段,而财经场景下,用户需要的往往不是枯燥的条款,而是实时的数据。比如“贵州茅台现在的市盈率是多少?”或者“今天的涨幅榜前十是谁?”。
这些数据不存在于任何静态文档中,它们只存在于实时变动的数据库或第三方API接口中。因此,我们的设计核心是将自然语言映射为API调用指令。
我们的系统架构分为三层:
这是系统的基石。我们需要将公司内部或外部的财经API进行标准化封装,并生成一份详细的“说明书”。这份说明书不是给人看的,而是给向量数据库用的。
我们将description(描述)和api_name进行向量化存入向量数据库。这一步的关键在于描述的准确性,它直接决定了LLM能否通过向量搜索找到正确的接口。
当用户提问:“今天涨幅榜前10的股票有哪些?”
系统首先会将用户的Query进行Embedding处理,然后在API向量库中进行语义匹配。
在这个环节,由于用户问的是“涨幅榜前10”,系统会计算其与库中get_stock_rise_rank接口描述的余弦相似度。如果匹配度得分超过设定阈值(如0.85),则判定为 “API调用意图” ,比如采用阿里的PGVector等。
如果向量库中没有匹配的API(例如用户问“什么是市盈率”),系统则直接路由至大模型的通用知识库进行回答,并标注“仅供参考”。这就是我们常说的兜底策略。
找到了API仅仅是第一步,接下来需要LLM发挥“填空题”的能力。
系统将匹配到的API Schema(JSON结构)和用户的原始问题一同喂给大模型(Prompt示例):
System: 你是一个API调用参数提取助手。根据用户的问题和提供的API定义,提取出JSON格式的参数。User: 今天涨幅榜前10的股票有哪些?API Definition: { "api_id": "get_stock_rise_rank", "parameters": {"limit": ...} }Output: 请输出JSON参数。
LLM经过推理,会输出:
json{
"api_id": "get_stock_rise_rank",
"parameters": {
"limit": 10,
"market": "沪深"
}
}
这是 “硬核实现” 的环节。系统拿到LLM生成的JSON参数后,后端服务需要真正的去调用接口。
这里的设计要点在于“具体实现”:
SELECT * FROM stocks ORDER BY change_pct DESC LIMIT 10),或者通过HTTP请求聚合第三方数据源(如迅投miniqmt、东财等)。如果不想自研,也可以采用 Qveris等现成方案,打不了花钱解决呗。
在老家待了快1个月时间,准备周末回杭了。