Posted on

掃描某個IP所有可接受連接的PORT

Nmap 介紹

Nmap(Network Mapper)是一款免費且開源的網路安全工具,用於網路發現和安全審計。它可以使用原始 IP 封包以新穎的方式來確定網路上的哪些主機可用、這些主機提供哪些服務(應用程式名稱和版本)、它們運行的作業系統(和作業系統版本)、使用的封包過濾器/防火牆類型以及其他數十種特性。

Nmap 的使用目的

Nmap 的工作原理是向目標主機發送原始 IP 封包並分析響應。Nmap 可以使用各種技術來掃描埠、檢測服務和確定作業系統。

  • 列舉網路主機清單:Nmap 可以掃描網路並列出所有可用的主機。這對於網路管理員了解其網路上的內容非常有用。
  • 管理服務升級排程:Nmap 可用於識別正在運行的服務和版本。這對於網路管理員跟踪軟體升級和修補程式非常有用。
  • 監視主機或服務執行狀況:Nmap 可用於監視主機或服務是否可用。這對於網路管理員確保其網路正常運行非常有用。
  • 漏洞檢測:Nmap 可用於掃描主機中的已知漏洞。這對於網路管理員保護其網路免受攻擊非常有用。

Nmap 主要功能

  • 埠掃描:Nmap 可以掃描目標主機的埠以確定哪些埠已開啟、已關閉或過濾。
  • 服務檢測:Nmap 可以檢測目標主機上運行的服務。它可以識別服務的應用程式名稱、版本和協定。
  • 作業系統偵測:Nmap 可以識別目標主機的作業系統。它可以識別作業系統的類型、版本和發行版。
  • NSE 腳本:Nmap 可以使用 NSE(Nmap Scripting Engine)腳本來擴展其功能。NSE 腳本可以用於執行各種任務,例如漏洞掃描、Web 應用程式掃描和網路枚舉。

使用方式

使用以下指令來安裝套件

sudo yum install nmap

接著使用以下指令來掃描所有可連接的port

nmap -v www.hinet.net

也可以使用-A來偵測對方主機的作業系統與各種服務的版本

nmap -A scanme.nmap.org

只需各種服務的版本

nmap -sV scanme.nmap.org

相關資源

Posted on

AIGC 文字/圖片生成

分享內容

1. ChatGPT_Bing_Bard_Claude指南

投影片: https://www.slideshare.net/……/1chatgptbi……/265753441

課程錄影: https://www.youtube.com/watch?v=AjNXpRn3G0s

2. 透過模板指令掌握使用技巧

投影片: https://www.slideshare.net/slideshows/2pdf-116d/265753345

課程錄影: https://www.youtube.com/watch?v=k33MNZA44Tw

3. 圖像生成及應用

投影片: https://www.slideshare.net/ssuser834f031/3pdf

課程錄影: https://www.youtube.com/watch?v=tcrJpJgavMA

4. AIGC的延伸應用介紹

投影片: https://www.slideshare.net/slideshows/4aigcpdf/265924625

課程錄影: https://www.youtube.com/watch?v=2wQ6JTFu0Fs

Posted on

使PostgreSQL支持向量相似度搜尋

安裝相關套件pgvector

套件Github頁面

https://github.com/pgvector/pgvector

pgvector可做到Postgres 的開源向量相似度搜索,將向量與其他數據一起存儲。

支援:

  • 精確和近似最近鄰搜索
  • 單精度(single-precision)、半精度(half-precision)、二進位(binary)和稀疏向量(sparse vectors)
  • L2 距離(L2 distance)、內積(inner product)、餘弦距離(cosine distance)、L1 距離(L1 distance)、漢明距離(Hamming distance)和 Jaccard 距離(Jaccard distance)
  • 具有 Postgres 用戶端的任何語言
  • 支持 ACID 合規性、時間點恢復、JOIN 和 Postgres 的所有其他強大功能

Linux安裝

cd /tmp
git clone --branch v0.7.2 https://github.com/pgvector/pgvector.git
cd pgvector
make
make install # may need sudo

Windows安裝

首先安裝VisualStudioSetup,此為下載連結: https://visualstudio.microsoft.com/downloads/

接著至少勾選這些套件

執行C的編譯環境

