RAGFlow 是一個基于對文檔的深入理解的開源 RAG(檢索增強(qiáng)生成)引擎。它為任何規(guī)模的企業(yè)提供了簡化的 RAG 工作流程,結(jié)合了 LLM(大型語言模型)以提供真實(shí)的問答功能,并以來自各種復(fù)雜格式數(shù)據(jù)的有根據(jù)的引文為后盾。
demo鏈接:RAGFlow
特點(diǎn):
1、有一定的數(shù)據(jù)質(zhì)量保證,能從復(fù)雜的非結(jié)構(gòu)化數(shù)據(jù)中提取基于文檔理解的深度知識。
2、內(nèi)置模板,可以基于模板形成知識庫;文檔分塊可以實(shí)現(xiàn)人工干預(yù),提高文檔質(zhì)量;
3、可以兼容異構(gòu)數(shù)據(jù)源,支持 Word、幻燈片、excel、txt、圖像、掃描副本、結(jié)構(gòu)化數(shù)據(jù)、網(wǎng)頁等。
部署要求:
vm.max_map_count
要檢查 的值 :vm.max_map_count
$ sysctl vm.max_map_count如果不是,則重置為至少 262144 的值。vm.max_map_count
vm.max_map_count
dev-slim
$ cd ragflow/docker$ docker compose -f docker-compose.yml up -d注意:包含嵌入模型和 Python 庫的 RAGFlow Docker 映像的大小約為 9GB,加載時間可能要長得多。
RAGFlow_IMAGE
RAGFLOW_IMAGE=infiniflow/ragflow:v0.12.0-slim
RAGFlow_IMAGE
RAGFLOW_IMAGE=infiniflow/ragflow:dev
RAGFlow_IMAGE
RAGFLOW_IMAGE=infiniflow/ragflow:v0.12.0
network abnormal
http://IP_OF_YOUR_MACHINE
80
user_default_llm
API_KEY
有關(guān)更多信息,請參閱 llm_api_key_setup。部署完成后,還需要對RAGFlow進(jìn)行配置,需要關(guān)注以下幾點(diǎn):
SVR_HTTP_PORT
MYSQL_PASSWORD
MINIO_PASSWORD
您必須確保對 .env 文件的更改與 service_conf.yaml 文件中的更改一致。
./docker/README 文件提供了環(huán)境設(shè)置和服務(wù)配置的詳細(xì)描述,您需要確保 ./docker/README 文件中列出的所有環(huán)境設(shè)置都與 service_conf.yaml 文件中的相應(yīng)配置保持一致。
要更新默認(rèn) HTTP 服務(wù)端口 (80),請轉(zhuǎn)到 docker-compose.yml 并更改為 。80:80
<YOUR_SERVING_PORT>:80
對上述配置的更新需要重啟所有容器才能生效:
$ docker compose -f docker/docker-compose.yml up -d
此映像的大小約為 1 GB,依賴于外部 LLM 和嵌入服務(wù)。
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 .
此映像的大小約為 9 GB。由于它包括嵌入模型,因此它僅依賴于外部 LLM 服務(wù)。
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 .
/etc/hosts
127.0.0.1
127.0.0.1 es01 mysql minio redis
5455
1200
HF_ENDPOINT
export HF_ENDPOINT=https://hf-mirror.com啟動 backend service:proxy.target
http://127.0.0.1:9380
啟動前端服務(wù):
npm run dev 以下輸出確認(rèn)系統(tǒng)已成功啟動完成。
1、Text2KG 的使用
Text2KG是一個開源項(xiàng)目,能夠利用大型語言模型(zero-shot)跨領(lǐng)域從文本中提取實(shí)體和關(guān)系,自動構(gòu)建和更新知識圖譜,并通過Neo4j進(jìn)行可視化。
iText2KG由四個主要模塊組成:文檔提取器、增量實(shí)體提取器、增量關(guān)系提取器、圖形集成器和可視化。它們協(xié)同工作,從非結(jié)構(gòu)化文本構(gòu)建和可視化知識圖譜。
四個模塊中,增量實(shí)體提取器與增量關(guān)系提取器最為關(guān)鍵,采用大模型來實(shí)現(xiàn),LLM提取代表一個唯一概念的實(shí)體,以避免語義混合的實(shí)體。顯示了使用 Langchain JSON 解析器的實(shí)體和關(guān)系提取prompt。分類如下:藍(lán)色 – 由 Langchain 自動格式化的prompt;常規(guī) – iText2KG設(shè)計(jì)的prompt;斜體 – 專門為實(shí)體和關(guān)系提取設(shè)計(jì)的prompt。(a)關(guān)系提取prompt和(b)實(shí)體提取prompt。
為了說明知識圖譜構(gòu)建的結(jié)果,在三種不同場景下,將基線方法與iText2KG進(jìn)行了比較:
一種由 LLM 驅(qū)動的零樣本方法,使用大型語言模型構(gòu)建增量知識圖譜(KG)
iText2KG
是一個 Python
包,通過利用大型語言模型從文本文檔中提取實(shí)體和關(guān)系,逐步構(gòu)建具有已解析實(shí)體和關(guān)系的一致知識圖譜。
它具有零樣本能力,無需專門的訓(xùn)練即可跨各個領(lǐng)域提取知識。
它包含四個模塊:文檔提煉器、增量實(shí)體提取器、增量關(guān)系提取器和圖形集成器與可視化。
Neo4j
?圖形集成器:最后一個模塊以圖形格式可視化關(guān)系和實(shí)體,利用 Neo4j 進(jìn)行有效表示。對于我們的 iText2KG
它包含了兩大特點(diǎn)
iText2KG
?允許增量構(gòu)建?KG
,這意味著它可以在新數(shù)據(jù)可用時不斷更新和擴(kuò)展圖,而無需進(jìn)行大量重新處理。LLM
?的零樣本功能,使其無需預(yù)定義集或外部本體即可運(yùn)行。這種靈活性使其能夠適應(yīng)各種?KG
?構(gòu)建場景,而無需進(jìn)行大量訓(xùn)練或微調(diào)。在運(yùn)行 iText2KG
之前,我們先設(shè)置好大模型,我這里選擇的是 OpenAi
的模型以及 HuggingFace
的 bge-large-zh embedding
模型。這么選擇也是考慮到構(gòu)建 KG
的準(zhǔn)確度。
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
構(gòu)建 KG
我們這里的場景是,給出一篇簡歷,使用知識圖譜將在線職位描述與生成的簡歷聯(lián)系起來。
設(shè)定目標(biāo)是評估候選人是否適合這份工作。
我們可以為 iText2KG
的每個模塊使用不同的 LLM
或嵌入模型。但是,重要的是確保節(jié)點(diǎn)和關(guān)系嵌入的維度在各個模型之間保持一致。
如果嵌入維度不同,余弦相似度可能難以準(zhǔn)確測量向量距離以進(jìn)行進(jìn)一步匹配。
我們的簡歷放到根目錄,加載簡歷:
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.
'''
# 使用定義好的查詢和輸出數(shù)據(jù)結(jié)構(gòu)提煉文檔。
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]
我們可以自定義輸出數(shù)據(jù)結(jié)構(gòu),我們這里定義了4種,工作經(jīng)歷模型,崗位,技能,證書。
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
繼續(xù)使用上面方法做信息提煉:
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]
到這里準(zhǔn)備工作完成,簡歷和工作需求都已經(jīng)提煉完畢,然后正式開始構(gòu)建 graph
,我們將簡歷的所有語義塊作為一個塊傳遞給了 LLM
。
也將工作需求作為另一個語義塊傳遞,也可以在構(gòu)建圖時將語義塊分開。
我們需要注意每個塊中包含多少信息,然后好將它與其他塊連接起來,我們在這里做的就是一次性傳遞所有語義塊。
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
構(gòu)建 KG
的過程我們看到有很多參數(shù),下面分貝是對每個參數(shù)的表示做一些解釋:
llm_model
:用于從文本中提取實(shí)體和關(guān)系的語言模型實(shí)例。embeddings_model
:用于創(chuàng)建提取實(shí)體的向量表示的嵌入模型實(shí)例。sleep_time (int)
:遇到速率限制或錯誤時等待的時間(以秒為單位)(僅適用于?OpenAI
)。默認(rèn)為 5 秒。iText2KG
的 build_graph
參數(shù):
sections
?(List[str])
:字符串(語義塊)列表,其中每個字符串代表文檔的一部分,將從中提取實(shí)體和關(guān)系。existing_global_entities
?(List[dict], optional)
:與新提取的實(shí)體進(jìn)行匹配的現(xiàn)有全局實(shí)體列表。每個實(shí)體都表示為一個字典。existing_global_relationships (List[dict], optional)
:與新提取的關(guān)系匹配的現(xiàn)有全局關(guān)系列表。每個關(guān)系都表示為一個字典。ent_threshold (float, optional)
:實(shí)體匹配的閾值,用于合并不同部分的實(shí)體。默認(rèn)值為 0.7。rel_threshold (float, optional)
:關(guān)系匹配的閾值,用于合并不同部分的關(guān)系。默認(rèn)值為 0.7。從圖中結(jié)果看到我們構(gòu)建過程中的實(shí)體,和關(guān)聯(lián)關(guān)系。
最后使用 GraphIntegrator
對構(gòu)建的知識圖譜進(jìn)行可視化。
使用指定的憑據(jù)訪問圖形數(shù)據(jù)庫 Neo4j
,并對生成的圖形進(jìn)行可視化,以提供從文檔中提取的關(guān)系和實(shí)體的視覺表示。
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
圖形數(shù)據(jù)庫: