使用RAGFlow+iText2KG針對文檔進行搜索與知識圖片生成(一)

RAG跟知識圖譜

1、RAGFlow 的使用指南

RAGFlow 是一個基于對文檔的深入理解的開源 RAG(檢索增強生成)引擎。它為任何規模的企業提供了簡化的 RAG 工作流程,結合了 LLM(大型語言模型)以提供真實的問答功能,并以來自各種復雜格式數據的有根據的引文為后盾。

demo鏈接:RAGFlow

特點:

1、有一定的數據質量保證,能從復雜的非結構化數據中提取基于文檔理解的深度知識。

2、內置模板,可以基于模板形成知識庫;文檔分塊可以實現人工干預,提高文檔質量;

3、可以兼容異構數據源,支持 Word、幻燈片、excel、txt、圖像、掃描副本、結構化數據、網頁等。

4、 自動化且輕松的 RAG 工作流程

  • 簡化的 RAG 編排同時滿足了個人和大型企業的需求。
  • 可配置的 LLM 以及嵌入模型。
  • 多重召回與融合的重新排名配對。
  • 直觀的 API,可與業務無縫集成。
    RAGFlow架構圖

部署要求:

  • CPU >= 4 cores
  • RAM >= 16 GB
  • Disk >= 50 GB
  • Docker >= 24.0.0 & Docker Compose >= v2.26.1

啟動 服務器

  1. 確保 >= 262144:vm.max_map_count要檢查 的值 :vm.max_map_count$ sysctl vm.max_map_count如果不是,則重置為至少 262144 的值。vm.max_map_count
  1. # In this case, we set it to 262144:$ sudo sysctl -w vm.max_map_count=262144此更改將在系統重啟后重置。為了確保您的更改保持永久,請相應地在?/etc/sysctl.conf?中添加或更新該值:vm.max_map_count
  2. vm.max_map_count=262144
  3. 克隆存儲庫:$ git clone https://github.com/infiniflow/ragflow.git構建預構建的 Docker 鏡像并啟動服務器:
  4. 以下命令下載 RAGFlow slim () 的開發版本 Docker 映像。請注意,RAGFlow slim Docker 映像不包括嵌入模型或 Python 庫,因此大小約為 1GB。dev-slim$ cd ragflow/docker$ docker compose -f docker-compose.yml up -d注意:包含嵌入模型和 Python 庫的 RAGFlow Docker 映像的大小約為 9GB,加載時間可能要長得多。
    • 要下載特定版本的 RAGFlow slim Docker 鏡像,請將?docker/.env?中的變量更新為所需版本。例如。進行此更改后,請重新運行上述命令以啟動下載。RAGFlow_IMAGERAGFLOW_IMAGE=infiniflow/ragflow:v0.12.0-slim
    • 要下載 RAGFlow Docker 映像的開發版本(包括嵌入模型和 Python 庫),請將?docker/.env?中的變量更新為 。進行此更改后,請重新運行上述命令以啟動下載。RAGFlow_IMAGERAGFLOW_IMAGE=infiniflow/ragflow:dev
    • 要下載特定版本的 RAGFlow Docker 映像(包括嵌入模型和 Python 庫),請將?docker/.env?中的變量更新為所需的版本。例如。進行此更改后,請重新運行上述命令以啟動下載。RAGFlow_IMAGERAGFLOW_IMAGE=infiniflow/ragflow:v0.12.0
  5. 在服務器啟動并運行后檢查服務器狀態:$ docker logs -f ragflow-server以下輸出確認系統已成功啟動:
  6. ____ ___ ______ ______ __
    / __ \ / | / ____// ____// /____ _ __
    / /_/ // /| | / / __ / /_ / // __ \| | /| / /
    / _, _// ___ |/ /_/ // __/ / // /_/ /| |/ |/ /
    /_/ |_|/_/ |_|\____//_/ /_/ \____/ |__/|__/

    * Running on all addresses (0.0.0.0)
    * Running on http://127.0.0.1:9380
    * Running on http://x.x.x.x:9380 INFO:werkzeug:Press CTRL+C to quit如果您跳過此確認步驟并直接登錄 RAGFlow,您的瀏覽器可能會提示錯誤,因為此時您的 RAGFlow 可能沒有完全初始化。network abnormal
  1. 在您的 Web 瀏覽器中,輸入服務器的 IP 地址并登錄 RAGFlow。使用默認設置時,您只需輸入 (sans?port number) 作為使用默認配置時可以省略默認 HTTP 服務端口。http://IP_OF_YOUR_MACHINE80
  2. 在 service_conf.yaml 中,選擇所需的 LLM 工廠,并使用相應的 API 密鑰更新字段。user_default_llmAPI_KEY有關更多信息,請參閱 llm_api_key_setup。

