AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


使用Mistral AI、RAG和Llama Index创建银行助手聊天机器人
发布日期:2024-07-14 01:31:08 浏览次数: 1890


在这篇文章中,我将指导你创建一个为银行设计的复杂聊天机器人助手。该助手将利用银行网站上可用的信息和文档。我们将首先抓取银行网站以提取所有PDF和相关内容。然后,我们将创建嵌入、设置提示,并使用Gradio将所有内容集成到聊天机器人界面中。该聊天机器人将使用Mistral AI、RAG(检索增强生成)和Llama Index构建。

第一步:抓取银行网站

首先,我们需要抓取银行网站以收集所有必要的文件和信息。这包括下载PDF文件并保存网页内容。

抓取并下载PDF文件的脚本

以下是一个用于抓取银行网站并下载所有PDF文件的Python脚本:

import os
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin, urlparse
from datetime import datetime

def download_pdf(url, directory="."):
# 发送GET请求到URL
response = requests.get(url)

# 检查请求是否成功(状态码200)
if response.status_code == 200:
# 解析页面的HTML内容
soup = BeautifulSoup(response.content, 'html.parser')

# 查找所有href属性以'.pdf'结尾的锚标签(<a>)
pdf_links = soup.find_all('a', href=lambda href: href and href.endswith('.pdf'))

# 下载PDF文件
for link in pdf_links:
pdf_url = urljoin(url, link['href'])
filename = os.path.join(directory, os.path.basename(pdf_url))
with open(filename, 'wb') as f:
f.write(requests.get(pdf_url).content)
print(f"Downloaded: {filename}")
else:
print("Failed to retrieve webpage. Status code:", response.status_code)

def save_webpage_content(url, directory="."):
# 发送GET请求到URL
response = requests.get(url)

# 检查请求是否成功(状态码200)
if response.status_code == 200:
# 解析页面的HTML内容
soup = BeautifulSoup(response.content, 'html.parser')

# 获取页面标题
title = soup.title.string.strip() if soup.title else "Untitled"

# 使用页面标题和当前时间戳生成唯一文件名
timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
filename = os.path.join(directory, f"{title}_{timestamp}_webpage_content.txt")

# 保存不含HTML标签的网页内容
with open(filename, 'w', encoding='utf-8') as f:
# 去除空白行
f.write('\n'.join(line for line in soup.get_text().splitlines() if line.strip()))
print(f"Saved webpage content: {filename}")
else:
print("Failed to retrieve webpage. Status code:", response.status_code)

def scrape_website(url, directory="."):
# 确保目录存在
if not os.path.exists(directory):
os.makedirs(directory)

# 用于记录已访问URL的字典
visited_urls = {}

# 递归抓取URL的辅助函数
def scrape_url_recursive(url):
# 检查URL是否已被访问过
if url in visited_urls:
return
visited_urls[url] = True

# 保存不含HTML标签的网页内容
save_webpage_content(url, directory)

# 下载PDF文件
download_pdf(url, directory)

# 发送GET请求到URL
response = requests.get(url)

# 检查请求是否成功(状态码200)
if response.status_code == 200:
# 解析页面的HTML内容
soup = BeautifulSoup(response.content, 'html.parser')

# 查找所有锚标签(<a>)并递归抓取它们的URL
links = soup.find_all('a', href=True)
for link in links:
next_url = urljoin(url, link['href'])
# 检查URL是否属于同一域名
if urlparse(next_url).netloc == urlparse(url).netloc:
scrape_url_recursive(next_url)

# 开始递归抓取
scrape_url_recursive(url)


url = 'https://www.tsb.co.uk/'
scrape_website(url)

解释

  1. 库和函数:脚本导入了必要的库(osrequestsBeautifulSoupurljoinurlparse, 和 datetime),并定义了下载PDF和保存网页内容的函数。

  2. download_pdf():该函数接收一个URL和一个目录,查找页面上的所有PDF链接,并将每个PDF下载到指定目录。

  3. save_webpage_content():该函数接收一个URL和一个目录,将网页的文本内容保存到一个文件中,文件名基于页面标题和当前时间戳生成唯一标识。

  4. scrape_website():该函数确保指定目录存在,并通过保存网页内容和下载PDF的方式递归抓取网站。它记录已访问的URL以避免重复处理同一页面。

第二步:创建嵌入向量

在抓取网站并下载文档之后,下一步是创建嵌入向量。我们将使用Llama Index来处理这一步骤。

使用Llama Index创建嵌入向量

from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
documents = SimpleDirectoryReader("/content/tsb").load_data()
index = VectorStoreIndex.from_documents(documents)
index.storage_context.persist(persist_dir="/embeddings")

