0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何用個人數據知識庫構建RAG聊天機器人?

冬至子 ? 來源:思否AI ? 作者:思否AI ? 2023-10-26 15:43 ? 次閱讀

01.使用 BeautifulSoup4 抓取網頁數據

所有機器學習(ML)項目的第一步都是收集所需的數據。本項目中,我們使用網頁抓取技術來收集知識庫數據。用 requests 庫獲取網頁并使用 BeautifulSoup4.從網頁中提取信息、解析 HTML 信息并提取段落。

導入 BeautifulSoup4 和 Requests 庫進行網頁抓取

運行 pip install beautifulsoup4 sentence-transformers安裝 BeautifulSoup 和 Sentence Transformers。在數據抓取部分只需要導入requests和 BeautifulSoup。接下來,創(chuàng)建一個 dictionary,其中包含我們要抓取的 URL 格式。在本示例中,我們只從 Towards Data Science 抓取內容,同理也可以從其他網站抓取。

現在,用以下代碼所示的格式從每個存檔頁面獲取數據:

import requests
from bs4 import BeautifulSoup
urls = {
    'Towards Data Science': '< https://towardsdatascience.com/archive/{0}/{1:02d}/{2:02d} >'
    }

此外,我們還需要兩個輔助函數來進行網頁抓取。第一個函數將一年中的天數轉換為月份和日期格式。第二個函數從一篇文章中獲取點贊數。

天數轉換函數相對簡單。寫死每個月的天數,并使用該列表進行轉換。由于本項目僅抓取 2023 年數據,因此我們不需要考慮閏年。如果您愿意,可以根據不同的年份進行修改每個月天數。

點贊計數函數統(tǒng)計 Medium 上文章的點贊數,單位為 “K” (1K=1000)。因此,在函數中需要考慮點贊數中的單位“K”。

def convert_day(day):
    month_list = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    m = 0
    d = 0
    while day > 0:
        m += 1
        d = day
        day -= month_list[m-1]
    return (m, d)

def get_claps(claps_str):
    if (claps_str is None) or (claps_str == '') or (claps_str.split is None):
        return 0
    split = claps_str.split('K')
    claps = float(split[0])
    return int(claps*1000) if len(split) == 2 else int(claps)

解析 BeautifulSoup4 的網頁抓取響應

現在已經設置好必要的組件,可以進行網頁抓取。為了避免在過程中遇到 429 錯誤(請求過多),我們使用 time 庫,在發(fā)送請求之間引入延遲。此外,用 sentence transformers 庫從 Hugging Face 獲取 embedding 模型—— MiniLM 模型。

如前所述,我們只抓取了 2023 年的數據,所以將年份設置為 2023。此外,只需要從第 1 天(1 月 1 日)到第 244 天(8 月 31 日)的數據。根據設定的天數進行循環(huán),每個循環(huán)在第一次調用time.sleep()之前會首先設置必要的組件。我們會把天數轉換成月份和日期,并轉成字符串,然后根據 urls 字典組成完整的 URL,最后發(fā)送請求獲取 HTML 響應。

獲取 HTML 響應之后,使用 BeautifulSoup 進行解析,并搜索具有特定類名(在代碼中指示)的div元素,該類名表示它是一篇文章。我們從中解析標題、副標題、文章 URL、點贊數、閱讀時長和回應數。隨后,再次使用requests來獲取文章的內容。每次通過請求獲取文章內容后,都會再次調用time.sleep()。此時,我們已經獲取了大部分所需的文章元數據。提取文章的每個段落,并使用我們的 HuggingFace 模型獲得對應的向量。接著,創(chuàng)建一個字典包含該文章段落的所有元信息。

import time
from sentence_transformers import SentenceTransformer