call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat"

使用nmake編譯檔案

set "PGROOT=C:\Program Files\PostgreSQL\16"
cd %TEMP%
git clone --branch v0.7.2 https://github.com/pgvector/pgvector.git
cd pgvector
nmake /F Makefile.win
nmake /F Makefile.win install

建立可儲存的向量的資料欄位

pgvector的資料格式為vector(1536),後面的(1536)代表長度,此為OpenAI的embedding長度

以下為一個建立表格的SQL範例

CREATE TABLE IF NOT EXISTS public.test_example
(
    id character varying(255) COLLATE pg_catalog."default" NOT NULL,
    embeddings vector(1536),
    CONSTRAINT test_example_pkey PRIMARY KEY (id)
)

在Object Explorer按右鍵選擇,Query Tool可開啟SQL輸入介面,要瀏覽現有資料庫表格列表可至Schemas->Tables瀏覽

新增資料至資料表

以下為一個範例

import psycopg2
df = pd.read_csv('./data.csv')
def convert_embedding(embedding_str):
    return list(map(float, embedding_str.split(',')))

df["embeddings"] = df["embeddings"].apply(literal_eval)

row = df.iloc[0]
sql = """
    INSERT INTO fare_info (
        id, embeddings 
    ) VALUES (
        %s, %s
    )
"""

conn = psycopg2.connect(dbname="myDB", user="myUser", password="xxxxxx")
cursor = conn.cursor()
cursor.execute(sql, (row['id'],row['embeddings']))
conn.commit()
Posted on

如何設定與操作PostgreSQL

了解安裝的PostgreSQL的相關資訊

像我是使用CentOS,因此我可以用下面的指令來得知現在系統中PostgreSQL的運行狀況

sudo systemctl status postgresql-13
● postgresql-13.service - PostgreSQL 13 database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql-13.service; enabled; vend>
   Active: active (running) since Sat 2024-06-08 22:48:41 UTC; 2 weeks 1 days a>
     Docs: https://www.postgresql.org/docs/13/static/
 Main PID: 3264201 (postmaster)
    Tasks: 8 (limit: 23678)
   Memory: 27.6M
   CGroup: /system.slice/postgresql-13.service
           ├─3264201 /usr/pgsql-13/bin/postmaster -D /var/lib/pgsql/13/data/
           ├─3264202 postgres: logger
           ├─3264204 postgres: checkpointer
           ├─3264205 postgres: background writer
           ├─3264206 postgres: walwriter
           ├─3264207 postgres: autovacuum launcher
           ├─3264208 postgres: stats collector
           └─3264209 postgres: logical replication launcher

Warning: Journal has been rotated since unit was started. Log output is incompl>

從回覆的資料可以看出,設定檔的資料會在/var/lib/pgsql/13/data/,接著就搜尋裡面的設定檔*.conf

[root@aia16 13]# find /var/lib/pgsql/13 -name *.conf
/var/lib/pgsql/13/data/postgresql.conf
/var/lib/pgsql/13/data/postgresql.auto.conf
/var/lib/pgsql/13/data/pg_hba.conf
/var/lib/pgsql/13/data/pg_ident.conf

允許非本機的連線

PostgreSQL 默認配置只允許本地連接(即 localhost127.0.0.1),這是出於安全考量。要允許遠程連接,需要修改 PostgreSQL 的配置文件並設置適當的防火牆規則。以下是允許遠程連接的步驟:

1. 修改 postgresql.conf 文件,打開 postgresql.conf 文件,找到 listen_addresses 配置項,將其設置為 ' * ' 以允許所有地址連接,或者指定特定的 IP 地址。例如:

listen_addresses = '*'

修改 pg_hba.conf 文件,添加允許遠程連接的規則。

host    all             all             0.0.0.0/0               md5

如果你只想允許特定的 IP 地址範圍,例如 192.168.1.0/24,可以這樣設置:

host    all             all             192.168.1.0/24          md5

接著重啟PostgreSQL

sudo systemctl restart postgresql

Posted on

Tesseract – Google開源的光學文字辨識系統

關於Tesseract

Tesseract 是一個開源的光學字符識別(OCR)引擎,能夠將圖像中的文本轉換為可編輯的文本。它由 Google 維護和開發,支持多種語言和字符集。