部署完成后,還需要對RAGFlow進行配置,需要關注以下幾點:

  • .env:保留系統的基本設置,例如SVR_HTTP_PORTMYSQL_PASSWORDMINIO_PASSWORD
  • service_conf.yaml:配置后端服務。
  • docker-compose.yml:系統依賴 docker-compose.yml 啟動。

您必須確保對 .env 文件的更改與 service_conf.yaml 文件中的更改一致。

./docker/README 文件提供了環境設置和服務配置的詳細描述,您需要確保 ./docker/README 文件中列出的所有環境設置都與 service_conf.yaml 文件中的相應配置保持一致。

要更新默認 HTTP 服務端口 (80),請轉到 docker-compose.yml 并更改為 。80:80<YOUR_SERVING_PORT>:80

對上述配置的更新需要重啟所有容器才能生效:

$ docker compose -f docker/docker-compose.yml up -d

?? 在不嵌入模型的情況下構建 Docker 鏡像

此映像的大小約為 1 GB,依賴于外部 LLM 和嵌入服務。

git clone https://github.com/infiniflow/ragflow.git
cd ragflow/
pip3 install huggingface-hub nltk
python3 download_deps.py
docker build -f Dockerfile.slim -t infiniflow/ragflow:dev-slim .

?? 構建包含嵌入模型的 Docker 鏡像

此映像的大小約為 9 GB。由于它包括嵌入模型,因此它僅依賴于外部 LLM 服務。

git clone https://github.com/infiniflow/ragflow.git
cd ragflow/
pip3 install huggingface-hub nltk
python3 download_deps.py
docker build -f Dockerfile -t infiniflow/ragflow:dev .

?? 從源頭啟動服務進行開發

  1. 安裝 Poetry,如果已安裝,請跳過此步驟:curl -sSL https://install.python-poetry.org | python3 –
  2. 克隆源碼并安裝 Python 依賴項:git clone https://github.com/infiniflow/ragflow.git
    cd ragflow/
    export POETRY_VIRTUALENVS_CREATE=true POETRY_VIRTUALENVS_IN_PROJECT=true
    ~/.local/bin/poetry install –sync –no-root # install RAGFlow dependent python modules
  3. 使用 Docker Compose 啟動依賴服務(MinIO、Elasticsearch、Redis 和 MySQL):docker compose -f docker/docker-compose-base.yml up -d
  4. 添加以下行以將?docker/service_conf.yaml?中指定的所有主機解析為:/etc/hosts127.0.0.1
  1. 127.0.0.1 es01 mysql minio redis
  2. 在?docker/service_conf.yaml?中,將 mysql 端口更新為 ,將 es 端口更新為?,如 docker/.env?中指定。54551200
  1. 如果無法訪問 HuggingFace,請將環境變量設置為使用鏡像站點:HF_ENDPOINTexport HF_ENDPOINT=https://hf-mirror.com啟動 backend service:
  2. source .venv/bin/activate
    export PYTHONPATH=$(pwd)bash docker/launch_backend_service.sh
  3. 安裝前端依賴項:
  4. cd webnpm install –force
  5. 將前端配置為在?.umirc.ts?更新為:proxy.targethttp://127.0.0.1:9380

啟動前端服務:

npm run dev 以下輸出確認系統已成功啟動完成。



1、Text2KG 的使用



Text2KG是一個開源項目,能夠利用大型語言模型(zero-shot)跨領域從文本中提取實體和關系,自動構建和更新知識圖譜,并通過Neo4j進行可視化。

