精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

知識圖譜檢索增強的GraphRAG(基于Neo4j代碼實現)

人工智能
為了存儲知識圖譜數據,首先需要搭建一個 Neo4j 實例。最簡單的方法是在 Neo4j Aura 上啟動一個免費實例,它提供了 Neo4j 數據庫的云版本。當然,也可以通過docker本地啟動一個,然后將圖譜數據導入到Neo4j 數據庫中。

圖檢索增強生成(Graph RAG)正逐漸流行起來,成為傳統向量搜索方法的有力補充。這種方法利用圖數據庫的結構化特性,將數據以節點和關系的形式組織起來,從而增強檢索信息的深度和上下文關聯性。圖在表示和存儲多樣化且相互關聯的信息方面具有天然優勢,能夠輕松捕捉不同數據類型間的復雜關系和屬性。而向量數據庫在處理這類結構化信息時則顯得力不從心,它們更擅長通過高維向量處理非結構化數據。在 RAG 應用中,結合結構化的圖數據和非結構化的文本向量搜索,可以讓我們同時享受兩者的優勢,這也是本文將要探討的內容。

構建知識圖譜通常是利用圖數據表示的強大功能中最困難的一步。它需要收集和整理數據,這需要對領域知識和圖建模有深刻的理解。為了簡化這一過程,可以參考已有的項目或者利用LLM來創建知識圖譜,進而可以把重點放在檢索召回,以及LLM的生成階段。下面來進行相關代碼的實踐。

1.知識圖譜構建

為了存儲知識圖譜數據,首先需要搭建一個 Neo4j 實例。最簡單的方法是在 Neo4j Aura 上啟動一個免費實例,它提供了 Neo4j 數據庫的云版本。當然,也可以通過docker本地啟動一個,然后將圖譜數據導入到Neo4j 數據庫中。

步驟I:Neo4j環境搭建

下面是本地啟動docker的運行示例:

docker run -d \
    --restart always \
    --publish=7474:7474 --publish=7687:7687 \
    --env NEO4J_AUTH=neo4j/000000 \
    --volume=/yourdockerVolume/neo4j:/data \
    neo4j:5.19.0

步驟II:圖譜數據導入

演示中,我們可以使用伊麗莎白一世的維基百科頁面。利用 LangChain 加載器從維基百科獲取并分割文檔,后存入Neo4j數據庫。為了試驗中文上的效果,我們導入這個Github上的這個項目(QASystemOnMedicalKG)中的醫學知識圖譜,包含近35000個節點,30萬組三元組,大致得到如下結果:

圖片圖片

或者利用LangChainLangChain 加載器從維基百科獲取并分割文檔,大致如下面步驟所示:

# 讀取維基百科文章  
raw_documents = WikipediaLoader(query="Elizabeth I").load()  
  
# 定義分塊策略  
text_splitter = TokenTextSplitter(chunk_size=512, chunk_overlap=24)


documents = text_splitter.split_documents(raw_documents[:3])


llm=ChatOpenAI(temperature=0, model_name="gpt-4-0125-preview")
llm_transformer = LLMGraphTransformer(llm=llm)
# 提取圖數據
graph_documents = llm_transformer.convert_to_graph_documents(documents)
# 存儲到 neo4j  


graph.add_graph_documents(
  graph_documents, 
  baseEntityLabel=True, 
  include_source=True
)

2.知識圖譜檢索

在對知識圖譜檢索之前,需要對實體和相關屬性進行向量嵌入并存儲到Neo4j數據庫中:

  • 實體信息向量嵌入:將實體名稱和實體的描述信息拼接后,利用向量表征模型進行向量嵌入(如下述示例代碼中的add_embeddings方法所示)。
  • 圖譜結構化檢索:圖譜的結構化檢索分為四個步驟:步驟一,從圖譜中檢索與查詢相關的實體;步驟二,從全局索引中檢索得到實體的標簽;步驟三,根據實體標簽在相應的節點中查詢鄰居節點路徑;步驟四,對關系進行篩選,保持多樣性(整個檢索過程如下述示例代碼中的structured_retriever方法所示)。
class GraphRag(object):
    def __init__(self):
        """Any embedding function implementing `langchain.embeddings.base.Embeddings` interface."""
        self._database = 'neo4j'
        self.label = 'Med'
        self._driver = neo4j.GraphDatabase.driver(
            uri=os.environ["NEO4J_URI"],
            auth=(os.environ["NEO4J_USERNAME"],
                  os.environ["NEO4J_PASSWORD"]))
        self.embeddings_zh = HuggingFaceEmbeddings(model_name=os.environ["EMBEDDING_MODEL"])
        self.vectstore = Neo4jVector(embedding=self.embeddings_zh,
                                     username=os.environ["NEO4J_USERNAME"],
                                     password=os.environ["NEO4J_PASSWORD"],
                                     url=os.environ["NEO4J_URI"],
                                     node_label=self.label,
                                     index_name="vector"
                                     )




    def query(self, query: str, params: dict = {}) -> List[Dict[str, Any]]:
        """Query Neo4j database."""
        from neo4j.exceptions import CypherSyntaxError


        with self._driver.session(database=self._database) as session:
            try:
                data = session.run(query, params)
                return [r.data() for r in data]
            except CypherSyntaxError as e:
                raise ValueError(f"Generated Cypher Statement is not valid\n{e}")


    def add_embeddings(self):
        """Add embeddings to Neo4j database."""
        # 查詢圖中所有節點,并且根據節點的描述和名字生成embedding,添加到該節點上
        query = """MATCH (n) WHERE not (n:{}) RETURN ID(n) AS id, labels(n) as labels, n""".format(self.label)
        print("qurey node...")
        data = self.query(query)
        ids, texts, embeddings, metas = [], [], [], []
        for row in tqdm(data,desc="parsing node"):
            ids.append(row['id'])
            text = row['n'].get('name','') + row['n'].get('desc','')
            texts.append(text)
            metas.append({"label": row['labels'], "context": text})
        self.embeddings_zh.multi_process = False


        print("node embeddings...")
        embeddings = self.embeddings_zh.embed_documents(texts)
        print("adding node embeddings...")
        ids_ret = self.vectstore.add_embeddings(
            ids=ids,
            texts=texts,
            embeddings=embeddings,
            metadatas=metas
        )
        return ids_ret


    # Fulltext index query
    def structured_retriever(self, query, limit=3, simlarity=0.9) -> str:
        """
        Collects the neighborhood of entities mentioned in the question
        """
        # step1 從圖譜中檢索與查詢相關的實體。
        docs_with_score = self.vectstore.similarity_search_with_score(query, k=topk)
        entities = [item[0].page_content for item in data if item[1] > simlarity] # score
        self.vectstore.query(
            "CREATE FULLTEXT INDEX entity IF NOT EXISTS FOR (e:Med) ON EACH [e.context]")
        result = ""
        for entity in entities:
            qry = entity
            # step2 從全局索引中查出entity label,
            query1 =  f"""CALL db.index.fulltext.queryNodes('entity', '{qry}') YIELD node, score 
                            return node.label as label,node.context as context, node.id as id, score LIMIT {limit}"""
            data1 = self.vectstore.query(query1)
            # step3 根據label在相應的節點中查詢鄰居節點路徑
            for item in data1:
                node_type = item['label']
                node_type = item['label'] if type(node_type) == str else node_type[0]
                node_id = item['id']
                query2 = f"""match (node:{node_type})-[r]-(neighbor) where ID(node) = {node_id} RETURN type(r) as rel, node.name+' - '+type(r)+' - '+neighbor.name as output limit 50"""
                data2 = self.vectstore.query(query2)
                # step4 為了保持多樣性,對關系進行篩選
                rel_dict = defaultdict(list)
                if len(data2) > 3*limit:
                    for item1 in data2:
                        rel_dict[item1['rel']].append(item1['output'])
                if rel_dict:
                    rel_dict = {k:random.sample(v, 3) if len(v)>3 else v for k,v in rel_dict.items()}
                    result += "\n".join(['\n'.join(el) for el in rel_dict.values()]) +'\n'
                else:
                    result += "\n".join([el['output'] for el in data2]) +'\n'
        return result

3.結合LLM生成

最后利用大語言模型(LLM)根據從知識圖譜中檢索出來的結構化信息,生成最終的回復。下面的代碼中我們以通義千問開源的大語言模型為例:

步驟I:加載LLM模型

from langchain import HuggingFacePipeline
from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM


def custom_model(model_name, branch_name=None, cache_dir=None, temperature=0, top_p=1, max_new_tokens=512, stream=False):
    tokenizer = AutoTokenizer.from_pretrained(model_name,
                                             revision=branch_name,
                                             cache_dir=cache_dir)
    model = AutoModelForCausalLM.from_pretrained(model_name,
                                        device_map='auto',
                                        torch_dtype=torch.float16,
                                        revision=branch_name,
                                        cache_dir=cache_dir
                                        )
    pipe = pipeline("text-generation",
                    model = model,
                    tokenizer = tokenizer,
                    torch_dtype = torch.bfloat16,
                    device_map = 'auto',
                    max_new_tokens = max_new_tokens,
                    do_sample = True
                    )
    llm = HuggingFacePipeline(pipeline = pipe,
                              model_kwargs = {"temperature":temperature, "top_p":top_p,
                                              "tokenizer":tokenizer, "model":model})
    return llm
    
tongyi_model = "Qwen1.5-7B-Chat"
llm_model = custom_model(model_name=tongyi_model)
tokenizer = llm_model.model_kwargs['tokenizer']
model = llm_model.model_kwargs['model']

步驟II:輸入檢索數據生成回復

final_data = self.get_retrieval_data(query)
prompt = ("請結合以下信息,簡潔和專業的來回答用戶的問題,若信息與問題關聯緊密,請盡量參考已知信息。\n"
          "已知相關信息:\n{context} 請回答以下問題:{question}".format(cnotallow=final_data, questinotallow=query))


