使用Gemini和Qdrant构建实时财经新闻RAG聊天机器人

2024年04月02日 由 alex 发表 191 0

简介

我们大多数人都在购买房地产、共同基金、债券等方面投入了时间和精力。在投资之前,我们会寻找合适的银行合作伙伴。对于长期投资,我们会研究哪些银行业绩良好,没有骗局或欺诈行为,并且提供合理的利率和回报。因此,我们需要随时了解最新的金融新闻。


如果你能拥有一个实时金融新闻聊天机器人,它能为你提供所有与金融和经济相关的新闻,会怎么样呢?听起来有趣吗?现在,检索增强一代(RAG)已经让这成为可能。我们可以利用大型语言模型和向量数据库来回答我们的询问。


让我们创建一个实时财经新闻 RAG 聊天机器人,看看它是否能利用现有数据准确回答问题。它可以通过向向量数据库提供最新消息来实现实时性。


使用Gemini的实时财经新闻 RAG 聊天机器人

我们以印度金融新闻数据集为起点。该数据集包含与印度银行相关的金融新闻。数据更新至 2020 年 5 月 26 日。


在开始之前,我们先安装所需的依赖项。


%pip install -q llama-index 'google-generativeai>=0.3.0' qdrant_client llama-index-embeddings-fastembed fastembed llama-index-llms-gemini


准备节点

数据集是 CSV 文件,让我们加载数据。


from llama_index.core import SimpleDirectoryReader
docs = SimpleDirectoryReader("Dataset").load_data()


所有文件都已准备就绪,现在我们将把句子分割成规定的大小块。


from llama_index.core.node_parser.text import SentenceSplitter
# Initialize the SentenceSplitter with a specific chunk size
text_parser = SentenceSplitter(chunk_size=1024)
text_chunks = [] # This will hold all the chunks of text from all documents
doc_idxs = [] # This will keep track of the document each chunk came from
for doc_idx, doc in enumerate(docs):
 # Split the current document's text into chunks
 cur_text_chunks = text_parser.split_text(doc.text)
 
 # Extend the list of all text chunks with the chunks from the current document
 text_chunks.extend(cur_text_chunks)
 
 # Extend the document index list with the index of the current document, repeated for each chunk
 doc_idxs.extend([doc_idx] * len(cur_text_chunks))


然后,我们将创建一个文本节点对象,并为其分配元数据。我们将在一个节点列表中存储所有节点。


from llama_index.core.schema import TextNode
nodes = [] # This will hold all TextNode objects created from the text chunks
# Iterate over each text chunk and its index
for idx, text_chunk in enumerate(text_chunks):
 # Create a TextNode object with the current text chunk
 node = TextNode(text=text_chunk)
 
 # Retrieve the source document using the current index mapped through doc_idxs
 src_doc = docs[doc_idxs[idx]]
 
 # Assign the source document's metadata to the node's metadata attribute
 node.metadata = src_doc.metadata
 
 # Append the newly created node to the list of nodes
 nodes.append(node)


初始化 Qdrant 向量存储

为了存储节点,我们需要一个向量存储空间。在这里,我们选择 Qdrant 作为向量存储。Qdrant 是一个高性能向量数据库,具有向量存储所应具备的所有特性。它利用 HNSW 算法进行近似近邻搜索,速度快、精度高。Qdrant 通过提供易于使用的 API,支持附加有效载荷和基于有效载荷值的过滤器。此外,它还支持 docker 安装,配备了矢量的内存存储,是云原生的,并可水平扩展。Qdrant 采用 Rust 语言开发,实现了动态查询规划和有效载荷数据索引。


首先,我们将在向量存储索引中创建一个集合。


from llama_index.core import VectorStoreIndex, StorageContext
from llama_index.vector_stores.qdrant import QdrantVectorStore
from llama_index.core import Settings
from llama_index.core import StorageContext
import qdrant_client
# Create a local Qdrant vector store
client = qdrant_client.QdrantClient(path="financialnews")
vector_store = QdrantVectorStore(client=client, collection_name="collection")


Gemini嵌入和文本模型