model = SentenceTransformer("sentence-transformers/all-MiniLM-L12-v2")
data_batch = []
year = 2023
for i in range(1, 243):
    month, day = convert_day(i)
    date = '{0}-{1:02d}-{2:02d}'.format(year, month, day)
    for publication, url in urls.items():
        response = requests.get(url.format(year, month, day), allow_redirects=True)
        if not response.url.startswith(url.format(year, month, day)):
            continue
        time.sleep(8)
        soup = BeautifulSoup(response.content, 'html.parser')
        articles = soup.find_all("div","postArticle postArticle--short js-postArticle js-trackPostPresentation js-trackPostScrolls")
        for article in articles:
            title = article.find("h3", class_="graf--title")
            if title is None:
                continue
            title = str(title.contents[0]).replace(u'\xA0', u' ').replace(u'\u200a', u' ')
            subtitle = article.find("h4", class_="graf--subtitle")
            subtitle = str(subtitle.contents[0]).replace(u'\xA0', u' ').replace(u'\u200a', u' ') if subtitle is not None else ''
            article_url = article.find_all("a")[3]['href'].split('?')[0]
            claps = get_claps(article.find_all("button")[1].contents[0])
            reading_time = article.find("span", class_="readingTime")
            reading_time = int(reading_time['title'].split(' ')[0]) if reading_time is not None else 0
            responses = article.find_all("a", class_="button")
            responses = int(responses[6].contents[0].split(' ')[0]) if len(responses) == 7 else (0 if len(responses) == 0 else int(responses[0].contents[0].split(' ')[0]))
            article_res = requests.get(article_url)
            time.sleep(8)
            paragraphs = BeautifulSoup(article_res.content, 'html.parser').find_all("[class*="pw-post-body-paragraph"]")
            for i, paragraph in enumerate(paragraphs):
                embedding = model.encode([paragraph.text])[0].tolist()
                data_batch.append({
                    "_id": f"{article_url}+{i}",
                    "article_url": article_url,
                    "title": title,
                    "subtitle": subtitle,
                    "claps": claps,
                    "responses": responses,
                    "reading_time": reading_time,
                    "publication": publication,
                    "date": date,
                    "paragraph": paragraph.text,
                    "embedding": embedding
                })

最后一步是使用 pickle 處理文件。

filename = "TDS_8_30_2023"
with open(f'{filename}.pkl', 'wb') as f:
    pickle.dump(data_batch, f)

數據呈現

數據可視化十分有用。下面是在 Zilliz Cloud 中數據的樣子。請注意其中的 embedding,這些數據表示了文檔向量,也就是我們根據文章段落生成的向量。

02.將 TDS 數據導入到向量數據庫中

獲取數據后,下一步是將其導入到向量數據庫中。在本項目中,我們使用了一個單獨的 notebook 將數據導入到 Zilliz Cloud,而不是從 Towards Data Science 進行網頁抓取。

要將數據插入 Zilliz Cloud,需按照以下步驟進行操作:

  • 連接到 Zilliz Cloud
  • 定義 Collection 的參數
  • 將數據插入 Zilliz Cloud

設置 Jupyter Notebook

運行 pip install pymilvus python-dotenv 來設置 Jupyter Notebook 并啟動數據導入過程。用 dotenv 庫來管理環(huán)境變量。對于pymilvus包,需要導入以下模塊:

  • utility 用于檢查集合的狀態(tài)
  • connections 用于連接到 Milvus 實例
  • FieldSchema 用于定義字段的 schema
  • CollectionSchema 用于定義 collection schema
  • DataType 字段中存儲的數據類型
  • Collection 我們訪問 collection 的方式

然后,打開之前 pickle 的數據,獲取環(huán)境變量,并連接到 Zilliz Cloud。

import pickle
import os
from dotenv import load_dotenv
from pymilvus import utility, connections, FieldSchema, CollectionSchema, DataType, Collection


filename="TDS_8_30_2023"
with open(f'{filename}.pkl', 'rb') as f:
    data_batch = pickle.load(f)

zilliz_uri = "your_zilliz_uri"
zilliz_token = "your_zilliz_token"
connections.connect(
    uri= zilliz_uri,
    token= zilliz_token
)

設置 Zilliz Cloud 向量數據庫并導入數據

接下來,需要設置 Zilliz Cloud。我們必須創(chuàng)建一個 Collection 來存儲和組織從 TDS 網站抓取的數據。需要兩個常量:dimension(維度)和 collection name(集合名稱),dimension 是指我們的向量具有的維度數。在本項目中,我們使用 384 維的 MiniLM 模型。

Milvus 的全新 Dynamic schema 功能允許我們僅為 Collection 設置 ID 和向量字段,無需考慮其他字段數量和數據類型。注意,需要記住保存的特定字段名稱,因為這對于正確檢索字段至關重要。

DIMENSION=384
COLLECTION_NAME="tds_articles"
fields = [
    FieldSchema(name='id', dtype=DataType.VARCHAR, max_length=200, is_primary=True),
    FieldSchema(name='embedding', dtype=DataType.FLOAT_VECTOR, dim=DIMENSION)
]
schema = CollectionSchema(fields=fields, enable_dynamic_field=True)
collection = Collection(name=COLLECTION_NAME, schema=schema)
index_params = {
    "index_type": "AUTO_INDEX",
    "metric_type": "L2",
    "params": {"nlist": 128},
}
collection.create_index(field_name="embedding", index_params=index_params)

Collection 有兩種插入數據的選項:

  • 遍歷數據并逐個插入每個數據
  • 批量插入數據