解释

  1. 导入库:从 llama_index 导入必要的类。

  2. 加载文档:使用 SimpleDirectoryReader 从指定目录(包含已下载内容)加载所有文档。

  3. 创建索引:从加载的文档创建 VectorStoreIndex

  4. 持久化索引:将索引保存到指定目录以供后续使用。

第三步:设置提示模板

我们将创建一个提示模板,以指导聊天机器人生成适当的回复。该提示将确保聊天机器人遵循特定规则并保持专业语调。

定义提示信息

from llama_index.core import PromptTemplate

SYSTEM_PROMPT = """您是一位以友好方式回答问题的AI助手,基于给定的源文档。以下是您始终遵循的规则:
- 生成人类可读的输出,避免创建包含无意义文本的输出。
- 仅生成请求的输出,不要在请求的输出前后包含任何其他语言。
- 永远不要说谢谢,您很高兴帮忙,您是AI代理等。直接回答即可。
- 生成北美商业文档中常用的专业语言。
- 绝不生成冒犯性或粗俗的语言。
"""


query_wrapper_prompt = PromptTemplate(
"[INST]<<SYS>>\n" + SYSTEM_PROMPT + "<</SYS>>\n\n{query_str}[/INST] "
)

# 定义查询包装提示
query_wrapper_prompt = PromptTemplate("[INST]<<SYS>>\n" + SYSTEM_PROMPT + "<</SYS>>\n\n{query_str}[/INST] ")

解释

  1. 导入库:从 llama_index 导入 PromptTemplate

  2. 定义 SYSTEM_PROMPT:创建一个包含系统提示的字符串,其中包含聊天机器人需遵循的特定规则。

  3. 创建查询包装器提示:使用 PromptTemplate 创建一个提示模板,该模板包含系统提示和一个用于用户查询的占位符({query_str})。

第四步:创建聊天引擎

现在,我们需要使用Mistral AI创建聊天引擎。该引擎将根据用户的查询和嵌入的文档生成响应。

设置聊天引擎

llm = HuggingFaceLLM(
context_window=2048,
max_new_tokens=256,
generate_kwargs={"temperature": 0.25, "do_sample": False},
query_wrapper_prompt=query_wrapper_prompt,
tokenizer_name="mistralai/Mistral-7B-Instruct-v0.2",
model_name="mistralai/Mistral-7B-Instruct-v0.2",
device_map="auto",
tokenizer_kwargs={"max_length": 2048},
model_kwargs={"torch_dtype": torch.float16}
)

# 加载聊天引擎
storage_context = StorageContext.from_defaults(persist_dir="./data/llama_index")
index = load_index_from_storage(storage_context)
chat_engine = index.as_chat_engine(chat_mode="condense_question", verbose=True)

解释

  1. 导入库:从 llama_index 导入 HuggingFaceLLM 和 torch

  2. 初始化LLM:使用指定的参数(包括模型名称、分词器名称和设备设置)创建 HuggingFaceLLM 实例。

  3. 加载聊天引擎:从 llama_index 导入 StorageContext 和 load_index_from_storage,从存储中加载索引,并使用 as_chat_engine 创建聊天引擎。

第五步:使用Gradio创建聊天机器人界面

最后,我们将使用Gradio创建一个用户友好的聊天机器人界面。这个界面将允许用户与聊天机器人进行交互。

设置界面

import gradio as gr

with gr.Blocks() as demo:
chatbot = gr.Chatbot()
msg = gr.Textbox()
clear = gr.ClearButton([msg, chatbot])

def respond(message, chat_history):
response = chat_engine.chat(message)
bot_message = response.response
chat_history.append((message, bot_message))
return "", chat_history

msg.submit(respond, [msg, chatbot], [msg, chatbot])

demo.launch()

解释

  1. 导入Gradio:导入Gradio库。

  2. 创建界面:使用gr.Blocks()创建Gradio界面。

  3. 定义组件:添加聊天机器人组件(gr.Chatbot())、用户输入文本框(gr.Textbox())和清除按钮(gr.ClearButton())。

  4. 响应函数:定义一个respond()函数,该函数接收消息和聊天历史,使用聊天引擎生成响应,将响应追加到聊天历史中,并返回更新后的聊天历史。

  5. 提交事件:将文本框的submit事件绑定到respond()函数。

  6. 启动界面:使用demo.launch()启动Gradio界面。

结论

遵循这些步骤,您可以为银行创建一个强大且高效的聊天机器人助手。该聊天机器人将利用Mistral AI、RAG和Llama Index的力量,根据银行现有的资源提供准确且有帮助的回复。


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询