向量存储和节点已经准备就绪,但向量存储不会直接接受节点。它们需要嵌入,对于嵌入,我们在这里使用的是 Gemini 嵌入模型。我们将利用 Gemini LLM,它是一个非常强大的多模态模型系列。Gemini 模型基于变换器架构并在 TPU 上进行训练,在摘要、阅读理解任务(可根据任务进行微调)、多语言、长语境、编码、复杂推理、数学以及多模态等方面表现出色。


我们将启动 Google API 密钥,你可以从 Google AI Studio 获取该密钥。


%env GOOGLE_API_KEY = "your-api-key"
import os
GOOGLE_API_KEY = "your-api-key" # add your GOOGLE API key here
os.environ["GOOGLE_API_KEY"] = GOOGLE_API_KEY


现在,我们将使用 API 密钥,在 Llamaindex 的设置中使用 FastEmbed 嵌入模型和 Gemini LLM 生成嵌入结果。


from llama_index.embeddings.fastembed import FastEmbedEmbedding
embed_model = FastEmbedEmbedding(model_name="BAAI/bge-small-en-v1.5")
for node in nodes:
 node_embedding = embed_model.get_text_embedding(
 node.get_content(metadata_mode="all")
 )
 node.embedding = node_embedding
from llama_index.llms.gemini import Gemini
Settings.embed_model = embed_model
Settings.llm = Gemini(model="models/gemini-pro")
Settings.transformations = [SentenceSplitter(chunk_size=1024)]
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex(
 nodes=nodes,
 storage_context=storage_context,
transformations=Settings.transformations,
)


矢量存储已保存在存储上下文中,索引已通过它和节点启动。


HyDE 查询转换

现在,我们将用响应合成器和矢量检索器启动矢量查询引擎。向量检索器由包含索引的向量索引检索器启动。响应合成器使用用户查询和给定的文本块集从 LLM 生成响应。响应合成器的输出是一个响应对象。


from llama_index.core import get_response_synthesizer
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.core.retrievers import VectorIndexRetriever
vector_retriever = VectorIndexRetriever(index=index, similarity_top_k=2)
response_synthesizer = get_response_synthesizer()
vector_query_engine = RetrieverQueryEngine(
 retriever=vector_retriever,
 response_synthesizer=response_synthesizer,
)


我们将采用 HyDE 查询转换器进行高级检索。HyDE(假定文档嵌入)有助于在大型语言模型中进行基于提示的零点指令跟踪。它生成一个包含相关文本模式的假设文档,将其转换为嵌入向量,然后求平均值以创建一个单一的嵌入。该程序通过文档嵌入空间中的向量相似性确定相应的实际嵌入,从而省去了检索步骤,即查询输入并从大型数据库中获取文档。


HyDE 查询转换有助于直接、简洁地提供响应。


from llama_index.core.indices.query.query_transform import HyDEQueryTransform
from llama_index.core.query_engine import TransformQueryEngine
hyde = HyDEQueryTransform(include_original=True)
hyde_query_engine = TransformQueryEngine(vector_query_engine, hyde)


利用 Gradio UI 实现聊天机器人

为了部署聊天机器人,我们将使用 Gradio。


def queries(query_str):
 response = hyde_query_engine.query(query_str)
 return str(response)
import gradio as gr
import os
gr.close_all()
with gr.Blocks(theme=gr.themes.Soft()) as demo:
 gr.Markdown(
 """
 # Welcome to Gemini-Powered Stock Predictor RAG Chatbot!
 """)
 chatbot = gr.Chatbot()
 msg = gr.Textbox()
 clear = gr.ClearButton([msg, chatbot])
 def respond(message, chat_history):
 bot_message = queries(message)
 chat_history.append((message, bot_message))
 return "", chat_history
 msg.submit(respond, [msg, chatbot], [msg, chatbot])
 
demo.launch(share=True)


查询时间

让我们来查询聊天机器人。


问题 1:


告诉我所有关于骗局的新闻。
印度国家银行(PNB)骗局余波:贸易融资受挫,谨慎情绪弥漫,溢价飙升
PNB 骗局影响扩大,NCLT 禁止 60 多家实体出售资产
PNB 骗局: 中央调查局逮捕尼拉夫-莫迪和 Mehul Choksi 旗下公司的 4 名官员
PNB 骗局: 法院对 Nirav Modi 和 Choksi 发出不可保释的逮捕令
PNB 首席执行官苏尼尔-梅塔承认员工在 LoUs 骗局中相互勾结
尼拉夫-莫迪案: 中央调查局收回 LoU 文件,逮捕另一名 PNB 高管
价值 571.6 亿卢比的资产,2011 年 3 月签发的第一份 LoU 被查封: 教育署就印度国家银行骗局发表声明
解释骗局是如何发生的": 调查委员会要求印度国家银行和财政部长在 10 天内提交报告
PNB 欺诈案: 政府认为 RBI 可能无法确保有效监管?
PNB 欺诈案涉及 1,140 亿卢比,7 家国有银行股价跌至 52 周低点
印度国家银行周一下跌 7%;市值在四个交易日内暴跌 1,097.5 亿卢比
财政部长表示,印度国家银行必须承担善意交易的责任
尼拉夫-莫迪 PNB 欺诈案: 拉胡尔说:莫迪总理的沉默说明了他的忠诚
尼拉沃-莫迪 PNB 欺诈案: 维贾伊-阿加瓦尔将担任潜逃的钻石商的律师
在 PNB 欺诈案之前: 尼拉夫-莫迪和乔克西导致 18 名商人和 24 家公司破产
尼拉夫-莫迪 PNB 欺诈案: 中央调查局查封孟买布雷迪大厦分行
PNB 曾是旁遮普的骄傲,如今却成了印度 WhatsApp 的主题备忘录
睁一只眼闭一只眼:18 亿美元的 PNB 欺诈案完全未被察觉
银行联盟希望中央调查局调查 PNB 欺诈案,指控 RBI 监管不力
中央调查局质询尼拉沃-莫迪的首席财务官维普尔-安巴尼;搜查 PNB 孟买分行
PNB 骗局: 珠宝商期待更多伤亡和更严格的监管
价值 1140 亿卢比的 PNB 银行骗局: 欺诈者为何喜欢使用承诺书


9


问题 2:


有关 RBI 的最新消息是什么?
印度央行再次推迟推出 IndAs,等待银行法的修订


10


问题 3:


你能告诉我所有与住房贷款有关的新闻吗?
贷款利率下调导致住房贷款市场出现余额转移: ICRA
印度联合银行:房贷利率无法与巴罗达银行相提并论
降息后,巴罗达银行着眼于做大住房贷款蛋糕
巴罗达银行提供 8.35% 的最低住房贷款利率
自降息以来,SBI 的房屋贷款查询量猛增三倍
HDFC 将住房贷款利率最多下调 0.45
Hamara Ghar 优惠: SBI 的新住房贷款
银行下调贷款利率: 住房贷款者将如何受益
SBI 将贷款利率下调 90 个基点;住房和汽车贷款将变得更便宜


11


问题 4:


请告诉我有关 Yes Bank 欺诈案的新闻。
印度储备银行发现 Yes 银行有超过 4.5 亿美元的额外不良贷款。截至 2019 年 11 月 20 日,印度储备银行评估的不良资产总额比 Yes Bank 披露的高出 4.57 亿美元。


12


问题 5:


关于 NBFC 的最新消息是什么?
有关 NBFC 的最新消息是,印度储备银行放宽了银行向 NBFC 和住房金融公司提供更多贷款的规范。印度储备银行将单一借款人风险限额提高到银行资本的 15%。


13


结论

事实证明,使用印度金融新闻数据集构建实时金融新闻 RAG 聊天机器人是一次收获颇丰的旅程。现在你知道可以轻松询问有关银行的问题并获得即时答复了吧!现在是你制作自己的聊天机器人的时候了。

文章来源:https://medium.com/@akriti.upadhyay/building-real-time-financial-news-rag-chatbot-with-gemini-and-qdrant-64c0a3fbe45b
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消