XuanYuan-FinX1-Preview
介绍
轩辕-FinX1是金融领域首个类GPT-O1推理大模型,采用创新的思维链+过程奖励+强化学习训练范式,显著提升逻辑推理能力,并可展示O1模型未公开的完整思考过程,为金融决策提供更深入的洞察。轩辕-FinX1针对金融场景中的分析、决策和数据处理任务进行了深度优化。轩辕-FinX1由度小满AI-Lab研发,本次发布的是预览版本,现已在开源社区开放免费下载。后续优化版本也将持续开源,供用户下载使用。
轩辕-FinX1能够在生成回答前先呈现完整的思考过程,构建从问题拆解到最终结论的全透明思维链。
更多信息请参考GitHub主页:https://github.com/Duxiaoman-DI/XuanYuan
技术路线
为了实现大模型具备类O1的推理能力,尤其是在金融领域复杂的决策分析场景中,我们经过大量的探索和验证,提出包含三个关键步骤的技术方案:构建稳定的思维链生成模型、金融决策加强的双奖励模型、PRM和ORM双引导下的强化学习微调。
初步构建稳定的思维链生成模型
针对金融领域复杂的决策分析场景,我们构建了具备稳定思维链生成能力的基础模型。首先是高质量COT/Answer的数据合成,先根据问题生成思考过程,再根据问题与思考过程生成最终答案。通过这种策略,模型能够专注于每个阶段的任务,产生更连贯的推理链条和答案。 对于不同领域(如数学、逻辑推理、金融分析等),我们设计了专门的数据合成方法,比如对于金融分析类任务,我们设计一种迭代式合成方法,确保分析过程全面性,之后基于XuanYuan3.0模型采用指令微调进行训练,采用统一的思考过程 答案输出格式(我们本次也会将粗粒度的思考节点进行公开),同时重点构造了较多的长文本数据来增强模型的长上下文处理能力,使其能够“先生成详细的思考过程,再生成答案”,这为后续的过程监督训练和强化学习优化奠定了坚实基础。
金融决策加强的双奖励模型
为了评估模型在金融决策场景下的表现,我们设计了结果导向(ORM)和过程级(PRM)两个互补的奖励模型。其中ORM延续了XuanYuan3.0的技术方案,采用对比学习和逆强化学习的方式训练;PRM则是我们针对推理过程的创新,重点解决了开放性金融问题(如市场分析、投资决策等)的评估难题。对于PRM的训练数据构建,我们针对不同场景采用了不同策略:对于风险评级等有确定答案的问题,使用基于MCTS的反向验证方法;对于开放性的金融分析问题,则通过多个大模型从正确性、必要性、逻辑性等维度进行标注,并通过下采样和主动学习解决了数据不平衡问题。在训练过程中,PRM使用有监督微调方式,通过对每个思考步骤的评分来优化模型。
PRM和ORM双引导下的强化学习微调
在强化学习阶段,我们采用PPO算法进行模型优化,将PRM和ORM作为奖励信号。对于和之间的思考过程,使用PRM在每个思考步骤进行打分,及时发现和纠正思考路径中的错误;对于答案部分,则针对不同类型的问题采用不同的评估策略:对有确定答案的金融问题(如风险等级评估)采用规则匹配计算奖励,对开放性问题(如市场分析)则使用ORM进行整体评分。在训练过程中同时引入了动态KL系数和优势函数归一化等技术来稳定训练过程。这种基于双重奖励的训练机制,不仅克服了单一奖励模型的局限性,也通过稳定的强化学习训练显著提升了模型在金融决策场景下的推理能力。
可以看出,上述路线中的关键是对不同于数学或者逻辑的金融分析类开放问题的思维链数据的构造和奖励模型的评估,目前我们仍在仍在不断优化和迭代,会持续探索更有效的技术路线。
使用方法
本次开源的模型按照<thinking>思考过程</thinking> <answer>答案</answer>
的输出格式进行输出,在思考过程中,同时我们也保留了粗粒度的思考步骤节点,使用◆进行分割。
模型支持VLLM进行推理加速,代码示例如下:
# -*- coding: utf-8 -*-
from vllm import LLM, SamplingParams
import transformers
model_path = "XuanYuan-FinX1-Preview"
system_message = "你是一位擅长深度思考的助手。在回答问题之前,你会像人类一样展现出一步一步的思考过程,包括问题理解、分析推理、自我质疑、反思验证等环节,之后你会基于思考过程,作出准确的回答。同时总是拒绝参与不道德、不安全、有争议的问题。"
query = "你是谁"
messages = [
[
{"role": "system", "content": system_message},
{"role": "user", "content": query},
]
]
sampling_params = SamplingParams(
temperature=0.7, max_tokens=9000, repetition_penalty=1.02
)
llm = LLM(
model_path,
tensor_parallel_size=4,
gpu_memory_utilization=0.85,
disable_custom_all_reduce=True,
)
tokenizer = transformers.AutoTokenizer.from_pretrained(model_path)
prompt = tokenizer.apply_chat_template(
messages, tokenize=False, add_generation_prompt=True
)
result = llm.generate(prompt, sampling_params)
print(result[0].outputs[0].text)
- Downloads last month
- 35