GitHub位置: https://github.com/tesseract-ocr/tesseract

Tesseract 4 添加了一個新的基於神經網路 (LSTM) 的 OCR 引擎,該引擎專注於行識別,但仍然支援 Tesseract 3 的傳統 Tesseract OCR 引擎,該引擎通過識別字元模式來工作。使用舊版 OCR 引擎模式 (–oem 0) 啟用與 Tesseract 3 的相容性。它還需要支援舊引擎的 traineddata 檔,例如來自 tessdata 儲存庫的檔。

Tesseract 支援 unicode (UTF-8),可以「開箱即用」地識別 100 多種語言。支援多種圖像格式,包括 PNG、JPEG 和 TIFF。支援各種輸出格式:純文本、hOCR (HTML)、PDF、不可見文本 PDF、TSV、ALTO 和 PAGE。

主要功能和特點

  1. 多語言支持: Tesseract 支持超過 100 種語言,包括繁體中文。
  2. 高準確度: Tesseract 在文本識別方面具有較高的準確度,特別是經過適當的預處理後。
  3. 易於集成: Tesseract 可以與多種編程語言和工具集成,例如 Python、C++、Java 等,方便開發者在不同的應用場景中使用。
  4. 開源和免費: Tesseract 是開源軟件,可以自由使用和修改。

安裝 Tesseract

需要安裝兩個部分:引擎本身和語言的 traineddata。超過 130 種語言和超過 35 種腳本的軟體包也可以直接從 Linux 發行版獲得。語言 traineddata 包稱為“tesseract-ocr-langcode”和“tesseract-ocr-script-scriptcode”,其中 langcode 是三個字母的語言代碼, scriptcode 是四個字母的腳本代碼。

安裝教學: https://tesseract-ocr.github.io/tessdoc/InstallationOpenSuse.html

以 root 身份運行以下命令:(CentOS7)

yum-config-manager --add-repo https://download.opensuse.org/repositories/home:/Alexander_Pozdnyakov/CentOS_7/
sudo rpm --import https://build.opensuse.org/projects/home:Alexander_Pozdnyakov/public_key
yum update
yum install tesseract 
yum install tesseract-langpack-deu

使用方式

  • 從發佈頁面下載AppImage
  • 開啟終端應用程式
  • 流覽到 AppImage 的位置
  • 使 AppImage 可執行:$ chmod a+x tesseract*.AppImage
  • 執行它:./tesseract*.AppImage -l eng page.tif page.txt

安裝 pytesseract

pytesseract 是一個 Python 包裝器,用於調用 Tesseract OCR 引擎。

pip install pytesseract
pip install pillow

使用 Tesseract 進行 OCR

from PIL import Image
import pytesseract

# 設定 tesseract 執行檔的路徑
pytesseract.pytesseract.tesseract_cmd = r'/usr/local/bin/tesseract'  # 替換為你的 tesseract 安裝路徑

# 打開圖像文件
image = Image.open('example.png')

# 使用 Tesseract 進行 OCR
text = pytesseract.image_to_string(image, lang='chi_tra')  # 使用繁體中文語言包
print(text)
Posted on

安裝Postgresql和PgAdmin過程記錄

Postgresql安裝教學

安裝的指令如下

sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %rhel)-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo yum -qy module disable postgresql
sudo yum install -y postgresql13-server postgresql13
sudo /usr/pgsql-13/bin/postgresql-13-setup initdb
sudo systemctl enable postgresql-13
sudo systemctl start postgresql-13
sudo -i -u postgres
psql

接著建立資料庫

CREATE USER myuser WITH PASSWORD 'mypassword';
CREATE DATABASE mydb;
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;

退出命令行

\q
exit

安裝PgAdmin

以下為安裝的指令建議

$ sudo mkdir /var/lib/pgadmin
$ sudo mkdir /var/log/pgadmin
$ sudo chown $USER /var/lib/pgadmin
$ sudo chown $USER /var/log/pgadmin
$ python3 -m venv pgadmin4
$ source pgadmin4/bin/activate
(pgadmin4) $ pip install pgadmin4
...
(pgadmin4) $ pgadmin4
NOTE: Configuring authentication for SERVER mode.