iText2KG由四個主要模塊組成:文檔提取器、增量實體提取器、增量關系提取器、圖形集成器和可視化。它們協同工作,從非結構化文本構建和可視化知識圖譜。

  • 文檔提取器(Document Distiller):該模塊處理原始文檔,并根據用戶定義的模式將其重新表述為語義塊。它通過關注相關信息并以預定義的格式對其進行結構化來提高信噪比。
  • 增量實體提取器(Incremental Entity Extractor):此模塊從語義塊中提取唯一實體并解決歧義以確保每個實體都有明確定義。它使用余弦相似度度量將局部實體與全局實體進行匹配。
  • 增量關系提取器(Incremental Relation Extractor):此模塊識別提取實體之間的關系。它可以以兩種模式運行:使用全局實體豐富圖形中的潛在信息,或使用局部實體建立更精確的關系。
  • 圖形集成器和可視化(Graph Integrator and Visualization):此模塊將提取的實體和關系集成到 Neo4j 數據庫中,提供知識圖譜的可視化表示。它允許對結構化數據進行交互式探索和分析。

四個模塊中,增量實體提取器與增量關系提取器最為關鍵,采用大模型來實現LLM提取代表一個唯一概念的實體,以避免語義混合的實體。顯示了使用 Langchain JSON 解析器的實體和關系提取prompt。分類如下:藍色 – 由 Langchain 自動格式化的prompt;常規 – iText2KG設計的prompt;斜體 – 專門為實體和關系提取設計的prompt。(a)關系提取prompt和(b)實體提取prompt。

為了說明知識圖譜構建的結果,在三種不同場景下,將基線方法與iText2KG進行了比較:

  • 基線方法在所有三種知識圖譜構建場景中都揭示了存在沒有關系的孤立節點。這種現象可能歸因于實體提取和關系提取的同時執行,這可能會在語言模型中引起幻覺效應,導致“遺忘”效應,即分離實體和關系提取的過程可以提高性能。
  • 在“網站到知識圖譜”的場景中,輸入文檔數量的增加與圖中噪聲節點的出現有關。這強調了對文檔進行有效精煉和蒸餾的模塊1的關鍵需求。
  • iText2KG方法在三種知識圖譜構建場景中展示了改進的實體和關系解析能力。當輸入文檔較少且由簡單、非復雜短語組成時,語言模型在實體和關系解析方面表現出高效率,如“簡歷到知識圖譜”過程中所證明的。相反,隨著數據集變得更加復雜和龐大,挑戰也隨之增加,如“網站到知識圖譜”場景所示。此外,重要的是要強調輸入文檔的分塊大小和閾值對知識圖譜構建的影響。文檔分餾器的輸入文檔可以是獨立的文檔或分塊。如果分塊大小較小,則語義塊將從文檔中捕獲更具體的詳細信息,反之亦然

一種由 LLM 驅動的零樣本方法,使用大型語言模型構建增量知識圖譜(KG)

iText2KG 是一個 Python 包,通過利用大型語言模型從文本文檔中提取實體和關系,逐步構建具有已解析實體和關系的一致知識圖譜。

它具有零樣本能力,無需專門的訓練即可跨各個領域提取知識。

它包含四個模塊:文檔提煉器、增量實體提取器、增量關系提取器和圖形集成器與可視化。

  • 文檔提取器:此模塊將原始文檔重新表述為預定義的語義塊,并由指導 LLM 提取特定信息的模式引導。
  • 增量實體提取器:此模塊識別并解析語義塊內的唯一語義實體,確保實體之間的清晰度和區別。
  • 增量關系提取器:此組件處理已解析的實體以檢測語義上唯一的關系,解決語義重復的挑戰。
  • Neo4j?圖形集成器:最后一個模塊以圖形格式可視化關系和實體,利用 Neo4j 進行有效表示。

對于我們的 iText2KG 它包含了兩大特點

  • 增量構建:iText2KG?允許增量構建?KG,這意味著它可以在新數據可用時不斷更新和擴展圖,而無需進行大量重新處理。
  • 零樣本學習:該框架利用?LLM?的零樣本功能,使其無需預定義集或外部本體即可運行。這種靈活性使其能夠適應各種?KG?構建場景,而無需進行大量訓練或微調。

一 、設置模型

在運行 iText2KG 之前,我們先設置好大模型,我這里選擇的是 OpenAi 的模型以及 HuggingFace 的 bge-large-zh embedding 模型。這么選擇也是考慮到構建 KG 的準確度。

from langchain_openai import ChatOpenAI, OpenAIEmbeddings
import os
os.environ["OPENAI_API_KEY"] = "*****"
openai_api_key = os.environ["OPENAI_API_KEY"]
openai_llm_model = llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0,
max_tokens=None,
timeout=None,
max_retries=2,
)
messages = [
(
"system",
"You are a helpful assistant that translates English to French. Translate the user sentence.",
),
("human", "I love programming."),
]