在插入所有數據之后,重要的是刷新集合以進行索引并確保一致性,導入大量數據可能需要一些時間。

for data in data_batch:
    collection.insert([data])
collection.flush()

03.查詢 TDS 文章片段

一切準備就緒后,就可以進行查詢了。

獲取 HuggingFace 模型并設置 Zilliz Cloud 查詢

注意,必須獲取 embedding 模型并設置向量數據庫以查詢 Towards Data Science 知識庫。這一步使用了一個單獨的筆記本。我們將使用dotenv庫來管理環(huán)境變量。此外,還需要使用 Sentence Transformers 中的 MiniLM 模型。這一步中,可以重用 Web Scraping 部分提供的代碼。

import os
from dotenv import load_dotenv
from pymilvus import connections, Collection


zilliz_uri = "your_zilliz_uri"
zilliz_token = "your_zilliz_token"


from sentence_transformers import SentenceTransformer


model = SentenceTransformer("sentence-transformers/all-MiniLM-L12-v2")

執(zhí)行向量搜索查詢

連接到向量數據庫并執(zhí)行搜索。在本項目中,我們將連接到一個 Zilliz Cloud 實例,并檢索之前創(chuàng)建的集合 tds_articles,用戶要先輸入他們的查詢問題。

接下來,使用 Hugging Face 的 embedding 模型對查詢進行編碼。這個過程將用戶的問題轉換為一個 384 維的向量。然后,使用這個編碼后的查詢向量來搜索向量數據庫。在搜索過程中,需要指定進行 ANN 查詢字段(anns_field)、索引參數、期望的搜索結果數量限制以及我們想要的輸出字段(output fields)。

之前,我們用了 Milvus 的 Dynamic Schema 特性來簡化字段 Schema 定義流程。搜索向量數據庫時,包括所需的動態(tài)字段在搜索結果中是必要的。這個特定的場景涉及請求paragraph字段,其中包含文章中每個段落的文本。

connections.connect(uri=zilliz_uri, token=zilliz_token)
collection = Collection(name="tds_articles")
query = input("What would you like to ask Towards Data Science's 2023 publications up to September? ")
embedding = model.encode(query)
closest = collection.search([embedding],
    anns_field='embedding',
    param={"metric_type": "L2",
        "params": {"nprobe": 16}},
    limit=2,
    output_fields=["paragraph"])
print(closest[0][0])
print(closest[0][1])

比如,我在應用中查詢大語言模型相關的信息,返回了以下兩個回答。盡管這些回答提到了“語言模型”并包含一些相關信息,但它們沒有提供關于大型語言模型的詳細解釋。第二個回答在語義上相似,但是不足夠接近我們想要的內容。

04.給向量數據庫知識庫添加內容

到目前為止,我們使用 Zilliz Cloud 作為向量數據庫在 TDS 文章上創(chuàng)建了一個知識庫。雖然能夠輕松地檢索語義上相似的搜索結果,但還沒有達到我們的期望。下一步是通過加入新的框架和技術來增強我們的結果。

05.總結

教程介紹了如何基于 Towards Data Science 文章構建聊天機器人。我們演示了網頁爬取的過程,創(chuàng)建了知識庫,包括將文本轉換成向量存儲在 Zilliz Cloud 中。然后,我們演示了如何提示用戶進行查詢,將查詢轉化為向量,并查詢向量數據庫。

不過,雖然結果在語義上相似,但并不完全符合我們的期望。在本系列的下一篇中,我們將探討使用 LlamaIndex 來優(yōu)化查詢。除了這里討論的步驟之外,大家也可以結合 Zilliz Cloud 嘗試替換模型、合并文本或使用其他數據集。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 編碼器
    +關注

    關注

    45

    文章

    3573

    瀏覽量

    133980
  • URL
    URL
    +關注

    關注

    0

    文章

    139

    瀏覽量

    15297
  • 機器學習
    +關注

    關注

    66

    文章

    8349

    瀏覽量

    132309
  • TDS
    TDS
    +關注

    關注

    0

    文章

    14

    瀏覽量

    14367
  • 聊天機器人
    +關注

    關注

    0

    文章

    330

    瀏覽量

    12281
