Try   HackMD

langchain, llama-index 學習筆記:

如果還不了解語言模型或是chatgpt原理可以先看這篇:
ChatGpt比較:費用、概念、模型與使用介紹

langchain:基於LLMs的應用程序開發框架

Data augemented generation 先搜再問

LLMs是基於大量非結構化的語料訓練的, 所以對通用的nlp任務有很好的的效果, 然而很多時候, 我們需要的不是在利用通用數據來生成結果, 而是基於特定的數據來產生結果

步驟:

  1. fetching: 取回
  2. user provided
  3. document retrival
  4. api querying
  5. augmenting: 傳遞給LLM

fetching

在fetching過程中, 取回的文檔不能太大, 因為目前的模型都對輸入的長度有限制, 所以langchain提供了各種工具來split文檔成一小片, 並且控制每片中的內容重疊(保持上下文)。
另外一個是, 不能取回太多的文檔, 最好只選取和問題相關的文檔(相關度要高), 有很多的方式來做這件事, 當下比較流行的是:

在語義搜索和Q&A系統中, 將語料的doc切分成chunk, 將chunk向量化, 然後儲存, 當用戶輸入後, 首先進行向量化的相關性搜索, 將搜索的結果以及用戶數據一起作為prompt作為輸入餵給LLM, 這是目前常見的做法(但業界也在考慮轉為大模型設計的數據結構和索引技術, 詳見LlamaIndex)

詞向量Word vector

詞向量的技術就希望將每個單字賦予一個向量,用來表示這個單字在各種維度(Dimenesion)所代表的相對意義,以向量區分每個單字與其他單字的相似程度。所謂『各種維度』的意思是指,例如,就生物角度來看,man(男人)與woman(女人)是很相似的,因為他們同屬人類,但是從另一個角度『性別』來看,他們恰似相反的,所以,要將一個單字轉換為向量,不能只考慮一維,而是要有多面向來觀察,亦即多維(通常是100~1000),這就是『詞向量』(Word Embedding or Word Vector)的粗淺概念。

主要包含六個部分

  1. Prompt templates :prompt管理,優化
  2. Chains:一系列的調用(LLMs或者其他, 如網路, 操作系統), chains提供了標準的接口和設置來組合
  3. Data augmented generation: 基於特定數據的生成內容, 一種特殊的chain, 提供了一種能力: 先從外部的源獲取信息, 然後餵給LLMs
  4. Agents: 代理, 非常重要的一環, 關於對LLMs做何種action, 如何做
  5. Memory :標準的接口, 在chains/call之間保存狀態
  6. Evaluation: 提供了一些prompts/chains來利用模型來評估自身

官方文件:
https://python.langchain.com/en/latest/

LlamaIndex(前身GPT Index) -> 專注在數據層

對於私有數據, 受限於LLM的無狀態, 訓練代價大, token個數限制, 甚至fine-tune的接口不開放等等, 對於私有數據上的內容生成, 現在常見的做法是embedding文檔, 先搜後問, 也即上文提到的langchain的一個核心模塊: data augementing generation。

現在想要增強LLM在私有數據上的表現能力, 有兩種方式: fine-tune 和in-context learning (即將上下文放入輸入的prompt中)。為了更好地(高效,便宜)進行data augmentation, 因此要解決數據讀取和索引。

LlamaIndex提供的工具:

  • data connectors : 連接到數據源, 和不同的數據格式
  • 利用LLM來給結構化,非結構化數據做索引. 簡化了in-context learning過程中繁瑣的細節: prompt長度, 文本拆分,etc
  • 用戶優化的索引query 接口和模型調用接口的結合
  • 一個權衡成本和性能的全面的工具集
    不同於langchain的全面開發, 均衡發展策略, llama-index更像是專注在data augmentation generation, 圍繞它來開發周邊對應的能力(即豐富的數據源和數據格式的讀取器)
In-context learning

In-context learning 是指一種在特定上下文中學習的方法,即通過在特定情境下學習和理解知識和技能,使學習更加具體和實用。它可以是指在現實生活中學習,也可以是在虛擬環境中進行模擬經驗的學習。

舉個例子,如果你想學習如何寫好一篇新聞報導,傳統的學習方法可能是通過閱讀一些關於寫新聞的指南和規則來學習。但是,in-context learning 的方法可能是讓你閱讀一篇現實中的新聞報導,然後分析它的結構、風格和語言,並試著寫出一篇類似的報導,從而在學習中深入了解和熟悉新聞報導的各個方面。

總結

LlamaIndex vs LangChain 的區別:

根本上是因為大語言模型支持的context有限,比如ChatGPT的Davinci model只有4096 tokens,對應中文,可能只有2000個,因此如果需要藉助GPT語言模型+私有數據,那就需要突破4096 tokens 的限制,也就是feed "knowledge" to LLMs,所以需要用LlamaIndex。

與此同時,在用ChatGPT 時,單次輸入的prompt 也有限制,所以LlamaIndex可以簡化這個feed 餵數據的過程。

那為什麼還要用LangChain 呢?因為LLMs不只OpenAI 的GPT 模型,LangChain 可以對接多種模型,即Lang,而Chain 的意思就是把多個LLM 調用,而且是調用序列,標準化,集成等工作,最後串起來。

LangChain 還做了很多框架層面的工作:Prompt、Loader、Chain、Agent、Memory,比如Loader 部分,它也推出了跟https://llamahub.ai類似的https://github.com/hwchase17/langchain-hub,用來集成外部數據。區別就在於LlamaIndex能用的,LangChain 都能用,LangChain 的Loader 能加載其他語言模型,是GPT 的超集。

再比如Memory 部分,就是用來持久化內存狀態,所以能實現ChatGPT 聊天機器人這樣的功能,記住以前的交互非常重要,無論是短期的還是長期的。

官方說明文件:https://gpt-index.readthedocs.io/en/latest/index.html
本文參考:https://www.jianshu.com/p/d92df85a4c20
llama-index操作實例:https://zhuanlan.zhihu.com/p/613155165

本機實際操作:

1.安裝python 3.10
=>到官網依照系統下載
2.下載pycharm創建一個新的project
3.在pycharm prefernce的setting中可以指定python版本點選’+’安裝package
4. 在main.py中加入

import os
from pathlib import Path
from llama_index import GPTSimpleVectorIndex, download_loader
os.environ['OPENAI_API_KEY'] ='你在chatgpt網頁中生成的apikey'

if __name__ == '__main__':
    JSONReader = download_loader("JSONReader")
    loader = JSONReader()
    documents = loader.load_data(Path('./text.json'))
    index = GPTSimpleVectorIndex.from_documents(documents)
    index.save_to_disk('index.json')
    # Load the index from your saved index.json file
    index = GPTSimpleVectorIndex.load_from_disk('index.json')
    
    while True:
    prompt = input("Type...")
    response = index.query(prompt)
    print(response)

(可以搭配 Flask、Django部署到Vercel、Render等建置一個簡易的網站)