精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

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

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

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

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

所有機(jī)器學(xué)習(xí)(ML)項(xiàng)目的第一步都是收集所需的數(shù)據(jù)。本項(xiàng)目中,我們使用網(wǎng)頁抓取技術(shù)來收集知識(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)建一個(gè) dictionary,其中包含我們要抓取的 URL 格式。在本示例中,我們只從 Towards Data Science 抓取內(nèi)容,同理也可以從其他網(wǎng)站抓取。

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

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

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

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

點(diǎn)贊計(jì)數(shù)函數(shù)統(tǒng)計(jì) Medium 上文章的點(diǎn)贊數(shù),單位為 “K” (1K=1000)。因此,在函數(shù)中需要考慮點(diǎn)贊數(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 錯(cuò)誤(請(qǐng)求過多),我們使用 time 庫,在發(fā)送請(qǐng)求之間引入延遲。此外,用 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),每個(gè)循環(huán)在第一次調(diào)用time.sleep()之前會(huì)首先設(shè)置必要的組件。我們會(huì)把天數(shù)轉(zhuǎn)換成月份和日期,并轉(zhuǎn)成字符串,然后根據(jù) urls 字典組成完整的 URL,最后發(fā)送請(qǐng)求獲取 HTML 響應(yīng)。

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

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ù)的樣子。請(qǐng)注意其中的 embedding,這些數(shù)據(jù)表示了文檔向量,也就是我們根據(jù)文章段落生成的向量。

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

獲取數(shù)據(jù)后,下一步是將其導(dǎo)入到向量數(shù)據(jù)庫中。在本項(xiàng)目中,我們使用了一個(gè)單獨(dú)的 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 并啟動(dòng)數(shù)據(jù)導(dǎo)入過程。用 dotenv 庫來管理環(huán)境變量。對(duì)于pymilvus包,需要導(dǎo)入以下模塊:

  • utility 用于檢查集合的狀態(tài)
  • connections 用于連接到 Milvus 實(shí)例
  • FieldSchema 用于定義字段的 schema
  • CollectionSchema 用于定義 collection schema
  • DataType 字段中存儲(chǔ)的數(shù)據(jù)類型
  • Collection 我們?cè)L問 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)建一個(gè) Collection 來存儲(chǔ)和組織從 TDS 網(wǎng)站抓取的數(shù)據(jù)。需要兩個(gè)常量:dimension(維度)和 collection name(集合名稱),dimension 是指我們的向量具有的維度數(shù)。在本項(xiàng)目中,我們使用 384 維的 MiniLM 模型。

Milvus 的全新 Dynamic schema 功能允許我們僅為 Collection 設(shè)置 ID 和向量字段,無需考慮其他字段數(shù)量和數(shù)據(jù)類型。注意,需要記住保存的特定字段名稱,因?yàn)檫@對(duì)于正確檢索字段至關(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ù)的選項(xiàng):

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

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

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 知識(shí)庫。這一步使用了一個(gè)單獨(dú)的筆記本。我們將使用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í)行搜索。在本項(xiàng)目中,我們將連接到一個(gè) Zilliz Cloud 實(shí)例,并檢索之前創(chuàng)建的集合 tds_articles,用戶要先輸入他們的查詢問題。

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

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

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)的信息,返回了以下兩個(gè)回答。盡管這些回答提到了“語言模型”并包含一些相關(guān)信息,但它們沒有提供關(guān)于大型語言模型的詳細(xì)解釋。第二個(gè)回答在語義上相似,但是不足夠接近我們想要的內(nèi)容。

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

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

05.總結(jié)

教程介紹了如何基于 Towards Data Science 文章構(gòu)建聊天機(jī)器人。我們演示了網(wǎng)頁爬取的過程,創(chuàng)建了知識(shí)庫,包括將文本轉(zhuǎn)換成向量存儲(chǔ)在 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)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編碼器
    +關(guān)注

    關(guān)注

    44

    文章

    3506

    瀏覽量

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

    關(guān)注

    0

    文章

    138

    瀏覽量

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

    關(guān)注

    66

    文章

    8293

    瀏覽量

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

    關(guān)注

    0

    文章

    14

    瀏覽量

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

    關(guān)注

    0

    文章

    323

    瀏覽量

    12250
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    智能聊天機(jī)器人的會(huì)話式應(yīng)用平臺(tái)日趨成熟化

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

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

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

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

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

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

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

    如何手?jǐn)]一個(gè)自有知識(shí)庫RAG系統(tǒng)

    用于自然語言處理任務(wù),如文本生成、問答系統(tǒng)等。 我們通過一下幾個(gè)步驟來完成一個(gè)基于京東云官網(wǎng)文檔的RAG系統(tǒng) 數(shù)據(jù)收集 建立知識(shí)庫 向量檢索 提示詞與模型 數(shù)據(jù)收集
    的頭像 發(fā)表于 06-17 14:59 ?251次閱讀