Enter the email address and password to use for the initial pgAdmin user account:

Email address: user@domain.com
Password: 
Retype password:
Starting pgAdmin 4. Please navigate to http://127.0.0.1:5050 in your browser.
 * Serving Flask app "pgadmin" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off

強烈建議使用 Python 虛擬環境,不然因為牽涉到的library眾多,很容易會有函式庫之間的彼此衝突

安裝及啟動pgAdmin的方法

以下為安裝方式

$ sudo mkdir /var/lib/pgadmin
$ sudo mkdir /var/log/pgadmin
$ sudo chown $USER /var/lib/pgadmin
$ sudo chown $USER /var/log/pgadmin
$ python3 -m venv pgadmin4
$ source pgadmin4/bin/activate
(pgadmin4) $ pip install pgadmin4
...
(pgadmin4) $ pgadmin4
NOTE: Configuring authentication for SERVER mode.

Enter the email address and password to use for the initial pgAdmin user account:

Email address: user@domain.com
Password: 
Retype password:
Starting pgAdmin 4. Please navigate to http://127.0.0.1:5050 in your browser.
 * Serving Flask app "pgadmin" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off

啟動則只需要

$ source pgadmin4/bin/activate
(pgadmin4) $ pgadmin4

問題1 : 無法啟動pgAdmin

錯誤訊息

No module named '_sqlite3'

解決方法

首先先安裝所需要的套件

sudo apt update
sudo apt install libsqlite3-dev

接著要找到PYTHON的位置並且重新編譯

把下面的/path/to/python/source換成你的PYTHON的根目錄

cd /path/to/python/source
sudo ./configure --enable-optimizations
sudo make
sudo make altinstall

然後就可以正常啟動囉!

問題2:只能從127.0.0.1連線

使用下面指令找到套件位置

pip show pgadmin4 | grep Location

修改config

找到下面這行並將127.0.0.1改成0.0.0.0

DEFAULT_SERVER = '0.0.0.0'

問題3: 開啟防火牆5050端口

sudo systemctl start firewalld
sudo systemctl enable firewalld
sudo firewall-cmd --zone=public --add-port=5050/tcp --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --zone=public --list-ports

最後一行是用以檢查是否已打開,如果 5050/tcp 在列表中,則表示已成功打開。

接著把SELINUX的端口打開

sudo semanage port -a -t http_port_t -p tcp 5050

就可以成功連線啦!

Posted on

Prompt engineering 提示工程

獲得更好結果的六種策略

 寫清楚的說明

  • 在查詢中包含詳細資訊以獲得更相關的答案
  • 要求模型採用角色
  • 使用分隔符清楚地指示輸入的不同部分
  • 指定完成任務所需的步驟
  • 舉例說明
  • 指定所需的輸出長度
  •  提供參考文本

 提供參考文本

  • 指示模型使用參考文本回答問題
  • 指示模型使用參考文本的引用來回答

將複雜的任務拆分為更簡單的子任務

正如軟體工程中的良好做法是將複雜系統分解為一組模組化元件一樣,提交給語言模型的任務也是如此。複雜任務往往比簡單任務具有更高的錯誤率。此外,複雜任務通常可以重新定義為更簡單任務的工作流,其中早期任務的輸出用於構造後續任務的輸入。

  • 使用意圖分類來標識與用戶查詢最相關的指令
  • 對於需要很長對話的對話應用程式,請總結或過濾以前的對話
  • 分段總結長文檔,並以遞歸方式構建完整的摘要

給模型時間“思考”

如果要求將 17 乘以 28,您可能不會立即知道,但仍然可以隨著時間的推移計算出來。同樣,模型在試圖立即回答時會犯更多的推理錯誤,而不是花時間找出答案。在回答之前要求一個「思維鏈」可以説明模型更可靠地推理出正確的答案。

  • 在匆忙得出結論之前,指示模型制定自己的解決方案
  • 使用內心獨白或一系列查詢來隱藏模型的推理過程
  • 詢問模型在之前的刀路中是否遺漏了任何內容

使用外部工具