收藏 人收藏

    評論

    相關推薦

    聊天機器人+微信平臺檢測環(huán)境,方案分享啦

    聊天機器人+微信平臺檢測環(huán)境,方案分享回饋論壇的幫助,也順便給自己拉拉票,第一季創(chuàng)客作品征集大賽,求點贊?。∵@是鏈接,有項目介紹:http://ttokpm.com/project
    發(fā)表于 02-22 19:46

    聊天機器人在國內為什么只能做客服?

    還不是那么智能的聊天機器人們找到一個發(fā)揮所長的新工作,那就是客服。細數一下,這一年來空降而來的機器人客服真是絡繹不絕。 百度推出的虛擬個人助理“度秘”,通過人機互動完成搜索、買票、訂餐票等服務。 淘寶
    發(fā)表于 06-20 16:50

    聊天機器人的自動問答技術實現

    【原創(chuàng)】聊天機器人與自動問答技術
    發(fā)表于 06-03 08:47

    如何利用Python+ESP8266 DIY 一個智能聊天機器人

    如何利用Python+ESP8266 DIY 一個智能聊天機器人?
    發(fā)表于 02-14 06:16

    五步詮釋聊天機器人

    。從某種意義上來說,正是語音控制的聊天機器人促成了個人助手如Siri出現在我們手機上,促成了亞馬遜Echo智能音箱出現在我們的客廳里。這一切足以讓你相信聊天機器人已開始滲透到了我們的日常生活中。 只不過,它們還沒有變成主流。推動
    發(fā)表于 09-20 08:32 ?10次下載

    聊天機器人的作用分析

    著名的網絡媒體BackChanel日前撰文稱,聊天機器人作為一項熱門的技術,將會顛覆手機應用(APP),在個人生活、公司客服、政府服務方面都有很好的應用。 文章將此稱為即將到來的真正革命。未來,聊天機器人
    發(fā)表于 09-20 10:21 ?2次下載

    如何避免聊天機器人的5個錯誤策略

    聊天機器人正迅速成為客戶和最終用戶溝通的通用解決方案。但許多聊天機器人策略都沒有達到其目的。
    的頭像 發(fā)表于 12-06 16:24 ?3720次閱讀

    一個基于Microsoft聊天機器人Tay的示例

    當意料之外的事情浮出水面時,我們可以期望的最好的辦法就是減少有效應對負擔的基礎設施。讓我們談談為AI構建該基礎架構?;ヂ摼W喜歡聊天機器人無處不在,所以讓我們看一個基于Microsoft聊天機器人Tay的示例。
    的頭像 發(fā)表于 04-09 14:18 ?2914次閱讀

    智能聊天機器人的會話式應用平臺日趨成熟化

    聊天機器人正在變得越來越好,更重要的是,非開發(fā)人員更容易使用構建聊天機器人和會話代理所需的工具。
    發(fā)表于 04-29 17:19 ?930次閱讀

    構建聊天機器人需要哪些資源?

    我問新客戶的第一個問題是:“為什么需要聊天機器人,并且該聊天機器人如何解決您的問題或為您的組織帶來價值?”,“您的客戶正在尋找什么答案?”,“您的客戶服務是否經常收到重復的問題?”
    的頭像 發(fā)表于 10-27 14:59 ?2401次閱讀

    GoGlobal 推出全新 AI 聊天機器人 – ChatGoGlobal

    ? ? 立即提問,即時回應 全球領先的國際人力資源和名義雇主(EOR)服務提供商 GoGlobal,近日宣布推出其全新的 AI 聊天機器人ChatGoGlobal。 這款生成式 AI 聊天機器人旨在
    的頭像 發(fā)表于 04-20 14:56 ?1126次閱讀
    GoGlobal 推出全新 AI <b class='flag-5'>聊天機器人</b> – ChatGoGlobal

    聊天機器人開源分享

    電子發(fā)燒友網站提供《聊天機器人開源分享.zip》資料免費下載
    發(fā)表于 06-20 15:07 ?1次下載
    <b class='flag-5'>聊天機器人</b>開源分享

    何用AI聊天機器人寫出萬字長文

    何用AI聊天機器人寫出萬字長文
    的頭像 發(fā)表于 12-26 16:25 ?1019次閱讀

    英偉達推出全新AI聊天機器人

    近日,英偉達(Nvidia)宣布推出其全新的AI聊天機器人——“Chat With RTX”。這款聊天機器人被視為英偉達版的ChatGPT,為用戶提供了一個全新的、本地化的AI交互體驗。
    的頭像 發(fā)表于 02-19 11:09 ?840次閱讀

    ChatGPT 與傳統(tǒng)聊天機器人的比較

    隨著人工智能技術的飛速發(fā)展,聊天機器人已經成為我們日常生活中不可或缺的一部分。從簡單的客服助手到復雜的個人助理,這些虛擬助手正在逐漸改變我們與技術的互動方式。在眾多聊天機器人中,ChatGPT無疑是
    的頭像 發(fā)表于 10-25 16:16 ?360次閱讀