CoolFace
Apppublic

FinRAG-Agent/FinRAG-Pro

sourceHugging Facemitupdated 4mo agoView on Hugging Face
1likes
rag_pipeline.cpython-312.pyc165 linesDownload Raw Back to __pycache__
1�

21f�i�O��Z�dZddlZddlZddlZddlZejjejjejje	���Z3ejje4dd�Zejje5dd�Z
dZGd�d�Zdad6d	�Zy)u�7金融投研RAG系统 - RAG检索与生成模块(终极版)8工作流:双线检索 → 智能清洗 → 上下文融合 → 终极生成9�N�data�index�	processed�c
�,�eZdZdZd�Zd�Zd�Zdeede	jfd�Zefded	e
deefd10�Zdededefd�Z	ddedededededefd�Z	d dedeededeedef11d�Zdedededededefd�Zdededededef12d�Zd
efdededed	e
def13d�Zy)!�RAGPipelineuBRAG检索与生成流水线(支持双线检索 + 噪音过滤)c�X�d|_d|_d|_d|_d|_d|_y)N�unknownF)r�chunks�metadata�encoder�embedding_method�initialized)�selfs �QC:\Users\HUAWEI\WorkBuddy\2026-05-09-task-1\financial-rag\backend\rag_pipeline.py�__init__zRAGPipeline.__init__s.����14������
���� )��� ���c�t�ddl}tjjtd�}tjj|�st
d|�d���|j|�|_td|jj���tjjtd�}tjj|�r1t|dd	�15�5}tj|�|_ddd�tjjtd�}tjj|�r1t|dd	�16�5}tj|�|_ddd�tjjtd�}tjj|�rCt|dd	�17�5}tj|�}ddd�j#d
d�|_|j'�d|_y#1swY��xYw#1swY��xYw#1swY�QxYw)u	初始化rNzfaiss_index.binuFAISS索引不存在: u%18请先运行 build_knowledge_base.pyu)  [OK] FAISS索引已加载,向量数: zchunks.json�r�utf-8)�encodingzchunk_metadata.jsonzsummary.jsonrr19T)�faiss�os�path�join�	INDEX_DIR�exists�FileNotFoundError�20read_indexr�print�ntotal�
PROCESSED_DIR�open�json�loadrr�getr�
_load_encoderr)rr�21index_path�chunks_path�f�	meta_path�summary_path�summarys        r�22initializezRAGPipeline.initializes�����W�W�\�\�)�->�?�23��w�w�~�~�j�)�#�&<�Z�L�Hn�$o�p�p��%�%�j�1��24�
�9�$�*�*�:K�:K�9L�M�N��g�g�l�l�=�-�@��
�7�7�>�>�+�&��k�3��9�
+�Q�"�i�i��l���
+��G�G�L�L��0E�F�	�
�7�7�>�>�)�$��i��w�7�
-�1� $�	�	�!���
�
-��w�w�|�|�M�>�B��
�7�7�>�>�,�'��l�C�'�:�
'�a��)�)�A�,��
'�$+�K�K�0B�I�$N�D�!��������
+�
+��25
-�
-��26
'�
'�s$� H�H"�H.�H�"H+�.H7c�|�tjjtd�}tjj	|�rHddlm}t|d�5}tj|�|_27ddd�d|_td�yddl
m}|d	�|_28d29|_td�y#1swY�BxYw)u加载编码器ztfidf_vectorizer.pklr)�TfidfVectorizer�rbN�tfidfu%  [OK] TF-IDF向量化器加载完成)�SentenceTransformerz%paraphrase-multilingual-MiniLM-L12-v2�sentence-transformersu.  [OK] Sentence-Transformers模型加载完成)rrrrr�sklearn.feature_extraction.textr0r#�pickler%r
rr �sentence_transformersr3)r�30tfidf_pathr0r*r3s     rr'zRAGPipeline._load_encoder9s����W�W�\�\�)�-C�D�31�
�7�7�>�>�*�%�G��j�$�'�
.�1�%�{�{�1�~���
.�$+�D�!��9�;�A�.�/V�W�D�L�$;�D�!��B�D�
.�
.�s�B2�2B;�texts�returnc�"�|jdk(r;|jj|dd��jtj32�S|jj
|�j�jtj33�S)Nr4F� )�show_progress_bar�34batch_size)rr
�encode�astype�np�float32�	transform�toarray)rr9s  r�_encodezRAGPipeline._encodeHsm��� � �$;�;��<�<�&�&�u��RT�&�U�\�\�]_�]g�]g�h�h��<�<�)�)�%�0�8�8�:�A�A�"�*�*�M�Mr�query�top_kc
��|jstd��ddl}|j|g�}|j	|�|j35j
||�\}}g}tt|d|d��D]�\}\}	}36|37dks|38t|j�k\r�'|jr|j|39ni}|j|dzt|	�|jdd|40���|jdd�|jd	d�|jd41d�|jdd
�|j|42d����|S)u检索本地知识库uRAGPipeline未初始化rN��chunk_id�chunk_�	doc_title�未知�source�source_type�未知来源�43source_dir�)�rank�scorerJrLrNrOrQ�content)r�RuntimeErrorrrE�normalize_L2r�search�	enumerate�zip�lenrr�append�floatr&)rrFrGr�	query_vec�scores�indices�results�irT�idx�metas            r�retrievezRAGPipeline.retrieveOs0������8�9�9���L�L�%��)�	�
���9�%��*�*�+�+�I�u�=������(��V�A�Y���44�)C�D�
	�O�A�|��s��Q�w�#��T�[�[�!1�1��)-���4�=�=��%�B�D��N�N��A���u�� �H�H�Z�6�#���@�!�X�X�k�8�<��(�(�8�X�6�#�x�x�
