在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何用個人數(shù)據(jù)知識庫構(gòu)建RAG聊天機(jī)器人?

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

01.使用 BeautifulSoup4 抓取網(wǎng)頁數(shù)據(jù)

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

導(dǎo)入 BeautifulSoup4 和 Requests 庫進(jìn)行網(wǎng)頁抓取

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

現(xiàn)在,用以下代碼所示的格式從每個存檔頁面獲取數(shù)據(jù):

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

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

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

點贊計數(shù)函數(shù)統(tǒng)計 Medium 上文章的點贊數(shù),單位為 “K” (1K=1000)。因此,在函數(shù)中需要考慮點贊數(shù)中的單位“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 的網(wǎng)頁抓取響應(yīng)

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

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

獲取 HTML 響應(yīng)之后,使用 BeautifulSoup 進(jìn)行解析,并搜索具有特定類名(在代碼中指示)的div元素,該類名表示它是一篇文章。我們從中解析標(biāo)題、副標(biāo)題、文章 URL、點贊數(shù)、閱讀時長和回應(yīng)數(shù)。隨后,再次使用requests來獲取文章的內(nèi)容。每次通過請求獲取文章內(nèi)容后,都會再次調(diào)用time.sleep()。此時,我們已經(jīng)獲取了大部分所需的文章元數(shù)據(jù)。提取文章的每個段落,并使用我們的 HuggingFace 模型獲得對應(yīng)的向量。接著,創(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)

數(shù)據(jù)呈現(xiàn)

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

02.將 TDS 數(shù)據(jù)導(dǎo)入到向量數(shù)據(jù)庫中

獲取數(shù)據(jù)后,下一步是將其導(dǎo)入到向量數(shù)據(jù)庫中。在本項目中,我們使用了一個單獨的 notebook 將數(shù)據(jù)導(dǎo)入到 Zilliz Cloud,而不是從 Towards Data Science 進(jìn)行網(wǎng)頁抓取。

要將數(shù)據(jù)插入 Zilliz Cloud,需按照以下步驟進(jìn)行操作:

  • 連接到 Zilliz Cloud
  • 定義 Collection 的參數(shù)
  • 將數(shù)據(jù)插入 Zilliz Cloud

設(shè)置 Jupyter Notebook

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

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

然后,打開之前 pickle 的數(shù)據(jù),獲取環(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
)

設(shè)置 Zilliz Cloud 向量數(shù)據(jù)庫并導(dǎo)入數(shù)據(jù)

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

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

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 有兩種插入數(shù)據(jù)的選項:

  • 遍歷數(shù)據(jù)并逐個插入每個數(shù)據(jù)
  • 批量插入數(shù)據(jù)

在插入所有數(shù)據(jù)之后,重要的是刷新集合以進(jìn)行索引并確保一致性,導(dǎo)入大量數(shù)據(jù)可能需要一些時間。

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

03.查詢 TDS 文章片段

一切準(zhǔn)備就緒后,就可以進(jìn)行查詢了。

獲取 HuggingFace 模型并設(shè)置 Zilliz Cloud 查詢

注意,必須獲取 embedding 模型并設(shè)置向量數(shù)據(jù)庫以查詢 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í)行向量搜索查詢

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

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

之前,我們用了 Milvus 的 Dynamic Schema 特性來簡化字段 Schema 定義流程。搜索向量數(shù)據(jù)庫時,包括所需的動態(tài)字段在搜索結(jié)果中是必要的。這個特定的場景涉及請求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])

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

04.給向量數(shù)據(jù)庫知識庫添加內(nèi)容

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

05.總結(jié)

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

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

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

    關(guān)注

    45

    文章

    3780

    瀏覽量

    137289
  • URL
    URL
    +關(guān)注

    關(guān)注

    0

    文章

    139

    瀏覽量

    15796
  • 機(jī)器學(xué)習(xí)

    關(guān)注

    66

    文章

    8493

    瀏覽量

    134161
  • TDS
    TDS
    +關(guān)注

    關(guān)注

    0

    文章

    24

    瀏覽量

    14537
  • 聊天機(jī)器人
    +關(guān)注

    關(guān)注

    0

    文章

    348

    瀏覽量

    12726
