基于 DeepSeek + MateChat 的证券智能投顾技术实践:打造金融领域的专属大Q模型助手

随着AI大模型技术的突破性发展,证券行业正经历从传统"人海战术"向"人机协同"的深刻转型。据IDC报告显示,2024年中国金融业对AI及生成式AI的投入规模达196.94亿元,预计到2027年将增长至415.48亿元。

然而,传统投顾服务效率低,标准化不高,个性化能力有限,如何基于金融领域数据构建安全可靠的智能投顾系统,成为证券行业数字化转型的关键课题。在这一背景下, MateChat 框架为证券智能投顾系统的快速构建提供了理想的解决方案。

本文将探索并实践基于 MateChat 框架的证券智能投顾技术方案,详细阐述其架构设计、训练流程和部署策略,为金融科技开发者提供一套可落地的技术解决方案。

一、架构解析

1.1、MateChat 框架概览

MateChat 是一款生成式人工智能体验设计系统,以及企业级前端解决方案。其基于OpenAI、Midjourney、Google、Claude等业界领先的AI大模型厂商提供的API,实现了一站式多模型AI应用。

它以Vue3和TypeScript为基础,结合了组件化设计理念,提供了如McBubble(消息气泡组件)、McLayout(对话布局容器)、McInput(输入组件)等一系列与对话交互相关的组件。不仅支持Markdown语法,还提供了代码高亮、复制、折叠等功能,极大地丰富了对话内容的表现形式。

此外,MateChat还具备主题定制能力,支持明暗色模式切换以及通过CSS变量进行扩展,满足不同用户对于界面风格的需求。这些特性使得MateChat在构建智能对话界面时具有高度的灵活性和可扩展性,为证券智能投顾系统的前端开发提供了有力支持。

1.2、证券智能投顾平台定位

构建证券智能投顾系统时,我们采用了分层架构设计,将整个系统分为数据层、服务层和应用层。数据层主要负责实时行情数据的接入、用户行为数据的收集、知识图谱的构建以及历史数据的存储,为系统提供丰富的数据支持。服务层则是整个系统的核心,集成了NLP语义理解、风险评估模型、投资组合优化以及合规风控引擎等功能模块,通过对数据层提供的数据进行分析和处理,生成智能投顾所需的各类服务。应用层则主要面向用户,提供了MateChat对话界面,实现了多轮对话管理、个性化推荐以及实时监控面板等功能,为用户提供了便捷、高效的智能投顾体验。

1.3、MateChat组件架构

在前端实现方面,MateChat的组件架构发挥了关键作用。通过McLayout组件,我们搭建了一个简洁、清晰的对话布局容器,为用户与系统之间的对话提供了一个良好的交互环境。McBubble组件则负责以气泡形式展示对话内容,使得对话信息更加直观易读。McInput组件为用户提供了一个便捷的输入框,支持用户输入各种形式的问题或指令。此外,McPrompt组件提供了快捷提示功能,帮助用户快速触发一些常用的操作或查询。而McMarkdownCard组件则能够将Markdown格式的内容进行渲染,使得系统回复的内容可以包含丰富的格式和排版效果,如图表、代码等,进一步提升了用户体验。这些组件相互配合,构建了一个功能强大且具有高度可定制性的智能投顾对话界面。

二、打造金融领域的专属大模型助手

2.1、环境准备

首先进入控制台,输入npm create vite@latest使用vite首先初始化一个vue+ts项目,选择Vue和JS:

然后输入:npm i vue-devui @matechat/core @devui-design/icons ,安装所需的依赖文件,这里要注意使用node 20.19+或者 22.12+的版本,否则无法使用vite。

然后,在main.ts文件中引入matechat, 图标库 样式文件

javascript 复制代码
import { createApp } from 'vue';
import App from './App.vue';

import MateChat from '@matechat/core';

import '@devui-design/icons/icomoon/devui-icon.css';

createApp(App).use(MateChat).mount('#app');

之后,就可以在任意文件中使用 MateChat 组件了,比如:

xml 复制代码
<template>
  <McLayout class="container">
    <McHeader :title="'MateChat'" :logoImg="'https://matechat.gitcode.com/logo.svg'">
      <template #operationArea>
        <div class="operations">
          <i class="icon-helping"></i>
        </div>
      </template>
    </McHeader>
    <McLayoutContent
      v-if="startPage"
      style="display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px"
    >
      <McIntroduction
        :logoImg="'https://matechat.gitcode.com/logo2x.svg'"
        :title="'MateChat'"
        :subTitle="'Hi,欢迎使用 MateChat'"
        :description="description"
      ></McIntroduction>
      <McPrompt
        :list="introPrompt.list"
        :direction="introPrompt.direction"
        class="intro-prompt"
        @itemClick="onSubmit($event.label)"
      ></McPrompt>
    </McLayoutContent>
    <McLayoutContent class="content-container" v-else>
      <template v-for="(msg, idx) in messages" :key="idx">
        <McBubble
          v-if="msg.from === 'user'"
          :content="msg.content"
          :align="'right'"
          :avatarConfig="{ imgSrc: 'https://matechat.gitcode.com/png/demo/userAvatar.svg' }"
        >
        </McBubble>
        <McBubble v-else :content="msg.content" :avatarConfig="{ imgSrc: 'https://matechat.gitcode.com/logo.svg' }" :loading="msg.loading"> </McBubble>
      </template>
    </McLayoutContent>
    <div class="shortcut" style="display: flex; align-items: center; gap: 8px">
      <McPrompt
        v-if="!startPage"
        :list="simplePrompt"
        :direction="'horizontal'"
        style="flex: 1"
        @itemClick="onSubmit($event.label)"
      ></McPrompt>
      <Button
        style="margin-left: auto"
        icon="add"
        shape="circle"
        title="新建对话"
        size="md"
        @click="newConversation"
      />
    </div>
    <McLayoutSender>
      <McInput :value="inputValue" :maxLength="2000" @change="(e) => (inputValue = e)" @submit="onSubmit">
        <template #extra>
          <div class="input-foot-wrapper">
            <div class="input-foot-left">
              <span v-for="(item, index) in inputFootIcons" :key="index">
                <i :class="item.icon"></i>
                {{ item.text }}
              </span>
              <span class="input-foot-dividing-line"></span>
              <span class="input-foot-maxlength">{{ inputValue.length }}/2000</span>
            </div>
            <div class="input-foot-right">
              <Button icon="op-clearup" shape="round" :disabled="!inputValue" @click="inputValue = ''"><span class="demo-button-content">清空输入</span></Button>
            </div>
          </div>
        </template>
      </McInput>
    </McLayoutSender>
  </McLayout>
</template>

<script setup lang="ts">
import { ref } from 'vue';
import { Button } from 'vue-devui/button';
import 'vue-devui/button/style.css';

const description = [
  'MateChat 可以辅助研发人员编码、查询知识和相关作业信息、编写文档等。',
  '作为AI模型,MateChat 提供的答案可能不总是确定或准确的,但您的反馈可以帮助 MateChat 做的更好。',
];
const introPrompt = {
  direction: 'horizontal',
  list: [
    {
      value: 'quickSort',
      label: '帮我写一个快速排序',
      iconConfig: { name: 'icon-info-o', color: '#5e7ce0' },
      desc: '使用 js 实现一个快速排序',
    },
    {
      value: 'helpMd',
      label: '你可以帮我做些什么?',
      iconConfig: { name: 'icon-star', color: 'rgb(255, 215, 0)' },
      desc: '了解当前大模型可以帮你做的事',
    },
    {
      value: 'bindProjectSpace',
      label: '怎么绑定项目空间',
      iconConfig: { name: 'icon-priority', color: '#3ac295' },
      desc: '如何绑定云空间中的项目',
    },
  ],
};
const simplePrompt = [
  {
    value: 'quickSort',
    iconConfig: { name: 'icon-info-o', color: '#5e7ce0' },
    label: '帮我写一个快速排序',
  },
  {
    value: 'helpMd',
    iconConfig: { name: 'icon-star', color: 'rgb(255, 215, 0)' },
    label: '你可以帮我做些什么?',
  },
];
const startPage = ref(true);
const inputValue = ref('');
const inputFootIcons = [
  { icon: 'icon-at', text: '智能体' },
  { icon: 'icon-standard', text: '词库' },
  { icon: 'icon-add', text: '附件' },
];

const messages = ref<any[]>([]);

const newConversation = () => {
  startPage.value = true;
  messages.value = [];
}

const onSubmit = (evt) => {
  inputValue.value='';
  startPage.value = false;
  // 用户发送消息
  messages.value.push({
    from: 'user',
    content: evt,
  });
  setTimeout(() => {
    // 模型返回消息
    messages.value.push({
      from: 'model',
      content: evt,
    });
  }, 200);
};
</script>

<style>
.container {
  width: 1000px;
  margin: 20px auto;
  height: calc(100vh - 82px);
  padding: 20px;
  gap: 8px;
  background: #fff;
  border: 1px solid #ddd;
  border-radius: 16px;
}

