微信扫码
与创始人交个朋友
我要投稿
在这篇文章中,我将指导你创建一个为银行设计的复杂聊天机器人助手。该助手将利用银行网站上可用的信息和文档。我们将首先抓取银行网站以提取所有PDF和相关内容。然后,我们将创建嵌入、设置提示,并使用Gradio将所有内容集成到聊天机器人界面中。该聊天机器人将使用Mistral AI、RAG(检索增强生成)和Llama Index构建。
首先,我们需要抓取银行网站以收集所有必要的文件和信息。这包括下载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)
库和函数:脚本导入了必要的库(os
, requests
, BeautifulSoup
, urljoin
, urlparse
, 和 datetime
),并定义了下载PDF和保存网页内容的函数。
download_pdf():该函数接收一个URL和一个目录,查找页面上的所有PDF链接,并将每个PDF下载到指定目录。
save_webpage_content():该函数接收一个URL和一个目录,将网页的文本内容保存到一个文件中,文件名基于页面标题和当前时间戳生成唯一标识。
scrape_website():该函数确保指定目录存在,并通过保存网页内容和下载PDF的方式递归抓取网站。它记录已访问的URL以避免重复处理同一页面。
在抓取网站并下载文档之后,下一步是创建嵌入向量。我们将使用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")
导入库:从 llama_index
导入必要的类。
加载文档:使用 SimpleDirectoryReader
从指定目录(包含已下载内容)加载所有文档。
创建索引:从加载的文档创建 VectorStoreIndex
。
持久化索引:将索引保存到指定目录以供后续使用。
我们将创建一个提示模板,以指导聊天机器人生成适当的回复。该提示将确保聊天机器人遵循特定规则并保持专业语调。
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] ")
导入库:从 llama_index
导入 PromptTemplate
。
定义 SYSTEM_PROMPT:创建一个包含系统提示的字符串,其中包含聊天机器人需遵循的特定规则。
创建查询包装器提示:使用 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)
导入库:从 llama_index
导入 HuggingFaceLLM
和 torch
。
初始化LLM:使用指定的参数(包括模型名称、分词器名称和设备设置)创建 HuggingFaceLLM
实例。
加载聊天引擎:从 llama_index
导入 StorageContext
和 load_index_from_storage
,从存储中加载索引,并使用 as_chat_engine
创建聊天引擎。
最后,我们将使用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()
导入Gradio:导入Gradio库。
创建界面:使用gr.Blocks()
创建Gradio界面。
定义组件:添加聊天机器人组件(gr.Chatbot()
)、用户输入文本框(gr.Textbox()
)和清除按钮(gr.ClearButton()
)。
响应函数:定义一个respond()
函数,该函数接收消息和聊天历史,使用聊天引擎生成响应,将响应追加到聊天历史中,并返回更新后的聊天历史。
提交事件:将文本框的submit
事件绑定到respond()
函数。
启动界面:使用demo.launch()
启动Gradio界面。
遵循这些步骤,您可以为银行创建一个强大且高效的聊天机器人助手。该聊天机器人将利用Mistral AI、RAG和Llama Index的力量,根据银行现有的资源提供准确且有帮助的回复。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-05-08
2024-07-22
2024-07-14
2024-06-30
2024-07-11
2024-03-31
2024-11-08
2024-08-09
2024-07-14
2024-10-16