messages = [
    {"role": "system", "content": "你是**開發的智能助手。"},
    {"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
model_inputs = tokenizer([text], return_tensors="pt").to(self.device)


generated_ids = model.generate(model_inputs.input_ids,max_new_tokens=512)
generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)

4 結語

對一個查詢問題分別進行了測試, 與沒有RAG僅利用LLM生成回復的的情況進行對比,在有GraphRAG 的情況下,LLM模型回答的信息量更大、準確會更高。

責任編輯:武曉燕 來源: AI大模型咨訊
相關推薦

2018-05-16 08:26:39

知識圖譜Neo4j

2024-08-08 08:31:32

SpringNeo4j優化

2025-10-09 00:00:00

Neo4jLLMs結構化

2025-07-21 09:23:13

2025-10-28 04:00:00

GraphRAG節點

2025-07-18 08:15:55

2025-03-06 10:41:32

2022-11-18 17:53:03

Neo4j

2017-07-28 15:12:28

Neo4j圖數據庫

2021-12-27 07:31:37

JavaNeo4J數據庫

2025-02-13 09:01:03

2025-06-12 11:56:30

模型框架開源

2024-11-26 07:20:25

2024-07-15 12:18:39

2017-03-06 16:48:56

知識圖譜構建存儲

2022-04-13 11:32:45

Neo4j圖數據庫

2021-01-19 10:52:15

知識圖譜

2025-04-27 00:10:00

AI人工智能知識圖譜

2021-01-25 10:36:32

知識圖譜人工智能

2022-02-15 08:22:28

Neo4jSpring數據庫
點贊
收藏

51CTO技術棧公眾號

国产不卡av一区二区| 亚洲在线观看网站| 九九热视频精品| 高清一区二区三区| 欧美在线影院一区二区| 特级毛片在线免费观看| 欧美 日韩 综合| 日韩精品乱码免费| 欧美日韩国产va另类| 精品久久久久久中文字幕人妻最新| 午夜无码国产理论在线| 亚洲美女在线一区| 日本视频一区二区不卡| 精品黑人一区二区三区在线观看| 亚洲制服av| 欧美大成色www永久网站婷| 波多野结衣a v在线| 国产在线一区不卡| 91久久线看在观草草青青| 精品久久久无码人妻字幂| 青青操视频在线| 国产成人av一区二区三区在线观看| 庆余年2免费日韩剧观看大牛| 午夜激情视频在线播放| 少妇精品久久久一区二区三区 | 亚洲少妇中文在线| 风韵丰满熟妇啪啪区老熟熟女| 成人午夜亚洲| 色偷偷久久人人79超碰人人澡| 妞干网视频在线观看| 天堂中文а√在线| 国产亚洲精品aa午夜观看| 国产伦理一区二区三区| 成 人片 黄 色 大 片| 日本va欧美va精品| 国产成人av网址| 国产成人免费观看视频| 国产精品99一区二区| 久久激情视频久久| 少妇愉情理伦三级| 欧美精选视频在线观看| 亚洲免费高清视频| aa一级黄色片| 私拍精品福利视频在线一区| 精品国产三级a在线观看| 91国产精品成人| 国产日韩第一页| 求av网址在线观看| 国产精品情趣视频| 亚洲高清乱码| 在线观看免费版| 国产精品蜜臀av| 亚洲午夜精品久久| 日本韩国在线视频爽| 中文字幕av一区二区三区| 欧美日韩一区综合| 触手亚洲一区二区三区| 国产无人区一区二区三区| 欧美在线视频二区| 国产在线视频你懂得| 中文字幕乱码久久午夜不卡 | 国产91成人在在线播放| 国产福利拍拍拍| 欧美一级久久| 国产精品美女午夜av| 亚洲手机在线观看| 国产一区二区电影| 91中文字精品一区二区| 亚洲精品97久久中文字幕无码| 成人精品国产免费网站| 麻豆精品视频| √天堂资源地址在线官网| 国产精品国产三级国产三级人妇| 色呦呦网站入口| 黄页网站大全在线免费观看| 福利二区91精品bt7086| 国产性生交xxxxx免费| 日本免费成人| 亚洲国产高清自拍| 日韩黄色中文字幕| 欧美日韩第一区| 日本成人精品在线| 国产精品视频久久久久久| 国产91精品一区二区麻豆亚洲| 国产中文一区二区| 91福利在线视频| 一区二区三区四区av| www精品久久| 蜜桃视频成人m3u8| 欧美一区二区三区色| av资源一区二区| 毛片毛片毛片毛片毛| 亚洲午夜免费| 一区二区三区黄色| 国产一级片免费观看| 日韩精品福利网| 97久草视频| h网站在线免费观看| 一区二区三区在线观看国产| 成人一级片网站| 欧美国产中文高清| 一区国产精品视频| 日产亚洲一区二区三区| 久久国产精品色| 久久99国产精品| 激情在线小视频| 色偷偷88欧美精品久久久| 一二三区视频在线观看| 成人a'v在线播放| 69视频在线免费观看| aaa国产视频| 国产精品女主播在线观看| 成年人午夜免费视频| 婷婷丁香久久| 亚洲视频在线观看视频| 亚欧洲精品在线视频| 国精产品一区一区三区mba视频 | 亚洲国产日韩一级| 国产精品v日韩精品v在线观看| 老司机精品视频在线播放| 久久夜色精品国产| 亚洲一区中文字幕在线| 久久久噜噜噜久久中文字幕色伊伊 | 日韩美女精品在线| 爆乳熟妇一区二区三区霸乳| 嫩草国产精品入口| 欧美激情在线一区| 99在线小视频| 亚洲日本护士毛茸茸| 污污网站免费看| 欧美亚洲国产精品久久| 日本久久91av| 青青草视频免费在线观看| 午夜激情综合网| 男人的天堂影院| 韩日成人av| 国产精品久久久久久久久久久久午夜片| 亚洲欧洲精品在线| 日韩大胆人体| 亚洲国产精品欧美一二99| 亚洲自拍第三页| 欧美大片专区| 97夜夜澡人人双人人人喊| 欧美jizz18hd性欧美| 欧美日韩三级一区| www中文在线| 麻豆精品精品国产自在97香蕉| 欧美一级爱爱| 日韩在线观看不卡| 最好看的2019的中文字幕视频| 国产成人自拍偷拍| 国产精品情趣视频| 亚洲第一色av| 欧美日韩国产高清| 国产精品我不卡| 午夜av不卡| 亚洲区中文字幕| 制服丝袜在线一区| 综合亚洲深深色噜噜狠狠网站| 亚洲18在线看污www麻豆| 亚洲天堂免费| 国产精品久久国产三级国电话系列| 美女91在线| 亚洲女人天堂成人av在线| 国产一级精品毛片| 亚洲欧美色一区| 香蕉视频污视频| 日韩中文字幕区一区有砖一区| 天堂va久久久噜噜噜久久va| 色综合视频一区二区三区日韩| 久久福利视频导航| 日本精品久久久久| 日本韩国一区二区三区| 91香蕉一区二区三区在线观看| 国模娜娜一区二区三区| 少妇av一区二区三区无码| 怕怕欧美视频免费大全| 91欧美视频网站| 激情国产在线| 日韩在线视频二区| 熟妇人妻系列aⅴ无码专区友真希| 欧美性xxxx18| 一区二区三区影视| 91免费小视频| 午夜福利123| 免费久久99精品国产自在现线| 一区二区高清视频| 大伊香蕉精品在线品播放| 国产精品精品一区二区三区午夜版| 麻豆视频在线观看免费网站| 亚洲高清久久网| 中国一区二区视频| 亚洲 国产 欧美 日韩| 亚洲欧美国产毛片在线| 国产草草浮力影院| 国产一区在线观看麻豆| 一女被多男玩喷潮视频| 婷婷综合五月| 欧美一区二区在线| 中文字幕一区二区三区中文字幕 | 国产一区二区成人| 精品国产伦一区二区三| 在线视频一区二区三| 五月天婷婷色综合| 国产欧美一区二区精品性色| 国产xxx在线观看| 久久国产麻豆精品| 国产免费成人在线| 亚洲国产日本| 免费看黄色a级片| 不卡日本视频| 欧美不卡三区| 精品伊人久久久| 91在线观看网站| 粉嫩一区二区三区在线观看| 国产99在线|中文| 麻豆网站免费在线观看| 久久99久久久久久久噜噜| 在线看免费av| 国产亚洲精品高潮| 神马亚洲视频| 日韩精品在线视频观看| 高清国产mv在线观看| 欧美一级高清片在线观看| 在线播放精品视频| 在线观看一区二区视频| 啦啦啦免费高清视频在线观看| 有码一区二区三区| 欧产日产国产v| 亚洲免费在线观看| 亚洲综合网在线| 亚洲人成网站影音先锋播放| 国产第一页精品| 欧美国产乱子伦| 成人黄色免费网址| 国产午夜一区二区三区| 人妻大战黑人白浆狂泄| 91视频91自| 巨胸大乳www视频免费观看| 99久久国产综合色|国产精品| av av在线| 99精品1区2区| 欧美熟妇精品黑人巨大一二三区| www.欧美.com| 美女又爽又黄免费| 91在线云播放| 黄色aaa视频| 亚洲国产岛国毛片在线| 性色av香蕉一区二区| 亚洲av无码乱码国产精品| 欧美一区二区成人6969| 精品久久在线观看| 亚洲精品在线一区二区| 香蕉视频免费看| 亚洲视屏在线播放| 日本在线免费网| 久久亚洲春色中文字幕| 性国产高清在线观看| 国产69精品久久久| 亚洲天堂资源| 国产精品video| 久久久加勒比| 99精彩视频在线观看免费| 丁香一区二区| 日产精品高清视频免费| 欧美精选视频在线观看| 自拍偷拍视频在线| 亚洲黄色高清| 色七七在线观看| 国产精品一区二区久久不卡| 一二三区视频在线观看| 久久久一区二区| 中文字幕亚洲欧美日韩| 亚洲成在人线免费| 亚洲精品无码久久久久| 91精品一区二区三区久久久久久| 亚洲成a人片77777精品| 国产丝袜精品视频| 欧美日韩在线资源| 久久全球大尺度高清视频| 欧美18—19sex性hd| 成人午夜两性视频| 亚洲另类春色校园小说| 在线观看日韩羞羞视频| 亚洲精选在线| 天堂在线中文在线| 91免费小视频| 麻豆国产尤物av尤物在线观看| 欧美午夜性色大片在线观看| 91黄色在线视频| 日韩精品视频中文在线观看| 波多野结衣在线影院| 欧美极品少妇xxxxx| 亚洲日本在线观看视频| 国产精品日韩高清| 国产精品久久久久久久久妇女| 你真棒插曲来救救我在线观看| 免费观看成人av| 国产精品无码网站| 一区二区三区成人| 中文字幕一区二区久久人妻| 亚洲高清免费观看高清完整版| 日本中文字幕在线2020| 欧美亚洲国产日本| 一区二区三区在线免费看| 日韩免费毛片| 亚洲激情在线| 男生和女生一起差差差视频| 国产亚洲短视频| 午夜婷婷在线观看| 日韩欧美视频一区| 激情在线小视频| 国产精品视频一区二区三区四| 欧美变态网站| 欧美黄色免费网址| 国产成人在线观看网站| 亚洲午夜激情av| 国产成人a人亚洲精品无码| 中文国产成人精品久久一| 性欧美xxx69hd高清| 国产精品久久亚洲7777| 91精品啪在线观看国产18| 日本人视频jizz页码69| 久久久精品影视| 丁香六月婷婷综合| 日韩av影视综合网| 国产高清在线a视频大全| 成人国产精品色哟哟| 日韩国产一区二区三区| 毛葺葺老太做受视频| 337p粉嫩大胆噜噜噜噜噜91av| 精品无码免费视频| 欧美电影精品一区二区| 日本在线观看大片免费视频| 91精品在线看| 中文在线日韩| 91av免费观看| 亚洲国产日日夜夜| 欧美一级做性受免费大片免费| 欧美国产欧美亚洲国产日韩mv天天看完整| 四虎地址8848精品| 一区在线电影| 国产精品主播直播| 国产一级片播放| 亚洲国产欧美一区二区三区同亚洲 | 99久久精品99国产精品| 日韩污视频在线观看| 亚洲精品理论电影| 天堂资源在线| 日本亚洲导航| 激情五月婷婷综合| 国语对白在线播放| 亚洲成人免费在线视频| 国产传媒av在线| 欧美精品123| 免费在线观看不卡| 老熟妇高潮一区二区三区| 日韩欧美色电影| 久热在线观看视频| 欧美日韩系列| 麻豆免费精品视频| 国产一区二区视频在线观看免费| 日韩欧美一级在线播放| brazzers在线观看| 免费在线成人av| 久久电影国产免费久久电影| 懂色av懂色av粉嫩av| 亚洲电影在线看| 69堂免费精品视频在线播放| 中文字幕欧美日韩一区二区三区| 国产一区二区三区免费| 日本天堂在线视频| 揄拍成人国产精品视频| 国内不卡的一区二区三区中文字幕 | 国产精品久久一区二区三区不卡| 国产精品欧美一区二区三区奶水| 婷婷另类小说| 在线免费观看a级片| 在线观看av不卡| 污视频在线免费观看网站| 久久免费一区| 狠狠色伊人亚洲综合成人| 日本污视频在线观看| 亚洲一区第一页| 亚洲va欧美va人人爽成人影院| 高清在线观看免费| 中文字幕字幕中文在线中不卡视频| 欧洲av在线播放| 国产日韩欧美91| 在线一区视频| www欧美com| 国产亚洲精品久久久| 2023国产精华国产精品| 国产精品一区二区羞羞答答| 夜夜揉揉日日人人青青一国产精品| 欧美美乳在线| 国产精品二区在线观看| 美女性感视频久久| 狠狠人妻久久久久久| 欧美老少做受xxxx高潮|