今天要講的是RAG中ChromaDB的實作,在開始之前先慶祝一下
✨ Stima API正式上線了,新用戶可以獲得5美金的試用額度,歡迎嘗試並一探Stima的全貌,享受實惠的GPT、Claude、Gemini!
等一下我會介紹兩部分
初始化 ChromaDB 客戶端:
我們創建了一個 chromadb.Client
。作為向量資料庫的存取與查用。
重置數據庫:
在初始化時,我們調用了 reset()
方法,這將清除數據庫中的所有內容,確保每次運行時數據庫都是空的。
創建或獲取集合:
我們使用 get_or_create_collection
方法創建或獲取一個名為 tizi365
的集合。集合是 ChromaDB 中的邏輯數據分區,用來存儲相關的嵌入和元數據。
加載 JSON 數據:
在 loadjson
方法中,我們從指定的文件中加載 JSON 數據,並對每個句子進行嵌入計算。然後,我們將嵌入、文檔和元數據添加到集合中。
查詢數據:
在 getquery
方法中,我們對給定的查詢文本進行嵌入計算,並使用該嵌入在集合中查找最相關的結果。查詢結果包括匹配的文檔、元數據和距離(相似度)。
你需要安裝 chromadb 和 sentence_transformers,可以使用以下命令:
pip install chromadb sentence-transformers
注意:安裝過程中可能會遇到依賴庫的版本問題,例如 numpy 的版本不對。如果出現這類問題,你可以嘗試安裝不同版本的依賴庫。
import json
import chromadb
from chromadb import Settings
from sentence_transformers import SentenceTransformer, util # embedding是用這個
class ChromaDB2:
def __init__(self, model_path = None, model_name = 'paraphrase-multilingual-mpnet-base-v2', collection_name="tizi365"):
try:
self.model = SentenceTransformer(model_path)
except:
self.model = SentenceTransformer(model_name)
chroma_client = chromadb.Client(Settings(allow_reset=True))
chroma_client.reset() #清除資料庫內容
self.collection = chroma_client.get_or_create_collection(name=collection_name, metadata={"hnsw:space": "cosine"})
self.index = 0
def loadjson(self, file_path = "output.json"):
print("sentence_transformers loading JSON.")
file_path = file_path
with open(file_path, "r", encoding="utf-8") as file:
file_content = file.read()
sentences = json.loads(file_content)
for index, sentence in enumerate(sentences):
#embedding = model.encode(json.dumps(sentence, ensure_ascii=False))
embedding = self.model.encode([sentence["query"]])
self.collection.add(
embeddings=embedding,
documents=[json.dumps(sentence["Content"], ensure_ascii=False)],
metadatas=[{"query":sentence["query"], "source": sentence["Source"], "Link":sentence['Link']}],
ids=str(self.index+1)
)
self.index += 1
print("sentence_transformers loading JSON end.")
# 抓取相似資料
def getquery(self, query_text, n_results= 1, prints = True, full_text=False, ):
relevant_examples = self.collection.query(
query_embeddings=self.model.encode([query_text]),
n_results=n_results,)
if prints:
print('query_text: ', query_text)
print("[0][0][0][0]", relevant_examples)
print(relevant_examples["metadatas"][0])
if full_text:
return relevant_examples
else:
return relevant_examples["documents"][0], relevant_examples["metadatas"][0], relevant_examples["distances"][0]
{'query': '7月11日上海見!半導體檢測行業盛會即將啟幕 院士專家、頭部企業、科研院所都要來', 'Content': '①“2024中國檢測技術與半導體應用大會——暨半導體分析檢測儀器與設備發展論壇”即將於2024年7月11日至13日在上海隆重舉行;\n②大會由國家集成電路創新中心、上海市儀器儀表行業協會和財聯社主辦,復旦大學光電研究院、復創芯、《科創板日報》等單位承辦。', 'Source': 'chinastarmarket', 'Link': 'https://www.chinastarmarket.cn/detail/1720545'}
以下程式可以用來呼叫chromadb
from ForwarderAPI2 import ForwarderAPI
from testChromaDB2_home import ChromaDB2
import pandas as pd
import time
# 初始化chromadb
chromas = ChromaDB2(model_path=r"C:\Users\julia\.cache\huggingface\hub\models--sentence-transformers--paraphrase-multilingual-mpnet-base-v2\snapshots\79f2382ceacceacdf38563d7c5d16b9ff8d725d6")
chromas.loadjson()
rag_outs, complexes, distances = chromas.getquery("AI投資展望", n_results=5, prints=False)
rag_outs
並獲得以下結果
[{'Link': 'https://www.chinastarmarket.cn/detail/1720555',
'query': 'AI投資它來了!橋水啟動一隻20億美元新基金 依靠機器學習做決策',
'source': 'chinastarmarket'},
{'Link': 'https://www.chinastarmarket.cn/detail/1718594',
'query': '四川天府新區再增20億人工智能產業基金',
'source': 'chinastarmarket'},
{'Link': 'https://www.chinastarmarket.cn/detail/1615266',
'query': 'AI“復活”逝者已成生意?相關技術推廣需更多監管和規範',
'source': 'chinastarmarket'},
{'Link': 'https://www.chinastarmarket.cn/detail/1615773',
'query': '國產工業軟件企業安世亞太擬IPO 中信證券輔導 中網投、保利、中車都投了',
'source': 'chinastarmarket'},
{'Link': 'https://www.chinastarmarket.cn/detail/1718814',
'query': '中國私募股權投資基金LP月報(2024年5月):紹興越城區產業股權投資基金出資最高,中金資本最受青睞',
'source': 'chinastarmarket'}]
可以使用下列程式加入RAG於LLM中
request_topic = "AI投資展望"
rag_outs, complexes, distances = chromas.getquery(request_topic, n_results=5, prints=False)
prompt = f'''我需要一篇{request_topic},請根據現有資料庫,統整以及匯集出300字的文章,參考資料'''
datas = ""
for x in range(len(rag_outs)):
datas += f"標題{x+1}: " + complexes[x]['query'] + ",內容: " + rag_outs[x]
prompt_mod = prompt+datas
prompt_mod
會得到
我需要一篇AI投資展望,請根據現有資料庫,統整以及匯集出300字的文章,參考資料標題1: AI投資它來了!橋水啟動一隻20億美元新基金 依靠機器學習做決策,內容: "①全球最大的對沖基金公司橋水最新推出了一隻由機器學習運行並進行決策的基金;\\n②該基金的規模大約20億美元,已於週一(7月1日)開始交易;\\n③這是橋水CEO巴爾·迪亞自上任以來推動公司轉型的最新舉措。"標題2: 四川天府新區再增20億人工智能產業基金,內容: "①2024成都市人工智能與機器人產業融合發展大會四川天府新區專場活動日前在成都科創生態島1號館舉行;\\n②為助推產業發展,華泰天府人工智能數智產業基金正式發佈,基金總規模20億元,重點投向人工智能、智能芯片、具身智能等領域。"標題3: AI“復活”逝者已成生意?相關技術推廣需更多監管和規範,內容: "“只需要52.1元,就能還原逝去親人的容貌並和ta聊天。”生成式AI技術的發展浪潮之下,與逝去的親人“再見一面”似乎日漸成為可能。"標題4: 國產工業軟件企業安世亞太擬IPO 中信證券輔導 中網投、保利、中車都投了,內容: "①安世亞太前身以代理目前世界上最大的工程仿真軟件技術公司Ansys起家,其後走上開啟技術自主研發,目前該公司也是國產CAE軟件行業的頭部企業。\\n②2023年6月,安世亞太被列入美國實體清單,在行業加速整合的趨勢下,該公司啟動IPO工作或為應對挑戰添加籌碼。"標題5: 中國私募股權投資基金LP月報(2024年5月):紹興越城區產業股權投資基金出資最高,中金資本最受青睞,內容: "據財聯社創投通—執中數據,2024年5月中基協備案的私募股權投資基金共252支,環比減少33%;其中171支基金有機構LP出資(不包括關聯出資行為),共計351家機構LP出資參與了備案基金;根據披露可統計的出資規模,認繳資本約609.92億元,較4月減少1.4%。
之後呼叫Stima API來做LLM的使用
key = 'sk-xxxx'
from openai import OpenAI
client = OpenAI(
api_key=key,
base_url="https://api.stima.tech/v1/"
)
chat_completion = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "user", "content": prompt_mod}
]
)
print(chat_completion.choices[0].message.content)
可以得到輸出結果
隨著人工智能(AI)技術在各個領域的迅速發展,AI投資也成為當前投資市場的重要趨勢。全球最大的對沖基金公司橋水近日推出了一隻由機器學習運行並進行決策的基金,規模約為20億美元,這是橋水CEO巴爾·迪亞推動公司轉型的最新舉措。這類基金的成功有賴於AI技術的成熟和投資策略的精確性,預示著未來AI在金融投資領域的深遠影響。
與此同時,地方性AI產業投資也在蓬勃發展。於成都市舉行的2024成都市人工智能與機器人產業融合發展大會上,華泰天府人工智能數智產業基金正式發布,基金總規模達到20億元,重點投向人工智能、智能芯片和具身智能等領域,這將為地方產業發展注入新的活力和資源。
然而,隨著AI技術的應用範圍擴大,相關的監管和規範需求也逐漸增加。例如,生成式AI技術在“復活”逝者方面的應用,引發了社會各界對倫理和隱私問題的深思,這標誌著技術與規範之間需要達到新的平衡。
此外,在國內市場,國產工業軟件企業如安世亞太正積極研發自主技術,並啟動IPO,以應對市場環境的變化和國際競爭。再者,2024年5月的中國私募股權投資基金報告顯示,LP出資活動仍然熱絡,儘管規模相較上月有所減少,但總體資金流入趨勢穩定。
綜上所述,AI投資無論在金融、地方產業還是技術應用上都展現出強勁的增長勢頭,但同時也面臨相應的監管和市場挑戰。未來,AI技術將在投資領域創造更多機遇,並推動整體產業升級。
這就是用ChromaDB做RAG並融入LLM的方法!