Ons het aangevoer dat inhoudgesentreerde kennisgrafieke - 'n vektorwinkel wat skakels tussen stukke toelaat - 'n makliker om te gebruik en meer doeltreffende benadering is om JOOL-resultate te verbeter. Hier stel ons dit op die proef.
Die gebruik van kennisgrafieke om die resultate van toepassings met herwinning versterkte generasie (JOOL) te verbeter, het 'n warm onderwerp geword. Die meeste voorbeelde demonstreer hoe om 'n kennisgrafiek te bou deur 'n relatief klein aantal dokumente te gebruik. Dit kan wees omdat die tipiese benadering – die onttrekking van fyn, entiteitgesentreerde inligting – net nie skaal nie. Om elke dokument deur 'n model te laat loop om die entiteite (nodes) en verwantskappe (rande) te onttrek, neem te lank (en kos te veel) om op groot datastelle uit te voer.
Ons het dit aangevoer - 'n vektorwinkel wat skakels tussen stukke toelaat - is 'n makliker om te gebruik en meer doeltreffende benadering. Hier stel ons dit op die proef. Ons laai 'n subset van die Wikipedia-artikels van die datastel deur beide tegnieke te gebruik en bespreek wat dit beteken vir die laai van die hele datastel. Ons demonstreer die resultate van sommige vrae oor die gelaaide data. Ons sal ook die hele datastel – byna 6 miljoen dokumente – in 'n inhoudgesentreerde laai .
Entiteitgesentreerd: LLMGraphTransformer
Die laai van dokumente in 'n entiteit-gesentreerde grafiekwinkel soos Neo4j is gedoen met LangChain se LLMGraphTransformer. Die kode is gebaseer op LangChain's
from langchain_core.documents import Document from langchain_experimental.graph_transformers import LLMGraphTransformer from langchain_openai import ChatOpenAI llm = ChatOpenAI(temperature=0, model_name="gpt-4-turbo") llm_transformer = LLMGraphTransformer(llm=llm) from time import perf_counter start = perf_counter() documents_to_load = [Document(page_content=line) for line in lines_to_load] graph_documents = llm_transformer.convert_to_graph_documents(documents_to_load) end = perf_counter() print(f"Loaded (but NOT written) {NUM_LINES_TO_LOAD} in {end - start:0.2f}s")
Inhoudgesentreerd: GraphVectorStore
Om die data in GraphVectorStore te laai is min of meer dieselfde as om dit in 'n vektorstoor te laai. Die enigste toevoeging is dat ons metadata bereken wat aandui hoe elke bladsy na ander bladsye skakel.
import json from langchain_core.graph_vectorstores.links import METADATA_LINKS_KEY, Link def parse_document(line: str) -> Document: para = json.loads(line) id = para["id"] links = { Link.outgoing(kind="href", tag=id) for m in para["mentions"] if m["ref_ids"] is not None for id in m["ref_ids"] } links.add(Link.incoming(kind="href", tag=id)) return Document( id = id, page_content = " ".join(para["sentences"]), metadata = { "content_id": para["id"], METADATA_LINKS_KEY: list(links) }, )
Dit is ook 'n goeie voorbeeld van hoe jy jou eie skakels tussen nodusse kan byvoeg.
from langchain_openai import OpenAIEmbeddings from langchain_community.graph_vectorstores.cassandra import CassandraGraphVectorStore import cassio cassio.init(auto=True) TABLE_NAME = "wiki_load" store = CassandraGraphVectorStore( embedding = OpenAIEmbeddings(), node_table=TABLE_NAME, insert_timeout = 1000.0, ) from time import perf_counter start = perf_counter() from datasets.wikimultihop.load import parse_document kg_documents = [parse_document(line) for line in lines_to_load] store.add_documents(kg_documents) end = perf_counter() print(f"Loaded (and written) {NUM_LINES_TO_LOAD} in {end - start:0.2f}s")
Laai maatstawwe
Met 100 rye, het die entiteit-gesentreerde benadering wat GPT-4o gebruik, 405.93s geneem om die GraphDocuments te onttrek en 10.99s om dit na Neo4j te skryf, terwyl die inhoudsentriese benadering 1.43s geneem het. Ekstrapoleer, sal dit 41 weke neem om al 5 989 847 bladsye te laai deur die entiteitgesentreerde benadering te gebruik en ongeveer 24 uur met die inhoudgesentreerde benadering. Maar danksy parallelisme loop die inhoudgesentreerde benadering in slegs 2,5 uur! As dieselfde parallellisme-voordele aanvaar word, sal dit steeds meer as vier weke neem om alles te laai deur die entiteitgesentreerde benadering te gebruik. Ek het dit nie probeer nie, aangesien die beraamde koste $58 700 sou wees - aangeneem dat alles die eerste keer gewerk het!
Bottom-line: die entiteit-gesentreerde benadering om kennisgrafieke uit inhoud te onttrek deur 'n LLM te gebruik, was op skaal beide tyd en koste onbetaalbaar. Aan die ander kant was die gebruik van GraphVectorStore vinnig en goedkoop.
Voorbeeld antwoorde
In hierdie afdeling word 'n paar vrae, getrek uit die subset van gelaaide dokumente, gevra om die kwaliteit van antwoorde aan te spreek.
Entiteit-gesentreerd het 7324 vinnige tokens gebruik en $0,03 gekos om basies nuttelose antwoorde te produseer, terwyl inhoudgesentreerde 450 vinnige tokens gebruik het en $0,002 gekos het om bondige antwoorde te lewer wat die vrae direk beantwoord.
Dit mag dalk verbasend wees dat die fynkorrelige Neo4j-grafiek nuttelose antwoorde gee. As ons na die logboek van die ketting kyk, sien ons 'n paar van hoekom dit gebeur:
> Entering new GraphCypherQAChain chain... Generated Cypher: cypher MATCH (a:Album {id: 'The Circle'})-[:RELEASED_BY]->(r:Record_label) RETURN a.id, r.id Full Context: [{'a.id': 'The Circle', 'r.id': 'Restless'}] > Finished chain. {'query': "When was 'The Circle' released?", 'result': "I don't know the answer."}
Dus, die fyn skema het slegs inligting oor die platemaatskappy teruggegee. Dit maak sin dat die LLM nie die vraag kon beantwoord op grond van die opgespoorde inligting nie.
Gevolgtrekking
Die onttrekking van fynkorrelige, entiteitspesifieke kennisgrafieke is op skaal tyd- en kostebeperkend. Toe vrae gevra is oor die subset van data wat gelaai is, het die bykomende korreligheid (en ekstra koste om die fynkorrelige grafiek te laai) meer tekens teruggegee om die vinnige in te sluit, maar nuttelose antwoorde gegenereer!
GraphVectorStore volg 'n growwe, inhoudgesentreerde benadering wat dit vinnig en maklik maak om 'n kennisgrafiek te bou. Jy kan begin met jou bestaande kode vir die invul van 'n VectorStore deur LangChain te gebruik en skakels (rande) tussen stukke byvoeg om die herwinningsproses te verbeter.
Grafiek JOOL is 'n nuttige hulpmiddel om generatiewe KI JOOL-toepassings in staat te stel om meer dieper relevante kontekste te herwin. Maar die gebruik van 'n fyn, entiteit-gesentreerde benadering skaal nie volgens produksiebehoeftes nie. As jy op soek is na kennisgrafiekvermoëns by jou JOOL-toepassing, probeer .