通過向模型提供其他工具的輸出來補償模型的弱點。例如,文本檢索系統(有時稱為RAG或檢索增強生成)可以告訴模型有關相關文檔的資訊。像 OpenAI 的 Code Interpreter 這樣的代碼執行引擎可以説明模型進行數學運算和運行代碼。如果一項任務可以通過工具而不是語言模型更可靠或更高效地完成,請卸載它以充分利用兩者。

  • 使用基於嵌入的搜索實現高效的知識檢索
  • 使用代碼執行來執行更準確的計算或調用外部 API
  • 授予模型對特定函數的訪問許可權

系統地測試更改

如果可以衡量性能,則更容易提高性能。在某些情況下,對提示的修改將在幾個孤立的示例上獲得更好的性能,但在更具代表性的示例集上會導致整體性能較差。因此,為了確保更改對性能有淨積極影響,可能需要定義一個全面的測試套件(也稱為“eval”)。

  • 參考黃金標準答案評估模型輸出

更多範例請見: https://platform.openai.com/docs/guides/prompt-engineering/strategy-write-clear-instructions

Posted on

RAG中準備檢索資料的概念及方向

Embedding向量搜尋的概念

在RAG(Retrieval-Augmented Generation)模型中,embedding 向量搜尋是一個關鍵步驟,用於在資料庫中找到與當前查詢相關的資訊。RAG結合了檢索和生成的能力,通過將外部知識融入生成過程中來提高生成內容的質量和相關性。以下是 embedding 向量搜尋的主要步驟:

  1. 查詢嵌入 (Query Embedding)
    將用戶的查詢轉換成嵌入向量。這通常是通過一個預訓練的語言模型(如BERT或RoBERTa)來完成。這些模型能夠將文字表示成固定長度的向量,捕捉文字的語義信息。
  2. 資料庫嵌入 (Database Embedding)
    資料庫中的每個文本片段(如文章、段落、句子)也被轉換成嵌入向量。這些嵌入向量通常預先計算並存儲起來,以便在查詢時能快速檢索。
  3. 相似度計算 (Similarity Calculation)
    使用某種相似度度量(如餘弦相似度)來計算查詢嵌入向量與資料庫中嵌入向量之間的相似度。餘弦相似度測量兩個向量之間的夾角,角度越小,相似度越高。
  4. 檢索相關資料 (Retrieve Relevant Data)
    根據相似度分數,選擇與查詢最相關的前N個資料庫片段。這些片段將作為檢索結果返回。
  5. 融合與生成 (Fusion and Generation)
    RAG模型將檢索到的相關片段與查詢結合起來,通過生成模型(如GPT-3)生成最終的回應。生成模型利用檢索到的資訊,生成更為準確和豐富的回答。

簡單範例

假設我們有一個簡單的資料庫,包含以下句子:

  1. “Python是一種流行的編程語言。”
  2. “GPT-3是OpenAI開發的語言模型。”
  3. “嵌入向量是機器學習中的重要概念。”

用戶查詢:「什麼是GPT-3?」

  1. 查詢嵌入:將「什麼是GPT-3?」轉換成嵌入向量Q。
  2. 資料庫嵌入:將資料庫中的每個句子轉換成嵌入向量D1, D2, D3。
  3. 相似度計算:計算Q與D1, D2, D3的相似度。例如,相似度分數可能是:
    Q與D1: 0.2
    Q與D2: 0.9
    Q與D3: 0.3
  4. 檢索相關資料:根據相似度分數,檢索到最相關的片段是「GPT-3是OpenAI開發的語言模型」。
  5. 融合與生成:RAG模型將檢索到的片段與查詢結合,生成關於GPT-3的詳細說明。

以下為一個用書名做向量檢索的文章,看了此文章會更能理解向量空間的文字意義檢索的概念

https://towardsdatascience.com/building-a-recommendation-system-using-neural-network-embeddings-1ef92e5c80c9

從Fancy AI了解準備資料的幾種方式

網站如下: https://www.fancyai.co/

從上面的圖片我們可看出大概可分為【直接分段】或【以QA方式去呈現】,而QA方式又分成【讓AI自動整理問答對】、【人工整理問答對】。

三種方式的優缺點比較

這三種方法各有其優缺點,適用於不同的應用場景和需求。

1. 手動輸入問答對

