Bayangkan anda sedang membina sokongan pelanggan AI yang perlu menjawab soalan mengenai produk anda. Kadang -kadang ia perlu menarik maklumat dari dokumentasi anda, sementara masa lain ia perlu mencari web untuk kemas kini terkini. Sistem RAG Agentic berguna dalam jenis aplikasi AI yang kompleks. Fikirkan mereka sebagai pembantu penyelidik pintar yang bukan sahaja mengetahui dokumentasi dalaman anda tetapi juga membuat keputusan untuk mencari web. Dalam panduan ini, kami akan melalui proses membina sistem RAG QA yang agentik menggunakan kerangka haystack.
Jadual Kandungan Apa itu Agentic LLM? Komponen Blok > Paip Pengindeksan
sistem kain tradisional mengikuti proses linear. Apabila pertanyaan diterima, sistem pertama mengenal pasti unsur -unsur utama dalam permintaan. Ia kemudian mencari asas pengetahuan, mengimbas maklumat yang relevan yang dapat membantu merancang tindak balas yang tepat. Sebaik sahaja maklumat atau data yang berkaitan diambil, sistem memprosesnya untuk menghasilkan tindak balas yang bermakna dan kontekstual yang relevan.
anda dapat memahami proses dengan mudah oleh rajah di bawah.
Sekarang, sistem kain ragak meningkatkan proses ini dengan:
Menilai keperluan pertanyaan
Memahami Komponen Rangka Kerja Haystack
Haystack menyediakan kedai dokumen yang mantap untuk pengurusan data yang cekap. Ia juga dilengkapi dengan satu set alat yang komprehensif untuk penilaian, pemantauan, dan integrasi data yang memastikan prestasi lancar di semua lapisan aplikasi anda. Ia juga mempunyai kerjasama komuniti yang kuat yang menjadikan integrasi perkhidmatan baru dari pelbagai penyedia perkhidmatan secara berkala.
Apa yang boleh anda bina menggunakan haystack?
mudah untuk memajukan kain pada data anda, menggunakan teknik pengambilan dan generasi yang mantap.
Komponen adalah blok bangunan teras haystack. Mereka boleh melaksanakan tugas seperti penyimpanan dokumen, pengambilan dokumen, penjanaan teks, dan embedding. Haystack mempunyai banyak komponen yang boleh anda gunakan secara langsung selepas pemasangan, ia juga menyediakan API untuk membuat komponen anda sendiri dengan menulis kelas python.
Terdapat koleksi integrasi dari syarikat rakan kongsi dan masyarakat.
Pasang perpustakaan dan tetapkan ollama
$ pip install haystack-ai ollama-haystack # On you system download Ollama and install LLM ollama pull llama3.2:3b ollama pull nomic-embed-text # And then start ollama server ollama serve
Import beberapa komponen
from haystack import Document, Pipeline from haystack.components.builders.prompt_builder import PromptBuilder from haystack.components.retrievers.in_memory import InMemoryBM25Retriever from haystack.document_stores.in_memory import InMemoryDocumentStore from haystack_integrations.components.generators.ollama import OllamaGenerator
Buat dokumen dan kedai dokumen
document_store = InMemoryDocumentStore() documents = [ Document( content="Naruto Uzumaki is a ninja from the Hidden Leaf Village and aspires to become Hokage." ), Document( content="Luffy is the captain of the Straw Hat Pirates and dreams of finding the One Piece." ), Document( content="Goku, a Saiyan warrior, has defended Earth from numerous powerful enemies like Frieza and Cell." ), Document( content="Light Yagami finds a mysterious Death Note, which allows him to eliminate people by writing their names." ), Document( content="Levi Ackerman is humanity’s strongest soldier, fighting against the Titans to protect mankind." ), ]
saluran paip adalah tulang belakang kerangka Haystack. Mereka menentukan aliran data antara komponen yang berbeza. Pipelin pada dasarnya adalah graf acyclic yang diarahkan (DAG). Komponen tunggal dengan pelbagai output boleh menyambung ke komponen tunggal lain dengan pelbagai input.
anda boleh menentukan saluran paip dengan
pipe = Pipeline() pipe.add_component("retriever", InMemoryBM25Retriever(document_store=document_store)) pipe.add_component("prompt_builder", PromptBuilder(template=template)) pipe.add_component( "llm", OllamaGenerator(model="llama3.2:1b", url="http://localhost:11434") ) pipe.connect("retriever", "prompt_builder.documents") pipe.connect("prompt_builder", "llm")
anda boleh memvisualisasikan saluran paip
image_param = { "format": "img", "type": "png", "theme": "forest", "bgColor": "f2f3f4", } pipe.show(params=image_param)
Pipeline menyediakan:
nod adalah unit pemprosesan asas yang boleh disambungkan dalam saluran paip nod ini adalah komponen yang melakukan tugas tertentu.
Contoh nod dari saluran paip di atas
pipe.add_component("retriever", InMemoryBM25Retriever(document_store=document_store)) pipe.add_component("prompt_builder", PromptBuilder(template=template)) pipe.add_component( "llm", OllamaGenerator(model="llama3.2:1b", url="http://localhost:11434") )
Connectiongraph menentukan bagaimana komponen berinteraksi.
Dari saluran paip di atas, anda boleh memvisualisasikan graf sambungan.
image_param = { "format": "img", "type": "png", "theme": "forest", "bgColor": "f2f3f4", } pipe.show(params=image_param)
graf sambungan saluran paip anime
Buat template prompt
template = """ Given only the following information, answer the question. Ignore your own knowledge. Context: {% for document in documents %} {{ document.content }} {% endfor %} Question: {{ query }}? """
pertanyaan menggunakan prompt dan retriever
query = "How Goku eliminate people?" response = pipe.run({"prompt_builder": {"query": query}, "retriever": {"query": query}}) print(response["llm"]["replies"])
Response:
RAG ini mudah tetapi konseptual berharga kepada pendatang baru. Sekarang kita telah memahami kebanyakan konsep kerangka haystack, kita dapat menyelam ke dalam projek utama kita. Sekiranya ada perkara baru, saya akan menerangkan sepanjang jalan.
kami akan membina soalan berasaskan buku Fizik NCERT RAG untuk pelajar menengah yang lebih tinggi. Ia akan memberikan jawapan kepada pertanyaan dengan mengambil maklumat dari buku NCERT, dan jika maklumat itu tidak ada, ia akan mencari web untuk mendapatkan maklumat itu. Untuk ini, saya akan menggunakan:
menyediakan persekitaran pemaju
$ pip install haystack-ai ollama-haystack # On you system download Ollama and install LLM ollama pull llama3.2:3b ollama pull nomic-embed-text # And then start ollama server ollama serve
from haystack import Document, Pipeline from haystack.components.builders.prompt_builder import PromptBuilder from haystack.components.retrievers.in_memory import InMemoryBM25Retriever from haystack.document_stores.in_memory import InMemoryDocumentStore from haystack_integrations.components.generators.ollama import OllamaGenerator
qagent .
document_store = InMemoryDocumentStore() documents = [ Document( content="Naruto Uzumaki is a ninja from the Hidden Leaf Village and aspires to become Hokage." ), Document( content="Luffy is the captain of the Straw Hat Pirates and dreams of finding the One Piece." ), Document( content="Goku, a Saiyan warrior, has defended Earth from numerous powerful enemies like Frieza and Cell." ), Document( content="Light Yagami finds a mysterious Death Note, which allows him to eliminate people by writing their names." ), Document( content="Levi Ackerman is humanity’s strongest soldier, fighting against the Titans to protect mankind." ), ]
Buat fail
main.py pada root projek.
Mengimport perpustakaan yang diperlukanpipe = Pipeline() pipe.add_component("retriever", InMemoryBM25Retriever(document_store=document_store)) pipe.add_component("prompt_builder", PromptBuilder(template=template)) pipe.add_component( "llm", OllamaGenerator(model="llama3.2:1b", url="http://localhost:11434") ) pipe.connect("retriever", "prompt_builder.documents") pipe.connect("prompt_builder", "llm")
image_param = { "format": "img", "type": "png", "theme": "forest", "bgColor": "f2f3f4", } pipe.show(params=image_param)
pipe.add_component("retriever", InMemoryBM25Retriever(document_store=document_store)) pipe.add_component("prompt_builder", PromptBuilder(template=template)) pipe.add_component( "llm", OllamaGenerator(model="llama3.2:1b", url="http://localhost:11434") )
image_param = { "format": "img", "type": "png", "theme": "forest", "bgColor": "f2f3f4", } pipe.show(params=image_param)
template = """ Given only the following information, answer the question. Ignore your own knowledge. Context: {% for document in documents %} {{ document.content }} {% endfor %} Question: {{ query }}? """
Chromadb untuk kedai embedding, dan seperti yang anda lihat dalam contoh yang lebih awal, kami menggunakan InMemoryDocumentStore untuk mendapatkan semula yang cepat dan akan menjadi lebih baik, sistem.
Penyelesaiannya adalah pangkalan data vektor seperti pinecode, weaviate, postgres vector db, atau chromadb. Saya menggunakan Chromadb kerana percuma, sumber terbuka, mudah digunakan, dan teguh.
query = "How Goku eliminate people?" response = pipe.run({"prompt_builder": {"query": query}, "retriever": {"query": query}}) print(response["llm"]["replies"])
ENTERT_PATH di mana anda ingin menyimpan embedding anda.
jalur fail pdf
$conda create --name agenticlm python=3.12 $conda activate agenticlm
Dokumen Preprocessing Components
Cleaner: Ia akan membersihkan ruang tambahan, garis berulang, garis kosong, dan lain -lain dari dokumen.
$pip install haystack-ai ollama-haystack pypdf $pip install chroma-haystack duckduckgo-api-haystack
Splitter: Ia akan memecah dokumen dalam pelbagai cara seperti kata -kata, ayat, para, halaman.
$md qagent # create dir $cd qagent # change to dir $ code . # open folder in vscode
File Converter: Ia akan menggunakan PYPDF untuk menukar PDF ke dokumen.
$ pip install haystack-ai ollama-haystack # On you system download Ollama and install LLM ollama pull llama3.2:3b ollama pull nomic-embed-text # And then start ollama server ollama serve
penulis: Ia akan menyimpan dokumen di mana anda ingin menyimpan dokumen dan untuk dokumen pendua, ia akan menimpa dengan sebelumnya.
from haystack import Document, Pipeline from haystack.components.builders.prompt_builder import PromptBuilder from haystack.components.retrievers.in_memory import InMemoryBM25Retriever from haystack.document_stores.in_memory import InMemoryDocumentStore from haystack_integrations.components.generators.ollama import OllamaGenerator
sekarang tetapkan embedder untuk pengindeksan dokumen.
Embedder: Nomic Embed Text
kami akan menggunakan penyembuhan teks-teks nomik yang sangat berkesan dan bebas inhuggingface dan ollama.
Sebelum anda menjalankan saluran paip pengindeksan anda buka terminal anda dan taipkan di bawah untuk menarik model-teks-teks dan Llama3.2: 3B dari kedai model Ollama
document_store = InMemoryDocumentStore() documents = [ Document( content="Naruto Uzumaki is a ninja from the Hidden Leaf Village and aspires to become Hokage." ), Document( content="Luffy is the captain of the Straw Hat Pirates and dreams of finding the One Piece." ), Document( content="Goku, a Saiyan warrior, has defended Earth from numerous powerful enemies like Frieza and Cell." ), Document( content="Light Yagami finds a mysterious Death Note, which allows him to eliminate people by writing their names." ), Document( content="Levi Ackerman is humanity’s strongest soldier, fighting against the Titans to protect mankind." ), ]
dan mulakan ollama dengan menaip arahan ollama berkhidmat di terminal anda
kini komponen embedder
pipe = Pipeline() pipe.add_component("retriever", InMemoryBM25Retriever(document_store=document_store)) pipe.add_component("prompt_builder", PromptBuilder(template=template)) pipe.add_component( "llm", OllamaGenerator(model="llama3.2:1b", url="http://localhost:11434") ) pipe.connect("retriever", "prompt_builder.documents") pipe.connect("prompt_builder", "llm")
kami menggunakan komponen
image_param = { "format": "img", "type": "png", "theme": "forest", "bgColor": "f2f3f4", } pipe.show(params=image_param)
pipe.add_component("retriever", InMemoryBM25Retriever(document_store=document_store)) pipe.add_component("prompt_builder", PromptBuilder(template=template)) pipe.add_component( "llm", OllamaGenerator(model="llama3.2:1b", url="http://localhost:11434") )
Menghubungkan komponen ke graf saluran paip
image_param = { "format": "img", "type": "png", "theme": "forest", "bgColor": "f2f3f4", } pipe.show(params=image_param)
Penukar menukarkan PDF dan menghantarnya untuk membersihkan untuk membersihkan. Kemudian pembersih menghantar dokumen yang dibersihkan ke splitter untuk chunking. Ketulan -ketulan itu kemudiannya akan ditanam untuk vektorisasi, dan yang terakhir tertanam akan menyerahkan embeddings ini kepada penulis untuk penyimpanan.
faham! Ok, izinkan saya memberi anda graf visual pengindeksan supaya anda dapat memeriksa aliran data.
Lukis saluran paip pengindeksan
template = """ Given only the following information, answer the question. Ignore your own knowledge. Context: {% for document in documents %} {{ document.content }} {% endfor %} Question: {{ query }}? """
Grafik Paip Pengindeksan
Saya menganggap sekarang anda telah memahami sepenuhnya idea di sebalik saluran paip jerami. Bersyukurlah kepada anda tukang paip.
Melaksanakan penghala
Apabila sistem mendapat balasan no_answer dari konteks penyimpanan embedding, maka ia akan pergi ke alat carian web untuk mengumpul data yang relevan dari internet. Untuk carian web, kami akan menggunakan API DuckDuckgo atau Tavily, di sini saya telah menggunakan DuckDuckGo.
template prompt duckduckgo
3
kami akan menggunakan haystack prompt joiner untuk menyertai cawangan -cawangan yang dipenuhi bersama.
Pipeline pertanyaan akan membenamkan sumber -sumber kontekstual yang mengumpul pertanyaan dari embeddings dan menjawab pertanyaan kami menggunakan alat carian LLM atau web.
Menambah komponen ke saluran paip pertanyaan menyambungkan semua komponen bersama untuk aliran pertanyaan dan penjanaan jawapan Ringkasan sambungan di atas:
Retriever menghantar data ke dokumen prompt_builder. Saya tahu ia adalah graf yang besar tetapi ia akan menunjukkan kepada anda apa yang berlaku di bawah perut binatang. sekarang sudah tiba masanya untuk menikmati buah kerja keras kami. Buat fungsi untuk pertanyaan mudah. ia adalah fungsi mudah yang mudah untuk penjanaan jawapan. sekarang jalankan skrip utama anda untuk mengindeks buku fizik ncert Ini adalah pekerjaan satu kali, selepas pengindeksan anda mesti mengulas pada baris ini jika tidak, ia akan mula mengindeks semula buku. dan bahagian bawah fail kami menulis kod pemacu kami untuk pertanyaan MCQ mengenai Resistivity dari Pengetahuan Buku
output
Jadi, ia berfungsi! Kita boleh menggunakan lebih banyak data, buku, atau PDF untuk membenamkan yang akan menghasilkan lebih banyak jawapan kontekstual. Juga, LLMs seperti GPT-4O, Claude Anthropic, atau LLM awan lain akan melakukan pekerjaan yang lebih baik.
Soalan Lazim
a. Grafik sambungan membolehkan aliran data kompleks dan pemprosesan selari, meningkatkan kecekapan sistem dan fleksibiliti dalam mengendalikan pelbagai jenis pertanyaan. $ pip install haystack-ai ollama-haystack
# On you system download Ollama and install LLM
ollama pull llama3.2:3b
ollama pull nomic-embed-text
# And then start ollama server
ollama serve
from haystack import Document, Pipeline
from haystack.components.builders.prompt_builder import PromptBuilder
from haystack.components.retrievers.in_memory import InMemoryBM25Retriever
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack_integrations.components.generators.ollama import OllamaGenerator
kami akan menggunakan komponen haystack promptbuilder untuk membina arahan dari templat document_store = InMemoryDocumentStore()
documents = [
Document(
content="Naruto Uzumaki is a ninja from the Hidden Leaf Village and aspires to become Hokage."
),
Document(
content="Luffy is the captain of the Straw Hat Pirates and dreams of finding the One Piece."
),
Document(
content="Goku, a Saiyan warrior, has defended Earth from numerous powerful enemies like Frieza and Cell."
),
Document(
content="Light Yagami finds a mysterious Death Note, which allows him to eliminate people by writing their names."
),
Document(
content="Levi Ackerman is humanity’s strongest soldier, fighting against the Titans to protect mankind."
),
]
pipe = Pipeline()
pipe.add_component("retriever", InMemoryBM25Retriever(document_store=document_store))
pipe.add_component("prompt_builder", PromptBuilder(template=template))
pipe.add_component(
"llm", OllamaGenerator(model="llama3.2:1b", url="http://localhost:11434")
)
pipe.connect("retriever", "prompt_builder.documents")
pipe.connect("prompt_builder", "llm")
image_param = {
"format": "img",
"type": "png",
"theme": "forest",
"bgColor": "f2f3f4",
}
pipe.show(params=image_param)
pipe.add_component("retriever", InMemoryBM25Retriever(document_store=document_store))
pipe.add_component("prompt_builder", PromptBuilder(template=template))
pipe.add_component(
"llm", OllamaGenerator(model="llama3.2:1b", url="http://localhost:11434")
)
Memulakan saluran paip
di sini, untuk generasi LLM kita menggunakan komponen ollamagenerator untuk menjana jawapan menggunakan llama3.2: 3b atau 1b atau apa sahaja yang anda suka dengan alat yang memanggil. image_param = {
"format": "img",
"type": "png",
"theme": "forest",
"bgColor": "f2f3f4",
}
pipe.show(params=image_param)
template = """
Given only the following information, answer the question.
Ignore your own knowledge.
Context:
{% for document in documents %}
{{ document.content }}
{% endfor %}
Question: {{ query }}?
"""
query = "How Goku eliminate people?"
response = pipe.run({"prompt_builder": {"query": query}, "retriever": {"query": query}})
print(response["llm"]["replies"])
pembina prompt pergi ke gabungan segera untuk bergabung dengan arahan lain.
$ pip install haystack-ai ollama-haystack
# On you system download Ollama and install LLM
ollama pull llama3.2:3b
ollama pull nomic-embed-text
# And then start ollama server
ollama serve
from haystack import Document, Pipeline
from haystack.components.builders.prompt_builder import PromptBuilder
from haystack.components.retrievers.in_memory import InMemoryBM25Retriever
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack_integrations.components.generators.ollama import OllamaGenerator
document_store = InMemoryDocumentStore()
documents = [
Document(
content="Naruto Uzumaki is a ninja from the Hidden Leaf Village and aspires to become Hokage."
),
Document(
content="Luffy is the captain of the Straw Hat Pirates and dreams of finding the One Piece."
),
Document(
content="Goku, a Saiyan warrior, has defended Earth from numerous powerful enemies like Frieza and Cell."
),
Document(
content="Light Yagami finds a mysterious Death Note, which allows him to eliminate people by writing their names."
),
Document(
content="Levi Ackerman is humanity’s strongest soldier, fighting against the Titans to protect mankind."
),
]
pipe = Pipeline()
pipe.add_component("retriever", InMemoryBM25Retriever(document_store=document_store))
pipe.add_component("prompt_builder", PromptBuilder(template=template))
pipe.add_component(
"llm", OllamaGenerator(model="llama3.2:1b", url="http://localhost:11434")
)
pipe.connect("retriever", "prompt_builder.documents")
pipe.connect("prompt_builder", "llm")
mari kita cuba soalan lain.
image_param = {
"format": "img",
"type": "png",
"theme": "forest",
"bgColor": "f2f3f4",
}
pipe.show(params=image_param)
anda boleh mencari semua kod yang digunakan dalam artikel, di sini. Sistem Rag Agentik memberikan lebih banyak respons pintar dan fleksibel daripada kain tradisional.
Senibina saluran paip Haystack membolehkan aliran kerja kompleks, modular.
.
a. Sistem ini menggunakan komponen routernya untuk secara automatik jatuh ke carian web apabila pengetahuan tempatan tidak mencukupi, memastikan liputan komprehensif. Q2. Apakah kelebihan yang ditawarkan oleh seni bina saluran paip? Q4. Bolehkah saya menggunakan API LLM yang lain? a. Ya, sangat mudah hanya memasang pakej integrasi yang diperlukan untuk API LLM masing -masing seperti Gemini, Anthropic, dan Groq, dan menggunakannya dengan kekunci API anda.
Atas ialah kandungan terperinci Cara Membina Sistem Rag QA Agentik Menggunakan Rangka Kerja Haystack. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!