Мэдээллийн графикийг ашиглан сэргээн босгох (RAG) програмуудын үр дүнг сайжруулах нь халуун сэдэв болсон. Ихэнх жишээнүүд нь харьцангуй цөөн тооны баримт бичгийг ашиглан мэдлэгийн графикийг хэрхэн бүтээхийг харуулдаг. Энэ нь ердийн арга буюу нарийн ширхэгтэй, аж ахуйн нэгж төвтэй мэдээллийг гаргаж авах нь зөвхөн масштабтай байдаггүйтэй холбоотой байж болох юм. Байгууллага (зангилаа) болон харилцаа холбоог (ирмэг) задлахын тулд баримт бүрийг загвараар ажиллуулах нь том өгөгдлийн багц дээр ажиллахад хэтэрхий удаан (мөн хэт их зардал) авдаг.
Бид энэ талаар маргасан
Neo4j гэх мэт аж ахуйн нэгж төвтэй график дэлгүүрт бичиг баримтыг ачаалах ажлыг LangChain-ийн LLMGraphTransformer ашиглан хийсэн. Код нь LangChain дээр суурилсан
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")
Өгөгдлийг GraphVectorStore руу ачаалах нь вектор дэлгүүрт ачаалахтай бараг ижил юм. Цорын ганц нэмэлт зүйл бол бид хуудас бүр бусад хуудсуудтай хэрхэн холбогдож байгааг харуулсан мета өгөгдлийг тооцоолох явдал юм.
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) }, )
Энэ нь зангилааны хооронд өөрийн холбоосыг хэрхэн нэмж болох сайн жишээ юм.
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")
100 мөрөнд ажилладаг, GPT-4o-г ашигласан аж ахуйн нэгж төвтэй арга нь GraphDocuments-ийг задлахад 405.93 секунд, Neo4j-д бичихэд 10.99 секунд зарцуулсан бол контент төвтэй арга нь 1.43 секунд зарцуулсан. Аж ахуйн нэгж төвтэй хандлагыг ашиглан 5,989,847 хуудсыг бүгдийг нь ачаалахад 41 долоо хоног, контент төвтэй хандлагыг ашиглан 24 цаг орчим болно. Гэхдээ параллелизмын ачаар контент төвтэй арга нь ердөө 2.5 цагийн дотор ажилладаг! Аж ахуйн нэгж төвтэй хандлагыг ашиглан бүх зүйлийг ачаалахад дөрвөн долоо хоногоос илүү хугацаа шаардагдах болно. Тооцоолсон өртөг нь 58,700 доллар байх тул би үүнийг туршиж үзээгүй - бүх зүйл анх удаа үр дүнтэй байсан гэж үзвэл!
Хамгийн гол нь: LLM ашиглан контентоос мэдлэгийн график гаргаж авах аж ахуйн нэгж төвтэй арга нь цаг хугацаа, зардал ихтэй байсан. Нөгөөтэйгүүр, GraphVectorStore ашиглах нь хурдан бөгөөд хямд байсан.
Энэ хэсэгт хариултын чанарыг тодорхойлохын тулд ачаалагдсан баримт бичгийн дэд хэсгээс авсан хэд хэдэн асуултыг асууна.
Аж ахуйн нэгж төвтэй нь 7324 шуурхай токен ашиглаж, үндсэндээ хэрэггүй хариултуудыг гаргахын тулд 0.03 долларын үнэтэй байсан бол контент төвтэй нь асуултуудад шууд хариулсан товч хариултуудыг гаргахын тулд 450 шуурхай жетон ашиглаж, 0.002 долларын үнэтэй байв.
Нарийн ширхэгтэй Neo4j график нь ашиггүй хариултуудыг өгдөг нь гайхмаар байж магадгүй юм. Сүлжээнээс мод бэлтгэлийг харахад яагаад ийм зүйл болдгийг бид олж харлаа.
> 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."}
Тиймээс нарийн ширхэгтэй схем нь зөвхөн бичлэгийн шошгоны талаархи мэдээллийг буцааж өгсөн. LLM нь олж авсан мэдээлэлд үндэслэн асуултад хариулж чадаагүй нь утга учиртай юм.
Аж ахуйн нэгжийн тусгай мэдлэгийн графикийг гаргаж авах нь цаг хугацаа, зардал багатай. Ачаалагдсан өгөгдлийн дэд багцын талаар асуулт асуухад нэмэлт нарийвчлал (мөн нарийн графикийг ачаалах нэмэлт зардал) нь шуурхай боловч ашиггүй хариултуудыг оруулахын тулд илүү олон жетонуудыг буцааж өгсөн!
GraphVectorStore нь бүдүүн ширхэгтэй, агуулга төвтэй арга барилыг ашигладаг бөгөөд энэ нь мэдлэгийн графикийг хурдан бөгөөд хялбар бүтээх боломжийг олгодог. Та LangChain ашиглан VectorStore-д байршуулах одоо байгаа кодоос эхэлж, татаж авах үйл явцыг сайжруулахын тулд хэсгүүдийн хооронд холбоос (ирмэг) нэмж болно.
График RAG нь AI RAG программуудыг илүү гүнзгий хамааралтай контекстийг олж авах боломжийг олгодог ашигтай хэрэгсэл юм. Гэхдээ нарийн ширхэгтэй, аж ахуйн нэгж төвтэй хандлагыг ашиглах нь үйлдвэрлэлийн хэрэгцээнд нийцэхгүй. Хэрэв та RAG програмдаа мэдлэгийн графикийн чадавхийг нэмэхийг хүсч байвал оролдоод үзээрэй
Бен Чамберс , DataStax