ai_msg=openai_llm_model.invoke(messages)

開始部署我們的 Embedding 模型:

from langchain_huggingface.embeddings import HuggingFaceEmbeddings
openai_embeddings_model = HuggingFaceEmbeddings(model_name="BAAI/bge-large-zh-v1.5")
text = "This is a test document."
query_result = openai_embeddings_model.embed_query(text)
query_result[:3]
doc_result = openai_embeddings_model.embed_documents([text])

二 、使用 iText2KG 構建 KG

我們這里的場景是,給出一篇簡歷,使用知識圖譜將在線職位描述與生成的簡歷聯系起來。

設定目標是評估候選人是否適合這份工作。

我們可以為 iText2KG 的每個模塊使用不同的 LLM 或嵌入模型。但是,重要的是確保節點和關系嵌入的維度在各個模型之間保持一致。

如果嵌入維度不同,余弦相似度可能難以準確測量向量距離以進行進一步匹配。

我們的簡歷放到根目錄,加載簡歷:

from langchain.document_loaders import PyPDFLoader
loader = PyPDFLoader(f"./CV_Emily_Davis.pdf")
pages = loader.load_and_split()

初始化 DocumentDistiller 引入 llm :

from itext2kg.documents_distiller import DocumentsDisiller, CV
document_distiller = DocumentsDisiller(llm_model = openai_llm_model)

信息提煉:

IE_query = '''
# DIRECTIVES :
- Act like an experienced information extractor.
- You have a chunk of a CV.
- If you do not find the right information, keep its place empty.
'''
# 使用定義好的查詢和輸出數據結構提煉文檔。
distilled_cv = document_distiller.distill(documents=[page.page_content.replace("{", '[').replace("}", "]") for page in pages], IE_query=IE_query, output_data_structure=CV)

將提煉后的文檔格式化為語義部分。

semantic_blocks_cv = [f"{key} - {value}".replace("{", "[").replace("}", "]") for key, value in distilled_cv.items() if value !=[] and value != ""  and value != None]

我們可以自定義輸出數據結構,我們這里定義了4種,工作經歷模型,崗位,技能,證書。

from pydantic import BaseModel, Field
from typing import List, Optional

class JobResponsibility(BaseModel):
description: str = Field(..., description="A specific responsibility in the job role")

class JobQualification(BaseModel):
skill: str = Field(..., description="A required or preferred skill for the job")

class JobCertification(BaseModel):
certification: str = Field(..., description="Required or preferred certifications for the job")

class JobOffer(BaseModel):
job_offer_title: str = Field(..., description="The job title")
company: str = Field(..., description="The name of the company offering the job")
location: str = Field(..., description="The job location (can specify if remote/hybrid)")
job_type: str = Field(..., description="Type of job (e.g., full-time, part-time, contract)")
responsibilities: List[JobResponsibility] = Field(..., description="List of key responsibilities")
qualifications: List[JobQualification] = Field(..., description="List of required or preferred qualifications")
certifications: Optional[List[JobCertification]] = Field(None, description="Required or preferred certifications")
benefits: Optional[List[str]] = Field(None, description="List of job benefits")
experience_required: str = Field(..., description="Required years of experience")
salary_range: Optional[str] = Field(None, description="Salary range for the position")
apply_url: Optional[str] = Field(None, description="URL to apply for the job")

定義一個招聘工作需求的描述:

job_offer = """
About the Job Offer
THE FICTITIOUS COMPANY

FICTITIOUS COMPANY is a high-end French fashion brand known for its graphic and poetic style, driven by the values of authenticity and transparency upheld by its creator Simon Porte Jacquemus.

Your Role

Craft visual stories that captivate, inform, and inspire. Transform concepts and ideas into visual representations. As a member of the studio, in collaboration with the designers and under the direction of the Creative Designer, you should be able to take written or spoken ideas and convert them into designs that resonate. You need to have a deep understanding of the brand image and DNA, being able to find the style and layout suited to each project.

Your Missions

Translate creative direction into high-quality silhouettes using Photoshop
Work on a wide range of projects to visualize and develop graphic designs that meet each brief
Work independently as well as in collaboration with the studio team to meet deadlines, potentially handling five or more projects simultaneously
Develop color schemes and renderings in Photoshop, categorized by themes, subjects, etc.
Your Profile

Bachelor’s degree (Bac+3/5) in Graphic Design or Art
3 years of experience in similar roles within a luxury brand's studio
Proficiency in Adobe Suite, including Illustrator, InDesign, Photoshop
Excellent communication and presentation skills
Strong organizational and time management skills to meet deadlines in a fast-paced environment
Good understanding of the design process
Freelance cont

繼續使用上面方法做信息提煉:

IE_query = '''
# DIRECTIVES :
- Act like an experienced information extractor.
- You have a chunk of a job offer description.
- If you do not find the right information, keep its place empty.
'''
distilled_Job_Offer = document_distiller.distill(documents=[job_offer], IE_query=IE_query, output_data_structure=JobOffer)
print(distilled_Job_Offer)
semantic_blocks_job_offer = [f"{key} - {value}".replace("{", "[").replace("}", "]") for key, value in distilled_Job_Offer.items() if value !=[] and value != "" and value != None]

到這里準備工作完成,簡歷和工作需求都已經提煉完畢,然后正式開始構建 graph,我們將簡歷的所有語義塊作為一個塊傳遞給了 LLM

也將工作需求作為另一個語義塊傳遞,也可以在構建圖時將語義塊分開。

我們需要注意每個塊中包含多少信息,然后好將它與其他塊連接起來,我們在這里做的就是一次性傳遞所有語義塊。

from itext2kg import iText2KG
itext2kg = iText2KG(llm_model = openai_llm_model, embeddings_model = openai_embeddings_model)

global_ent, global_rel = itext2kg.build_graph(sections=[semantic_blocks_cv], ent_threshold=0.6, rel_threshold=0.6)

global_ent_, global_rel_ = itext2kg.build_graph(sections=[semantic_blocks_job_offer], existing_global_entities = global_ent, existing_global_relationships = global_rel, ent_threshold=0.6, rel_threshold=0.6)

iText2KG 構建 KG 的過程我們看到有很多參數,下面分貝是對每個參數的表示做一些解釋:

  • llm_model:用于從文本中提取實體和關系的語言模型實例。
  • embeddings_model:用于創建提取實體的向量表示的嵌入模型實例。
  • sleep_time (int):遇到速率限制或錯誤時等待的時間(以秒為單位)(僅適用于?OpenAI)。默認為 5 秒。

iText2KG 的 build_graph 參數:

  • sections?(List[str]):字符串(語義塊)列表,其中每個字符串代表文檔的一部分,將從中提取實體和關系。
  • existing_global_entities?(List[dict], optional):與新提取的實體進行匹配的現有全局實體列表。每個實體都表示為一個字典。
  • existing_global_relationships (List[dict], optional):與新提取的關系匹配的現有全局關系列表。每個關系都表示為一個字典。
  • ent_threshold (float, optional):實體匹配的閾值,用于合并不同部分的實體。默認值為 0.7。
  • rel_threshold (float, optional):關系匹配的閾值,用于合并不同部分的關系。默認值為 0.7。

從圖中結果看到我們構建過程中的實體,和關聯關系。

最后使用 GraphIntegrator 對構建的知識圖譜進行可視化。

使用指定的憑據訪問圖形數據庫 Neo4j,并對生成的圖形進行可視化,以提供從文檔中提取的關系和實體的視覺表示。

from itext2kg.graph_integration import GraphIntegrator
URI = "bolt://3.216.93.32:7687"
USERNAME = "neo4j"
PASSWORD = "selection-cosal-cubes"
new_graph = {}
new_graph["nodes"] = global_ent_
new_graph["relationships"] = global_rel_
GraphIntegrator(uri=URI, username=USERNAME, password=PASSWORD).visualize_graph(json_graph=new_graph)

打開我們的 Neo4j 圖形數據庫:

發表回復

您的郵箱地址不會被公開。 必填項已用 * 標注

久久精品视频2021,免费国产美女一级A作爱,欧美国产日韩在线三区,久久精品海外免费视频
亚洲第一视频在线观看播放 | 亚洲国产一区中文 | 亚洲精品伊人久久综合影院首页 | 香港三级日本三级人妇精品 | 亚洲精品第一国产综合亚AV | 偷窥国产女洗浴在线观看视频 |