動(dòng)手實(shí)現(xiàn)GraphRAG,檢索效果大幅提升
1 理解檢索增強(qiáng)生成(RAG)
檢索增強(qiáng)生成(RAG)技術(shù)通過(guò)融合檢索得到的文檔和用戶輸入的查詢,為語(yǔ)言模型注入了額外的上下文信息。這種結(jié)合不僅豐富了模型的知識(shí)庫(kù),還提升了其回答的準(zhǔn)確性和相關(guān)性。
例如,當(dāng)用戶提出涉及特定個(gè)人信息或商業(yè)數(shù)據(jù)的問(wèn)題時(shí),RAG能夠從預(yù)設(shè)的數(shù)據(jù)源中提取關(guān)鍵信息,輔助模型給出更加精準(zhǔn)的答復(fù)。
簡(jiǎn)而言之,RAG技術(shù)就像是給語(yǔ)言模型配備了一個(gè)智能的背景知識(shí)庫(kù),使其在面對(duì)復(fù)雜問(wèn)題時(shí),能夠做出更加明智的回應(yīng)。
2 GraphRAG:通過(guò)圖形結(jié)構(gòu)增強(qiáng)上下文
GraphRAG技術(shù)在傳統(tǒng)RAG的基礎(chǔ)上更進(jìn)一步,通過(guò)構(gòu)建信息的圖形網(wǎng)絡(luò),實(shí)現(xiàn)了對(duì)數(shù)據(jù)的深度理解和應(yīng)用。這不僅僅是簡(jiǎn)單地檢索相關(guān)文檔,更重要的是能夠洞察文檔中實(shí)體間的復(fù)雜聯(lián)系。
舉個(gè)例子,假設(shè)數(shù)據(jù)集中包含了紐約、洛杉磯和芝加哥等城市的信息。GraphRAG不僅能夠檢索到這些城市的相關(guān)資料,還能識(shí)別并利用它們之間的各種關(guān)系,比如紐約與洛杉磯之間的貿(mào)易伙伴關(guān)系,或是洛杉磯與芝加哥之間的文化交流項(xiàng)目。
這樣的技術(shù)使GraphRAG在處理信息時(shí)能夠展現(xiàn)出更為豐富的洞察力和更深層次的分析能力。
3 設(shè)置環(huán)境
源碼地址:
??https://github.com/aniket-work/why_graphRAG_such_game_changer??
創(chuàng)建虛擬環(huán)境:
python -m venv why_graphRAG_such_game_changer
激活環(huán)境:
why_graphRAG_such_game_changer\Scripts\activate (Windows)
source why_graphRAG_such_game_changer/bin/activate (Unix/macOS
安裝依賴項(xiàng):
cd path/to/your/project
pip install -r requirements.txt
使用Ollama拉取必要的模型:
ollama pull mistral
ollama pull nomic-embed-text
安裝Ollama:
- 訪問(wèn)Ollama官方網(wǎng)站:https://ollama.ai/
- 下載適合的操作系統(tǒng)的版本(Windows、macOS或Linux)。
- 按照操作系統(tǒng)提供的安裝說(shuō)明進(jìn)行操作。
- 安裝完成后,打開終端或命令提示符。
- 通過(guò)運(yùn)行以下命令來(lái)驗(yàn)證安裝:
ollama --version
初始化和使用GraphRAG:
python -m graphrag.index --init --root ragtest
下載數(shù)據(jù)
你可以下載任何你喜歡的數(shù)據(jù),已經(jīng)將一個(gè)小型的、基于場(chǎng)景的、面向關(guān)系的故事情節(jié)檢查并放入了“input”文件夾中。
4 初始化過(guò)程
運(yùn)行命令python -m graphrag.index --init --root ragtest初始化GraphRAG時(shí),以下一系列操作將會(huì)自動(dòng)進(jìn)行:
創(chuàng)建配置文件:
- .env:此文件包含運(yùn)行GraphRAG管道所需的環(huán)境變量。它通常包括用于OpenAI API或Azure OpenAI端點(diǎn)的API密鑰。例如:
GRAPHRAG_API_KEY=<API_KEY>
- settings.yaml:此文件保存GraphRAG管道的設(shè)置??梢孕薷拇宋募哉{(diào)整各種管道設(shè)置,例如Azure OpenAI的API基礎(chǔ)、版本和部署名稱。例如:
llm:
type: azure_openai_chat
api_base: https://<instance>.openai.azure.com
api_version: 2024-02-15-preview
deployment_name: <azure_model_deployment_name>
- prompts/:此目錄包含GraphRAG使用的默認(rèn)提示。這些提示指導(dǎo)大型語(yǔ)言模型(LLM)生成回答。可以修改這些提示或運(yùn)行自動(dòng)提示調(diào)整命令以生成適應(yīng)你數(shù)據(jù)的新提示。
5 目的和用途
- .env 文件:
目的:存儲(chǔ)環(huán)境變量,包括用于驗(yàn)證對(duì)OpenAI或Azure OpenAI服務(wù)請(qǐng)求的API密鑰。
用途:此文件由GraphRAG系統(tǒng)引用,以訪問(wèn)必要的憑據(jù)和配置設(shè)置。
- settings.yaml 文件:
- 目的:包含GraphRAG管道的詳細(xì)配置設(shè)置,如API端點(diǎn)、模型版本和部署名稱。
- 用途:此文件用于自定義GraphRAG管道的行為,允許用戶指定使用哪個(gè)LLM以及如何與之交互。
- prompts/ 目錄:
- 目的:保存默認(rèn)的LLM提示,指導(dǎo)模型生成回答。這些提示可以根據(jù)你的數(shù)據(jù)的具體需求進(jìn)行定制。
- 用途:用戶可以修改提示以提高生成回答的準(zhǔn)確性和相關(guān)性。該目錄還支持運(yùn)行自動(dòng)提示調(diào)整命令以創(chuàng)建新的、特定于數(shù)據(jù)的提示。
6 修改 settings.yaml
由于我們打算在本地運(yùn)行g(shù)raphRAG,需要對(duì)默認(rèn)的 settings.yaml 文件進(jìn)行一些更改。
encoding_model: cl100k_base
skip_workflows: []
llm:
api_key: ${GRAPHRAG_API_KEY}
type: openai_chat
model: mistral
model_supports_json: true
api_base: http://localhost:11434/v1
parallelization:
stagger: 0.3
async_mode: threaded
embeddings:
async_mode: threaded
llm:
api_key: ${GRAPHRAG_API_KEY}
type: openai_embedding
model: nomic_embed_text
api_base: http://localhost:11434/api
7 修改以使用 Ollama 嵌入
GraphRAG 本身不支持 Ollama 嵌入模型,但可以通過(guò)修改 GraphRAG 庫(kù)中的特定文件來(lái)添加此支持。通過(guò)編輯 openai_embeddings_llm.py 文件,我們可以啟用使用 Ollama 嵌入模型。這涉及導(dǎo)入必要的模塊并更新代碼以調(diào)用 Ollama 的嵌入函數(shù),允許我們?cè)?GraphRAG 管道中利用高級(jí)嵌入。
以下是如何更新 openai_embeddings_llm.py 文件的方法:
from typing_extensions import Unpack
from graphrag.llm.base import BaseLLM
from graphrag.llm.types import EmbeddingInput, EmbeddingOutput, LLMInput
from .openai_configuration import OpenAIConfiguration
from .types import OpenAIClientTypes
import ollama
class OpenAIEmbeddingsLLM(BaseLLM[EmbeddingInput, EmbeddingOutput]):
"""
使用 Ollama 進(jìn)行嵌入的自定義 LLM(大型語(yǔ)言模型)實(shí)現(xiàn)。
"""
def __init__(self, client: OpenAIClientTypes, configuration: OpenAIConfiguration):
"""
初始化 OpenAIEmbeddingsLLM 實(shí)例。
參數(shù):
client (OpenAIClientTypes): 與AI服務(wù)交互的客戶端。
configuration (OpenAIConfiguration): AI服務(wù)的配置設(shè)置。
"""
self._client = client
self._configuration = configuration
async def _execute_llm(
self, input: EmbeddingInput, **kwargs: Unpack[LLMInput]
) -> EmbeddingOutput | None:
"""
使用 Ollama 嵌入執(zhí)行大型語(yǔ)言模型。
參數(shù):
input (EmbeddingInput): 嵌入模型的輸入數(shù)據(jù)。
**kwargs (Unpack[LLMInput]): 模型參數(shù)的附加關(guān)鍵字參數(shù)。
返回:
EmbeddingOutput | None: 模型的輸出嵌入或如果沒(méi)有輸出則為 None。
"""
args = {
"model": self._configuration.model,
**(kwargs.get("model_parameters") or {}),
}
embedding_list = []
for inp in input:
embedding = ollama.embeddings(model="nomic-embed-text", prompt=inp)
embedding_list.append(embedding["embedding"])
return embedding_list
8 使用 GraphRAG 運(yùn)行查詢
使用以下命令索引數(shù)據(jù):
python -m graphrag.index --root .\ragtest
輸出
圖片
運(yùn)行查詢以測(cè)試設(shè)置:
python -m graphrag.query --root .\ragtest --method global "How was the impact of Lily's action on villagers"
輸出
圖片
9 結(jié)語(yǔ)
未來(lái),人工智能在商業(yè)領(lǐng)域的影響力將日益增強(qiáng)。那些能夠?qū)⑷斯ぶ悄芗夹g(shù)有效融入其業(yè)務(wù)運(yùn)營(yíng)的公司,將具備更快的創(chuàng)新速度、更優(yōu)質(zhì)的客戶服務(wù)體驗(yàn),以及更高效的流程優(yōu)化能力。GraphRAG技術(shù)的出現(xiàn),僅是人工智能潛力的冰山一角。
隨著時(shí)間推移,人工智能將變得更加精密復(fù)雜。它將不僅能夠理解問(wèn)題,還能生成貼近人類思維的回答。預(yù)計(jì)不久的將來(lái),企業(yè)將見(jiàn)證一種新型人工智能系統(tǒng)的誕生——這些系統(tǒng)不僅能夠回答問(wèn)題,還能基于海量數(shù)據(jù)分析提供戰(zhàn)略性的見(jiàn)解和建議。因此,對(duì)于任何希望在競(jìng)爭(zhēng)中保持領(lǐng)先地位的企業(yè)而言,積極擁抱人工智能并持續(xù)關(guān)注其最新發(fā)展,顯得尤為關(guān)鍵。這不僅是一個(gè)選擇,更是一個(gè)必然的趨勢(shì)。
本文轉(zhuǎn)載自 ??AI科技論談??,作者: AI科技論談