優點:

  • 高準確性: 手動輸入的問答對由專家或知識擁有者編寫,確保了答案的準確性和相關性。
  • 高度針對性: 可以針對特定領域或問題編寫,回答更具針對性。
  • 質量控制: 可以進行嚴格的審查和驗證,確保資料的質量。

缺點:

  • 耗時耗力: 手動編寫問答對需要大量人力和時間,尤其是資料量大的情況下。
  • 不易擴展: 隨著知識庫的增長,維護和更新問答對會變得愈發困難。

2. AI自動產生問答對

優點:

  • 自動化程度高: 使用AI技術(如自然語言處理)自動生成問答對,大幅減少人力投入。
  • 快速生成: 可以在短時間內生成大量問答對,適合快速擴展知識庫。
  • 適應性強: 可以根據需要自動更新和擴展問答對。

缺點:

  • 準確性不穩定: AI自動生成的問答對可能存在錯誤或不精確的情況,需要人工審核。
  • 質量參差不齊: 自動生成的答案質量可能不均一,部分回答可能缺乏深度或詳細性。

3. 直接將文件做分段

優點:

  • 節省時間: 直接將長文檔分段,可以快速建立起知識庫,節省了人工編寫問答對的時間。
  • 完整性: 保留了原始文檔的完整信息,便於系統檢索和引用。
  • 多樣性: 文檔中的信息可能涵蓋多個方面,能夠提供更豐富的回答。

缺點:

  • 相關性不一定高: 分段的文檔內容可能不是針對具體問題,回答的針對性和相關性可能不如手動問答對。
  • 需要處理和優化: 分段後的文檔需要進行處理和優化,以確保分段的合理性和檢索的效率。
  • 資料雜亂: 如果文檔內容過於雜亂或不夠結構化,可能會影響檢索結果的質量。

適用的場景

  • 手動輸入問答對 適合需要高度精確和針對性回答的應用場景,如專業領域的技術支持或知識管理。
  • AI自動產生問答對 適合需要快速建立和擴展知識庫的情況,如大型網站的常見問題解答(FAQ)系統。
  • 直接將文件做分段 適合需要處理大量現有文檔資料的應用,如文檔管理系統或數字圖書館。

直接分段的範例

以上面的例子來說,用戶查詢「怎麼串接GPT-3的API?」,

假設我們有以下一段文檔:

Python是一種流行的編程語言。它擁有豐富的庫和框架,適用於各種應用場景。GPT-3是由OpenAI開發的一個強大的語言模型,可以生成高質量的自然語言文本。嵌入向量是機器學習中的重要概念,用於表示文字的語義信息。

我們可以將這段文檔拆分成以下分段:

  1. “Python是一種流行的編程語言。”
  2. “它擁有豐富的庫和框架,適用於各種應用場景。”
  3. “GPT-3是由OpenAI開發的一個強大的語言模型,可以生成高質量的自然語言文本。”
  4. “嵌入向量是機器學習中的重要概念,用於表示文字的語義信息。”

然後對每個分段生成嵌入向量,並在檢索系統中建立索引。當用戶查詢「什麼是GPT-3?」時,系統會找到與該查詢最相關的分段(如第三個分段),並用它來生成回應。

產生問答對的範例

問答對生成

  1. 問題:Python是什麼?
    回答:Python是一種流行的編程語言。
  2. 問題:Python有哪些特點?
    回答:Python擁有豐富的庫和框架,適用於各種應用場景。
  3. 問題:GPT-3是什麼?
    回答:GPT-3是由OpenAI開發的一個強大的語言模型,可以生成高質量的自然語言文本。
  4. 問題:嵌入向量是什麼?
    回答:嵌入向量是機器學習中的重要概念,用於表示文字的語義信息。
  5. 問題:Python的應用場景有哪些?
    回答:Python適用於各種應用場景,因為它擁有豐富的庫和框架。
  6. 問題:GPT-3的開發者是誰?
    回答:GPT-3是由OpenAI開發的。

生成問答對的步驟

  1. 文本分析
    • 對給定的文本進行語義分析,識別出關鍵概念和信息點。
    • 例如,在這段文本中,關鍵概念包括「Python」、「庫和框架」、「GPT-3」、「OpenAI」、「嵌入向量」、「機器學習」等。
  2. 生成問題
    • 根據關鍵概念生成相關的問題。
    • 問題應該簡潔明了,針對文本中的具體信息點。
  3. 生成答案
    • 根據文本中提供的信息生成相應的答案。
    • 答案應該準確反映文本中的內容,並且與問題直接相關。