.content-container {
  display: flex;
  flex-direction: column;
  gap: 8px;
  overflow: auto;
}

.input-foot-wrapper {
  display: flex;
  justify-content: space-between;
  align-items: center;
  width: 100%;
  height: 100%;
  margin-right: 8px;

  .input-foot-left {
    display: flex;
    align-items: center;
    gap: 8px;

    span {
      font-size: 14px;
      line-height: 18px;
      color: #252b3a;
      cursor: pointer;
    }

    .input-foot-dividing-line {
      width: 1px;
      height: 14px;
      background-color: #d7d8da;
    }

    .input-foot-maxlength {
      font-size: 14px;
      color: #71757f;
    }
  }

  .input-foot-right {
    .demo-button-content {
      font-size: 14px;
    }

    & > *:not(:first-child) {
      margin-left: 8px;
    }
  }
}
</style>

显示出Hello,MateChat这样,即为安装成功:

2.2、对接DeepSeek API

首先要安装OpenAI支持,直接终端输入npm install openai安装依赖

然后需要对接API,这里我们以DeepSeek为例,DeepSeek API 使用与 OpenAI 兼容的 API 格式,首先,前往DeepSeek开发平台,创建API Key:

然后将代码中onSubmit方法替换成接入DeepSeek的代码:

ini 复制代码
const client = ref<OpenAI>();

client.value = new OpenAI({
  apiKey: '', // 模型APIKey
  baseURL: '', // 模型API地址
  dangerouslyAllowBrowser: true, // 浏览器环境使用需要开启
});

const onSubmit = (evt) => {
  inputValue.value = '';
  startPage.value = false;
  // 用户发送消息
  messages.value.push({
    from: 'user',
    content: evt,
    avatarConfig: { name: 'user' },
  });

  fetchData(evt);
};

const fetchData = async (ques) => {
  messages.value.push({
    from: 'model',
    content: '',
    avatarConfig: { name: 'model' },
    id: '',
    loading: true,
  });
  const completion = await client.value!.chat.completions.create({
    model: 'deepseek-reasoner', // 根据deepseek模型列表进行替换
    messages: [{ role: 'user', content: ques }],
    stream: true, // 为 true 则开启接口的流式返回
  });
  messages.value[messages.value.length - 1].loading = false;
  for await (const chunk of completion) {
    const content = chunk.choices[0]?.delta?.content || '';
    const chatId = chunk.id;
    messages.value[messages.value.length - 1].content += content;
    messages.value[messages.value.length - 1].id = chatId;
  }
};

并且填入刚刚复制的API key,baseURL就填api.deepseek.com/v1即可成功调用dee...

2.3、开始改造

在完成基础API对接后,参考金融领域的特点,借鉴MateChat在智能对话和业务集成方面的设计理念,对金融助手进行全面的功能增强和业务逻辑优化:

首先针对金融领域构建对应的提示词,让模型在分析当前对话,能够自动根据金融话题类型(如股票分析、风险评估、财务规划),自动构建领域特定的提示词模板,提示词库如下:

css 复制代码
// 提示词库
export const PROMPT_TEMPLATES: Record<FinancialTopic, FinancialPromptTemplate> = {
  [FinancialTopic.STOCK_ANALYSIS]: {
    topic: '股票分析',
    template: `作为专业金融分析师,请对{stockName}进行全面的投资价值分析。

请按照以下框架进行分析:
1. 基本面分析:包括财务指标(市盈率、市净率、ROE等)、盈利能力、成长性
2. 技术面分析:价格走势、成交量、技术指标
3. 行业分析:行业地位、竞争格局、发展前景
4. 估值分析:合理估值区间、投资建议

要求:
- 提供具体数据支撑
- 分析要客观全面
- 给出明确的风险提示
- 建议要具有可操作性`,
    requiredMetrics: ['市盈率', '市净率', 'ROE', '营收增长率', '净利润增长率'],
    qualityCriteria: ['数据准确性', '分析深度', '风险提示', '可操作性']
  },
  [FinancialTopic.INVESTMENT_STRATEGY]: {
    topic: '投资策略',
    template: `作为专业投资顾问,请为{riskProfile}风险偏好的投资者制定投资策略。

投资目标:{investmentGoal}
投资期限:{timeHorizon}

请提供:
1. 资产配置建议(股票、债券、现金等比例)
2. 具体投资标的推荐
3. 风险管理措施
4. 定期调整策略

要求:
- 策略要符合风险偏好
- 提供历史回测数据
- 考虑市场环境因素
- 给出明确的执行步骤`,
    requiredMetrics: ['预期收益率', '最大回撤', '夏普比率', '资产相关性'],
    qualityCriteria: ['风险匹配度', '历史表现', '适应性', '执行可行性']
  },
  [FinancialTopic.RISK_ASSESSMENT]: {
    topic: '风险评估',
    template: `作为专业风险评估师,请对{investmentTarget}进行全面的风险评估。

评估维度:
1. 市场风险:价格波动、系统性风险
2. 信用风险:违约概率、信用评级
3. 流动性风险:变现能力、交易成本
4. 操作风险:管理风险、技术风险

要求:
- 使用量化风险评估方法
- 提供风险等级评分
- 给出风险控制建议
- 考虑极端市场情况`,
    requiredMetrics: ['波动率', 'VAR值', '最大回撤', '信用评级'],
    qualityCriteria: ['量化程度', '全面性', '实用性', '前瞻性']
  },
  [FinancialTopic.FINANCIAL_PLANNING]: {
    topic: '财务规划',
    template: `作为专业财务规划师,请为{clientProfile}制定个性化的财务规划方案。

当前财务状况:{currentSituation}
财务目标:{financialGoals}

规划内容:
1. 现金流管理:收入支出优化
2. 资产配置:投资组合建议
3. 风险管理:保险规划
4. 税务优化:合理避税策略

要求:
- 方案要个性化定制
- 考虑生命周期阶段
- 提供具体执行计划
- 包含定期评估机制`,
    requiredMetrics: ['现金流', '资产负债率', '储蓄率', '投资回报率'],
    qualityCriteria: ['个性化程度', '全面性', '可执行性', '长期性']
  }
};

其次,通过预设的金融专业知识图谱和关键指标检查清单,对AI返回的内容进行自动质量评分。当检测到回答过于笼统或缺乏具体数据支撑时,系统会触发自动追问机制,要求补充具体案例或数据依据,确保输出内容达到金融专业标准部分核心代码如下;

typescript 复制代码
// 话题检测函数
export function detectFinancialTopic(userInput: string): FinancialTopic | null {
  const topicKeywords: Record<FinancialTopic, string[]> = {
    [FinancialTopic.STOCK_ANALYSIS]: ['股票', '股价', '市盈率', '市净率', '财报', '估值'],
    [FinancialTopic.INVESTMENT_STRATEGY]: ['投资', '策略', '组合', '配置', '资产', '收益'],
    [FinancialTopic.RISK_ASSESSMENT]: ['风险', '评估', '波动', '回撤', '安全', '稳健'],
    [FinancialTopic.FINANCIAL_PLANNING]: ['财务', '规划', '理财', '储蓄', '退休', '税务'],
    [FinancialTopic.MARKET_TREND]: ['市场', '趋势', '行情', '预测', '宏观', '经济'],
    [FinancialTopic.PORTFOLIO_MANAGEMENT]: ['组合', '管理', '优化', '再平衡', '分散']
  };

  for (const [topic, keywords] of Object.entries(topicKeywords)) {
    if (keywords.some(keyword => userInput.includes(keyword))) {
      return topic as FinancialTopic;
    }
  }

  return null;
}

// 提示词生成器
export function generateFinancialPrompt(topic: FinancialTopic, context: Record<string, string> = {}): string {
  const template = PROMPT_TEMPLATES[topic];
  if (!template) return '';

  let prompt = template.template;

  // 替换模板中的变量
  Object.entries(context).forEach(([key, value]) => {
    prompt = prompt.replace(new RegExp(`{${key}}`, 'g'), value);
  });

  return prompt;
}

// 质量评分函数
export function assessAnswerQuality(answer: string, topic: FinancialTopic): {
  score: number;
  feedback: string[];
  needsFollowUp: boolean;
} {
  const template = PROMPT_TEMPLATES[topic];
  if (!template) {
    return { score: 0, feedback: ['无法评估该话题的回答质量'], needsFollowUp: false };
  }

  const feedback: string[] = [];
  let score = 0;
  let criteriaMet = 0;

  // 检查是否包含必要指标
  template.requiredMetrics.forEach(metric => {
    if (answer.includes(metric)) {
      criteriaMet++;
      score += 20;
    } else {
      feedback.push(`缺少${metric}相关分析`);
    }
  });

  // 检查数据支撑
  const hasDataSupport = /\d+(.\d+)?%?/.test(answer) ||
    answer.includes('数据') ||
    answer.includes('统计') ||
    answer.includes('报告');

  if (hasDataSupport) {
    criteriaMet++;
    score += 20;
  } else {
    feedback.push('回答缺乏具体数据支撑');
  }

  // 检查分析深度
  const analysisDepth = (answer.match(/\n/g) || []).length > 5;
  if (analysisDepth) {
    criteriaMet++;
    score += 20;
  } else {
    feedback.push('分析深度不足,建议提供更详细的分析');
  }

  const needsFollowUp = criteriaMet < template.requiredMetrics.length / 2;

  return {
    score: Math.min(100, score),
    feedback,
    needsFollowUp
  };
}