�~�F�"�h�h�|�R�8��;�;�s�+�	�	
�	
	��r�tavily_api_keyc��|r|jd�rddgdd�S	ddlm}||��}|j|d	d45��}|j	dg�}|sd
dgd�Sd}g}t|�D]h\}	}46|47j	dd�}|48j	dd�}|49j	dd�}
|d|	dz�d|�d|�d|
�d�	z
}|j
||dd|
d���jd
||d�S#t$r}ddgdt|���d�cYd}~Sd}~wwxYw)u�50        调用Tavily进行全网搜索,返回raw_data51        返回: {"success": bool, "raw_text": str, "results": list}52        utvly-你的FrRuTavily API Key未配置)�success�raw_textra�errorr)�TavilyClient)�api_key�advanced�)rF�search_depth�max_resultsraTu全网未检索到相关内容)rhrira�titleu	无标题rU�url�	【线索rIu】标题: u	53内容: u	54来源: �55 56Ni�)rqrUrruTavily搜索失败: )	�57startswith�tavilyrkrXr&rYr\�	Exception�str)rrFrfrk�client�responserari�	formattedrcrrqrUrr�es               r�search_web_tavilyzRAGPipeline.search_web_tavilyjsP��58��!:�!:�=�!I�$�"��6�8�
8�	>�+�!�.�9�F��}�}�5�z�WX�}�Y�H��l�l�9�b�1�G��#'�5U�bd�e�e��H��I�#�G�,�	
���Q����g�{�3���%�%�	�2�.���e�e�E�2�&���i��A��w�k�%��59�7�)�S]�^a�]b�bf�g�g��� � �"�&�t��}��"��	
� $��i�P�P���	>�$�"��3�C��F�8�<�>�
>��	>�s$�<C�A?C�	C?�"C:�4C?�:C?rR�raw_news�deepseek_api_key�api_type�model�base_urlc60�j�|j�sddddd�S|sd|dddd�Sd}|s	|d	k(rd61nd}|s	|d	k(rdnd
}	ddl}|jd��d�}d|��dd�}	|d|d�d|d�gddd�}62|j||	|63d��}|jdk(r[|j�dddd}d |vr|j
d �nt|�d!kDrd"nd}
|j
d �}d||
|d�Sd|ddd#|j�d$|jdd��d�S#t$r}d|ddt|�d�cYd}~Sd}~wwxYw)%u�64        使用DeepSeek对搜索到的资讯进行打分过滤65        返回: {"success": bool, "filtered_text": str, "kept_count": int, "total_count": int}66        TrRr)rh�
filtered_text�67kept_count�total_countFuDeepSeek API Key未配置)rhr�r�r�rju�你是一个冷酷的金融噪音过滤机器。68请你严格评估用户提供的实时搜索资讯的'市场情绪影响因子'(满分 10 分)。69 70打分标准:71- 1-3分:无关紧要的公关稿、领导视察、日常绿化修剪等废话。72- 4-6分:常规的行业新闻、正常的机构评级变动。73- 7-10分:重大技术突破(如固态电池量产时间表)、超预期的营收预警、市占率突变。74 75任务要求:761. 逐条评估每条资讯,直接给出分数。772. 严厉剔除所有低于 6 分的资讯!783. 只输出保留下来的高价值信息,并用一句话简述保留它的金融逻辑。�deepseek�https://api.deepseek.com�https://api.siliconflow.cn/v1�
deepseek-chat�deepseek-ai/DeepSeek-V2.5N�/�/chat/completions�Bearer �application/json��
AuthorizationzContent-Type�system��rolerU�user皙�����?i�r��messages�temperature�79max_tokens�<��headersr$�timeout���choices�messagerUrs�2rIzHTTP z: )�strip�requests�rstrip�post�status_coder$�countr[�textrwrx)rr~rr�r�r��
system_promptr�rrr��payloadrz�filtered�kept�totalr|s                r�
impact_filterzRAGPipeline.impact_filter�s����~�~��#�b��Z[�\�\��$�x�"#�A�@[�]�
]�a�
��5=��5K�1�Qp�H��'/�:�'=�O�C^�E�	H���_�_�S�)�*�*;�<�C�*1�2B�1C�(D�Vh�i�G��%�-�@�#��9�� #�"��G� �}�}�S�'��QS�}�T�H��#�#�s�*�#�=�=�?�9�5�a�8��C�I�N��6A�X�6M�x�~�~�k�2� ��]�R�/��Q�� ���{�3��#'�(�&*�5�B�B�$)�8�&'��#(��)=�)=�(>�b����t�PS�AT�@U�!V�X�X���	H�$�x�"#�A��A��H�
H��	H�s$�B-D�)$D�	D2�D-�'D2�-D2N�local_chunks�web_filtered�
web_formattedc80�j�d}|rYt|�D]K\}}|jdd�}|jd|jdd��}	|d|�d|	�d	|d81�d�z
}�M|r|nd}82t�}g}|D]Y}
|
jdd
�|
jdd�f}||vs�,|jd|d�d|d���|j	|��[g}|r>|D]9}|jd|jdd
��d|jdd�����;dj||z�}d|�d|83�d|�d|�d�	}|S)uN构建融合本地知识库 + 全网实时资讯的Prompt(含交叉验证)rRrOrPrNrLu未知文件u[来源类型: u | 文件: u84]85内容: rUrtu-(本次未获取到全网高价值资讯)rMu📄 [rz] rIu🌐 rqz - rr�86u�# Role87你是一位拥有10年以上经验的资深金融分析师,精通企业财报分析、宏观经济研究与行业研报解读。88你的回答严谨、专业、客观,擅长从繁杂的金融数据中提取核心投资逻辑。89 90# 参考资料说明91你现在同时拥有【公司官方年报】、【第三方机构研报】以及【实时全网资讯】三类来源。92 93一、【本地深度研报】(来自上市公司年报/行业研究报告)94u\95 96二、【全网实时高价值资讯】(经过AI噪音过滤筛选后的最新动态)97u98 99# 用户问题100u�101 102# 回答要求1031. 绝对忠于原文:财务数据必须严格基于知识库片段,不得捏造。1042. 标注来源:回答中必须使用格式「[来源类型: xxx | 文件: xxx]」标注每个数据的出处。1053. 交叉验证:你现在拥有了【公司官方年报】、【第三方机构研报】以及【实时全网资讯】。106   在回答分析时,你必须进行交叉验证。如果发现官方年报中的乐观预期与第三方研报的107   客观分析存在冲突,请重点指出这种【认知预期差】,并结合实时资讯给出你作为独立108   分析师的客观判断。1094. 专业客观:使用专业、冷静的投研话术,避免情绪化词汇。1105. 强制风险提示:在所有回答的最后,必须单列一段明确的投资风险提示。111 112# 回答格式113请严格按照以下结构输出:114- **核心结论**:直接简明扼要地回答用户的问题。115- **数据与分析**:标注每项数据的来源类型和文件出处,进行交叉验证分析。116- **认知预期差**:(如有)明确指出官方预期与第三方分析之间的矛盾。117- **风险提示**:(强制添加,不可省略)118 119# 参考来源总清单120)rYr&�setr\�addr)rrFr�r�r��
local_contextrb�chunkrO�source_file�web_context�121seen_local�local_sources_list�c�key�web_sources_list�w�all_sources�prompts                   r�build_fusion_promptzRAGPipeline.build_fusion_prompt�s����
��%�l�3�
���5�#�i�i�
�~�F��#�i�i��%�)�)�K��2X�Y���%�k�]�+�k�]�K�$�Y�/�0��6��
�
�'3�l�8g���U�122����	$�A��5�5���1�1�5�5��2�3F�G�C��*�$�"�)�)�F�3�q�6�(�"�S��V�H�*E�F����s�#�		$����"�
_�� �'�'�%����g�h�0G�/H��A�E�E�RW�XZ�O�K\�(]�^�
_��i�i� 2�5E� E�F������
�
�����(
�
��E#��H�
rr�rlc���|sy|sdddd�j|d�}|sdddd�j|d�}	d	d123l}|jd��d�}d
|��dd�}|d|d�gddd�}	|j|||	d��}124|125jdk(r|126j�dd	ddSd|127j�d|128jd129d��S#t$r}dt|���cYd130}~Sd131}~wwxYw)u调用LLM生成回答�[错误] 未配置API密钥r�r��https://api.openai.com/v1�r��siliconflow�openair�r��
gpt-3.5-turborNr�r�r�r�r�r�r�r��r��Zr�r�r�r�rU�[错误] API请求失败 (HTTP z): i,�[错误] 请求异常: )	r&r�r�r�r�r$r�rwrx)rr�r�rlr�r�r�rrr�r�rzr|s            r�	query_llmzRAGPipeline.query_llms*���0��$>�'F�"=�?�?B�s�8�Mg�?h�
��!0�$?�.�0�03��H�o�0N�
�	6���_�_�S�)�*�*;�<�C�*1�'��(;�M_�`�G� %�V�PV�4W�3X�&)��?�G��}�}�S�'��QS�}�T�H��#�#�s�*��}�}��y�1�!�4�Y�?�	�J�J�4�X�5I�5I�4J�#�h�m�m�\`�]`�Na�Mb�c�c���	6�,�S��V�H�5�5��	6�s$�A*B?� B?�?	C �
C�C �C c#�K�|sd��y|sdddd�j|d�}|sddd	d�j|d�}	d132dl}|jd��d�}d
|��dd�}|d|d�gdddd�}	|j|||	dd��}133|134jdk7rd|135j�d���y|136j�D]�}|s�|j
d�j�}|jd�s�7|dd}|dk(ry	d137dl	}
|
j|�}|jdig�d138jd i�}|jd!d"�}|r|����y#
j$rY��wxYw#t$r}d#t|�����Yd}~yd}~wwxYw�w)$u 流式调用LLM,逐token yieldr�Nr�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�T)r�r�r�r��stream�x)r�r$r�r�r�r��)rzdata: �z[DONE]r��deltarUrRr�)r&r�r�r�r��139iter_lines�decoder�rur$�loads�JSONDecodeErrorrwrx)rr�r�rlr�r�r�rrr�r�rz�linerr$r�r�rUr|s                  r�query_llm_streamzRAGPipeline.query_llm_stream8s������/�/���$>�'F�"=�?�?B�s�8�Mg�?h�
��!0�$?�.�0�03��H�o�0N�
�	5���_�_�S�)�*�*;�<�C�*1�'��(;�M_�`�G� %�V�PV�4W�3X�&)���O�G��}�}�S�'��PT�^a�}�b�H��#�#�s�*�7��8L�8L�7M�Q�O�O�� �+�+�-�
%����;�;�w�/�5�5�7�D����x�0�#�A�B�x���8�+�!�%�'�$.�D�J�J�t�$4�E�$)�I�I�i�"��$>�q�$A�$E�$E�g�r�$R�E�&+�i�i�	�2�&>�G�&�&-�
��
%�� $�3�3�%�$�%���	5�+�C��F�8�4�4��	5�sr�8F�A#E�F�E�50E�&E�1F�3AE140�E�	F�141E�E�E�E�	F�(E=�8F�=F�F�142llm_configc	��|jdd�}|jdd�}|jdd�}|jdd�}|ggdddd	�}	td143�g}144	|j||��}|r&|dd
dk\r|}145tdt|146��d��ntd�|147D�
cgc]
}
|
d|
dd���c}
|	d<|j||�}|jdd�}|jdd�xrt
|�}|rtdt|d��d��n |jdd�}td|���|jdg�|	d<d}d}|rntd �|j|||||�}|dr#|d!r|d!}td"|d#�d$|d%�d��n!|}td&|jdd��d'��||	d(<td)�|j||148||jdg��*�}td+t|��d,��td-�|j|||||�}|jd.�rd|	d<||	d/<||	d<|	Sd0|	d<||	d/<|	S#t$r}td|���Yd}~���d}~wwxYwcc}
w)1u149        4步终极工作流:150        1. 双线检索(本地知识库 + Tavily全网搜索)151        2. 智能清洗(Impact Filter过滤噪音)152        3. 上下文融合(拼接双源Context)153        4. 终极生成(融合Prompt + LLM调用)154        r�r�rlrRr�r�NF)rF�
local_sources�web_results�
filter_resultrh�answeru  [步骤1] 双线检索...)rGrrTg{�G�z�?u    ✅ 本地知识库命中 u155 个片段u/    ⚠️ 本地知识库未命中相关内容u    ⚠️ 本地检索异常: rLrN)rLrNr�rirhu!    ✅ Tavily全网搜索命中 rau 条rju未搜索到内容u    ⚠️ 全网搜索: r�u  [步骤2] 噪音过滤...r�u    ✅ 过滤完成: 保留 r�r�r�u    ⚠️ 过滤异常: u,使用原始数据r�u  [步骤3] 上下文融合...)rFr�r�r�u%    ✅ 融合Prompt构建完成 (约u字符)u*  [步骤4] 调用LLM生成终极回答...u[错误]r�T)r&r rer[rwr}�boolr�r�r�ru)rrFr�rfrGr�rlr�r��result�
local_results�	local_rawr|r��web_search_result�web_raw_text�web_has_data�reasonr��filter_info�
fusion_prompt�answer_texts                      r�answer_dualzRAGPipeline.answer_dualhs���>�>�*�j�9���.�.��B�/�����w��+���>�>�*�b�1�����!���
156��	�+�,��
�	9��
�
�e�5�
�9�I��Y�q�\�'�2�d�:� )�
��6�s�=�7I�6J�*�U�V��G�I�157KX�#158�EF�!�K�.�A�h�K�@�#159����160!�2�2�5�.�I��(�,�,�Z��<��(�,�,�Y��>�U�4��CU����5�c�:K�I�:V�6W�5X�X\�]�^�&�*�*�7�4H�I�F��-�f�X�6�7� 1� 5� 5�i�� D��}���
�����/�0��,�,�\�7�H�e�U]�^�K��9�%�+�o�*F� +�O� <�
��5�k�,�6O�5P�PQ�R]�^k�Rl�Qm�mq�r�s� ,�
��1�+�/�/�'�"�2M�1N�Nc�d�e�&1�F�?�#�	�.�/��0�0��&�&�+�/�/�	�2�>�	1�161�
�	�5�c�-�6H�5I��Q�R�	�:�;��n�n�]�H�g�u�h�W���!�!�*�-� %�F�9��*�F�8��)�F�7�O��M� ��y��&��x���
��q�	9��3�A�3�7�8�8��	9��#162s� AI"�*J�"	J�+I?�?J)r�rRrR�N)�__name__�163__module__�__qualname__�__doc__rr.r'�listrxrA�ndarrayrE�TOP_K�int�dictrer}r�r�r�r�r��rrrrs���L�!� �:
E�N�T�#�Y�N�2�:�:�N�16��c��#��$�t�*��6#>�s�#>�C�#>�D�#>�NTV�=H�c�=H�S�=H� #�=H�9<�=H�MP�=H�Z^�=H�F9=�G��G�*.�t�*�G�*-�G�,0��:�G�BE�G�T6��6�s�6�S�6��6�(+�6�03�6�<-5�s�-5�c�-5�C�-5� #�-5�/2�-5�d+-�!&�]��]� $�]�$'�]��]�,0�]rrc�V�t�t�atj�tSr�)�
_rag_pipelinerr.r�rr�get_rag_pipeliner��s!����#�
�
�� � �"��r)r:r)r�rr$r6�numpyrAr�dirname�abspath�__file__�BASE_DIRrrr"r�rr�r�r�rr�<module>rs����164165��
��
�7�7�?�?�2�7�7�?�?�2�7�7�?�?�8�+D�E�F���G�G�L�L��6�7�3�	������X�v�{�;�
�	��t�t�p
�
�r