Posted on

使用LlamaIndex載入多種類文件

LlamaIndex的教學資料

這邊有許多的簡單範例:

https://github.com/SamurAIGPT/LlamaIndex-course

這邊則是載入文件的範例:

https://github.com/SamurAIGPT/LlamaIndex-course/blob/main/dataconnectors/Data_Connectors.ipynb

範例程式載入PDF如下

from pathlib import Path
from llama_index.core import download_loader

PDFReader = download_loader("PDFReader")

loader = PDFReader()

pdf_document = loader.load_data(file=Path('./sample.pdf'))

載入YouTube的字幕的範例如下

from llama_index.core import download_loader

YoutubeTranscriptReader = download_loader("YoutubeTranscriptReader")

loader = YoutubeTranscriptReader()
youtube_documents = loader.load_data(ytlinks=['https://www.youtube.com/watch?v=nHcbHdgVUJg&ab_channel=WintWealth'])

使用上面的寫法我們會發現會跳出這樣的警告

DeprecationWarning: Call to deprecated function (or staticmethod) download_loader. (`download_loader()` is deprecated. Please install tool using pip install directly instead.) PDFReader = download_loader(“PDFReader”)

錯誤警告訊息

新的文件讀取方式

現在官方推薦的檔案讀取方式如下

from llama_index.core import SimpleDirectoryReader

documents = SimpleDirectoryReader("./files").load_data()

不過,如果我們需要這個Reader使用特別的解析器去解析特別格式的文件的話,則要使用額外相關的函式庫,如下面的介紹

相關的函式庫

接著當我們查詢載入本地端檔案的API時,可以看到這個頁面有許多Reader的介紹

https://docs.llamaindex.ai/en/stable/api_reference/readers/file/

但是如果直接在llamaindex.core會找不到裡面許多的函數,這時候可以在這邊找到

https://llamahub.ai/?tab=readers

這邊可以找到許多其他開發者開發的好用函式庫

讀取各式文件的函式庫

首先先安裝所需的套件

pip install llama-index-readers-file

那Reader頁面中許多各式各樣的Reader則請參考此文件:

https://llamahub.ai/l/readers/llama-index-readers-file?from=readers

使用範例如下,下面這子我們會可以用doc.text去取得這張圖片的一個文字描述

from llama_index.core import SimpleDirectoryReader
from llama_index.readers.file import ImageCaptionReader
# Image Reader example
parser = ImageCaptionReader()
file_extractor = {
    ".jpg": parser,
    ".jpeg": parser,
    ".png": parser,
}  # Add other image formats as needed
documents = SimpleDirectoryReader(
    "./data", file_extractor=file_extractor
).load_data()
for index, doc in enumerate(documents):
    print(doc.text)

要注意的是,當我們這邊使用圖片閱讀器,事實上他會載入Hugging Face的一些transformers模型去做圖片辨識,有一些模型只能使用GPU,所以,我們一定要記得我們的Pytorch要使用GPU版本的

參考此文件: https://pytorch.org/get-started/locally/

如果已經安裝了CPU版本的,記得先把torch反安裝後再重新安裝GPU版本

Posted on

在LlamaIndex中的查詢流程

查詢流程解析

檢索器(Retrievers)

檢索器就像是一個數據查找工具,它會根據用戶的查詢從索引中高效地獲取相關的上下文信息。選擇合適的檢索策略至關重要,它會影響檢索到的數據的相關性和效率。

路由器(Routers)

路由器決定了應該使用哪個檢索器從知識庫中獲取相關的上下文信息。更確切地說,RouterRetriever 類負責基於查詢選擇一個或多個候選檢索器來執行查詢。它們會使用選擇器基於每個候選檢索器的元數據和查詢來選擇最佳選項。

節點後處理器(Node Postprocessors)

節點後處理器接收一組檢索到的節點,然後可以對它們進行轉換、過濾或重新排序等操作。

響應合成器(Response Synthesizers)