// 自动追问生成器
export function generateFollowUpQuestion(topic: FinancialTopic, missingMetrics: string[]): string {
  const knowledge = FINANCIAL_KNOWLEDGE_GRAPH[topic];
  if (!knowledge) return '请提供更详细的信息以便进行专业分析。';

  if (missingMetrics.length > 0) {
    return `为了更好地进行${PROMPT_TEMPLATES[topic]?.topic || '专业'}分析,请提供以下信息:${missingMetrics.join('、')}相关的具体数据或情况。`;
  }

  return `为了提供更精准的分析,能否分享更多关于${knowledge.keyMetrics.slice(0, 3).join('、')}的信息?`;
}

最后,在交互设计上,参考华为MateChat的工具集成思路,在对话流中无缝嵌入金融工具模块。用户可以在不中断对话的情况下,直接调用复利计算器进行收益测算,使用风险评估问卷进行风险承受能力评估,或者启动收益模拟器进行投资情景分析。这种深度集成的设计大大提升了用户体验和操作效率。

当然,还可以进一步基于现有架构进行模块化扩展,提升金融助手的专业服务能力:

  • 实时行情监控功能 - 集成股票、基金、指数的实时价格数据,支持设置价格预警阈值,当标的达到目标价位时主动推送提醒。
  • 财报智能解读功能 - 自动解析上市公司财务报表,提取关键财务比率,进行同业对比分析,生成通俗易懂的财务健康度报告。
  • 市场情绪分析功能 - 整合网络舆情数据,运用自然语言处理技术分析市场情绪指数,为投资决策提供参考依据。

三、总结

在AI大模型技术迅猛发展的背景下,证券行业正经历着从传统服务模式向智能化、个性化服务的深刻转型。华为MateChat作为业界领先的AI对话组件库,以其完善的技术架构和灵活的组件化设计,为证券智能投顾系统的快速构建提供了理想的技术基础。

其专为GenAI对话打造的输入区域支持多模态内容输入和丰富的扩展功能。可配置的快捷指令、模板化输入和智能补全能力,让用户能够自由、准确地表达复杂需求。输入区域的模块化设计便于快速适配不同业务的特定需求,保持核心体验一致的同时支持灵活扩展。

在探索这一技术的过程中,我们也发现DevUI设计系统为构建高质量的用户界面提供了强大的支持。DevUI不仅提供了丰富的组件和灵活的定制能力,还注重设计的一致性和用户体验,能够帮助开发者更好地实现金融领域的复杂交互需求。如果你对MateChat框架的深度应用感兴趣,或者想了解如何通过DevUI打造更优质的用户交互体验,深入了解DevUI的丰富组件和设计理念,不妨关注MateChat官网DevUI官网,获取更多实用信息和技术支持,共同推动金融科技的创新与发展。

展望未来,随着多模态交互、实时数据处理等技术的持续演进,MateChat将在智能投顾领域展现出更大潜力,华为MateChat有望成为连接AI技术与金融服务的重要桥梁,推动整个行业向智能化、个性化服务的新阶段迈进。

相关推荐
凡人程序员39 分钟前
搭建简易版monorepo + turborepo
前端·javascript
丸子哥哥39 分钟前
同一个域名,如何添加多个网站?
服务器·前端·nginx·微服务
不努力也不会混39 分钟前
vite联邦实现微前端(vite-plugin-federation)
前端·vue.js
伍亿伍千万41 分钟前
Uptime Kuma修改作为内嵌页面的自适应
前端
deephub43 分钟前
从零开始:用Python和Gemini 3四步搭建你自己的AI Agent
人工智能·python·大语言模型·agent
Heo43 分钟前
原来Webpack在大厂中这样进行性能优化!
前端·javascript·vue.js
涔溪44 分钟前
Vue2 项目中通过封装 axios 来同时连接两个不同的后端服务器
前端·vue.js·axios
算家计算1 小时前
DeepSeek开源IMO金牌模型!跑出数学推理新高度,你的算力准备好了吗?
人工智能·资讯·deepseek
Codebee1 小时前
SOLO+OODER全栈框架:图生代码与组件化重构实战指南
前端·人工智能