收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    《AI Agent 應(yīng)用與項目實戰(zhàn)》閱讀心得3——RAG架構(gòu)與部署本地知識庫

    RAG技術(shù)建立在向量數(shù)據(jù)庫的基礎(chǔ)上,通過高維向量空間中的相似度計算來實現(xiàn)語義層面的匹配,這比傳統(tǒng)的關(guān)鍵詞搜索更能捕捉文本的深層語義關(guān)聯(lián)。 第七章通過一個本地知識庫的搭建案例展示了RAG
    發(fā)表于 03-07 19:49

    聊天機(jī)器人在國內(nèi)為什么只能做客服?

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

    聊天機(jī)器人的自動問答技術(shù)實現(xiàn)

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

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

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

    五步詮釋聊天機(jī)器人

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

    聊天機(jī)器人的作用分析

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

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

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

    一個基于Microsoft聊天機(jī)器人Tay的示例

    當(dāng)意料之外的事情浮出水面時,我們可以期望的最好的辦法就是減少有效應(yīng)對負(fù)擔(dān)的基礎(chǔ)設(shè)施。讓我們談?wù)劄锳I構(gòu)建該基礎(chǔ)架構(gòu)。互聯(lián)網(wǎng)喜歡聊天機(jī)器人無處不在,所以讓我們看一個基于Microsoft聊天機(jī)器人Tay的示例。
    的頭像 發(fā)表于 04-09 14:18 ?3133次閱讀

    構(gòu)建聊天機(jī)器人需要哪些資源?

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

    GoGlobal 推出全新 AI 聊天機(jī)器人 – ChatGoGlobal

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

    聊天機(jī)器人開源分享

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

    何用AI聊天機(jī)器人寫出萬字長文

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

    英偉達(dá)推出全新AI聊天機(jī)器人

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

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

    隨著人工智能技術(shù)的飛速發(fā)展,聊天機(jī)器人已經(jīng)成為我們?nèi)粘I钪胁豢苫蛉钡囊徊糠帧暮唵蔚目头值綇?fù)雜的個人助理,這些虛擬助手正在逐漸改變我們與技術(shù)的互動方式。在眾多聊天機(jī)器人中,ChatGPT無疑是
    的頭像 發(fā)表于 10-25 16:16 ?1164次閱讀

    Cloudera推出RAG Studio,助力企業(yè)快速部署聊天機(jī)器人

    企業(yè)在利用實時企業(yè)數(shù)據(jù)部署RAG聊天機(jī)器人方面邁出了重要一步,且整個過程僅需幾分鐘。 RAG Studio是一款無代碼解決方案,它極大地簡化了非技術(shù)用戶使用AI應(yīng)用的難度。通過這一平臺
    的頭像 發(fā)表于 12-12 11:06 ?675次閱讀
    主站蜘蛛池模板: 男人操女人视频网站 | 午夜剧场刺激性爽免费视频 | cao榴| 三级完整在线观看高清视频 | 色噜噜中文网 | 亚洲精品二区中文字幕 | 好紧好爽水真多18 | 青草视频在线观看国产 | 亚洲福利午夜 | 国产美女主播在线 | 电源天堂| 中文字幕一二三四区2021 | 欧美zooz人禽交免费观看 | 成人99国产精品一级毛片 | 影音先锋色偷偷米奇四色 | 日本高清视频在线www色 | 亚洲综合成人网 | 黄色在线播放网址 | 天天色天天碰 | 日韩高清毛片 | 69国产成人综合久久精品 | 四虎永久在线精品免费影视 | 天天干夜干| 嫩草网 | 国模伊人| 狼色网| 模特精品视频一区 | 欧美宗合网 | 亚洲大胆精品337p色 | 国产盗摄女子私密保健视频 | 日日摸夜夜爽夜夜爽出水 | 欧美黄色三级视频 | 国产在线精品一区二区夜色 | 精品伊人久久大线蕉地址 | 久草视频一区 | 日本三级欧美三级香港黄 | 91极品反差婊在线观看 | 国产拍拍1000部ww | 国产精品资源网 | 国产一区二区三区四卡 | 天天综合亚洲国产色 |