響應合成器使用大型語言模型 (LLM)、用戶查詢和給定的一組檢索到的文本片段來生成響應。

甚麼是Retriever

檢索器(Retriever)是用來根據給定的查詢從數據源中提取相關的資訊(節點)。這是檢索增強生成(Retrieval-Augmented Generation,RAG)流程中的關鍵步驟,其中檢索器有助於識別可用於生成回應的最相關數據。

以下是檢索器在LlamaIndex中的工作方式概述:

  1. 數據攝取:從各種來源(例如PDF、SQL數據庫)中攝取數據並建立索引。
  2. 檢索:當提出查詢時,檢索器會從已索引的數據中提取相關的節點(數據片段)。
  3. 回應合成:然後使用檢索到的節點來生成回應,通常是將它們與查詢一起輸入語言模型。

檢索器建立在索引之上,指定了如何從索引中檢索節點。

不同的Retriever介紹

https://docs.llamaindex.ai/en/stable/module_guides/querying/retriever/retrievers/

有許多不同種的檢索器,較基本的有下面這些

  • 向量存儲檢索器(Vector index retriever)
    向量存儲檢索器從向量存儲索引中檢索出前 k 個最相似的節點。在這裡,模式不具有顯著意義。
  • 列表檢索器
    您可以使用列表檢索器從列表索引中檢索出所有節點。這個檢索器支持兩種模式:default embeddings。默認模式檢索所有節點,而嵌入模式使用嵌入檢索出使用嵌入檢索出前 k 個節點。
  • 樹形檢索器 (GPT all leaf retriever)
    正如其名,樹形檢索器從節點的分層樹中提取節點。這個檢索器支持許多不同的模式,默認是選擇select_leaf
  • 關鍵字表檢索器 (Base Keyword Table Retriever)
    關鍵字表檢索器從查詢中提取關鍵字,並使用它們來查找具有匹配關鍵字的節點。這個檢索器支持三種不同的模式: defaultsimple、和rake模式。
  • 知識圖檢索器 (KG Table Retriever)
    知識圖檢索器從節點的分層樹中檢索節點。支持 keywordsembeddings、和hybrid模式。
    1. 關鍵字模式(keywords): 使用查詢中提取的關鍵字來尋找相關的節點。
    2. 嵌入模式(embeddings): 使用嵌入向量來尋找相關的節點。
    3. 混合模式(hybrid): 同時使用關鍵字和嵌入向量來尋找相關的三元組。混合模式的思想是將關鍵字和嵌入向量結合起來,以更全面地找到與查詢相關的信息。這樣可以充分利用關鍵字的文本特徵和嵌入向量的語義信息。

簡單的使用範例

以下是使用ListIndex且模式為embedding的使用範例

from llama_index import ListIndex
from llama_index import download_loader

YoutubeTranscriptReader = download_loader("YoutubeTranscriptReader")

loader = YoutubeTranscriptReader()
docs = loader.load_data(ytlinks=['https://www.youtube.com/watch?v=nHcbHdgVUJg&ab_channel=WintWealth'])
list_index = ListIndex(docs)
retriever = list_index.as_retriever(
    retriever_mode='embedding',
)

使用範例

retriever.retrieve('What is the difference between a stock and a bond?')

檢索出的資訊

[NodeWithScore(node=Document(id_='nHcbHdgVUJg', embedding=[0.006401017773896456, -0.02431839518249035, -0.005019601434469223, -0.03640920668840408, -0.021309370175004005, 0.02166498266160488, ......, -0.011140232905745506], metadata={'video_id': 'nHcbHdgVUJg'}, excluded_embed_metadata_keys=[], excluded_llm_metadata_keys=[], relationships={}, text="I'm a Commerce graduate I went to Vijay\nCollege which is like a Government\nCollege type so I'm also not from IIT\nI graduated from MIT Pune Pu......t for it or not and like\nnobody tell you that you're cut out to\nbe a founder or not one thing which\nwhich is common in all the founders who\nsucceed is they don't give up so that's\nwhat that's probably yeah so\nhello", start_char_idx=None, end_char_idx=None, text_template='{metadata_str}\n\n{content}', metadata_template='{key}: {value}', metadata_seperator='\n'), score=0.7269996487772504)]