AGI και το μέλλον της AI
Κατασκευή LLM Agents για RAG από την αρχή και πέρα: Ένας Ολοκληρωμένος Οδηγός
Τα LLMs όπως το GPT-3, το GPT-4 και το ανοιχτό τους αντίστοιχο συχνά δυσκολεύονται με την ανάκτηση ενημερωμένων πληροφοριών και μπορεί να παράγουν ψευδείς ή λανθασμένες πληροφορίες.
Retrieval-Augmented Generation (RAG) είναι μια τεχνική που συνδυάζει τη δύναμη των LLMs με εξωτερική ανάκτηση γνώσης. Το RAG μας επιτρέπει να εδραιώνουμε τις απαντήσεις των LLMs σε πραγματικές, ενημερωμένες πληροφορίες, βελτιώνοντας σημαντικά την ακρίβεια και την αξιοπιστία του περιεχομένου που παράγεται από την AI.
Σε αυτό το άρθρο, θα εξερευνήσουμε πώς να κατασκευάσουμε LLM agents για RAG από την αρχή, εμβαθύνοντας στα αρχιτεκτονικά, τις λεπτομέρειες της υλοποίησης και τις προηγμένες τεχνικές. Θα καλύψουμε όλα, από τις βασικές αρχές του RAG μέχρι τη δημιουργία σοφιστικών agent που μπορούν να εκτελέσουν σύνθετες εργασίες και να αντιμετωπίσουν复잡ές προβλήματα.
Πριν ξεκινήσουμε να κατασκευάζουμε το LLM agent μας, ας κατανοήσουμε τι είναι το RAG και γιατί είναι σημαντικό.
Το RAG, ή Retrieval-Augmented Generation, είναι μια υβριδική προσέγγιση που συνδυάζει την ανάκτηση πληροφοριών με τη γεννήτρια κειμένου. Σε ένα σύστημα RAG:
- Μια ερώτηση χρησιμοποιείται για την ανάκτηση σχετικών εγγράφων από μια βάση γνώσεων.
- Τα έγγραφα αυτά στη συνέχεια εισάγονται σε ένα μοντέλο γλώσσας μαζί με την αρχική ερώτηση.
- Το μοντέλο παράγει μια απάντηση με βάση και την ερώτηση και τις ανακτημένες πληροφορίες.
Αυτή η προσέγγιση έχει πολλά πλεονεκτήματα:
- Βελτιωμένη ακρίβεια: Εδραιώνοντας τις απαντήσεις σε ανακτημένες πληροφορίες, το RAG μειώνει τις ψευδείς πληροφορίες και βελτιώνει την ακρίβεια.
- Ενημερωμένες πληροφορίες: Η βάση γνώσεων μπορεί να ενημερώνεται τακτικά, επιτρέποντας στο σύστημα να έχει πρόσβαση σε τρέχουσες πληροφορίες.
- Διαφάνεια: Το σύστημα μπορεί να παρέχει πηγές για τις πληροφορίες του, αυξάνοντας την εμπιστοσύνη και επιτρέποντας τον έλεγχο.
Κατανοώντας LLM Agents
Όταν αντιμετωπίζετε ένα πρόβλημα χωρίς απλή απάντηση, συχνά πρέπει να ακολουθήσετε πολλά βήματα, να σκεφτείτε προσεκτικά και να θυμάστε τι έχετε ήδη προσπαθήσει. Τα LLM agents σχεδιάζονται για ακριβώς αυτούς τους τύπους καταστάσεων στις εφαρμογές μοντέλων γλώσσας. Συνδυάζουν την εκτεταμένη ανάλυση δεδομένων, τη στρατηγική σχεδίαση, την ανάκτηση δεδομένων και την ικανότητα να μαθαίνουν από τις προηγούμενες ενέργειες για να λύσουν σύνθετα προβλήματα.
Τι είναι τα LLM Agents;
Τα LLM agents είναι προηγμένα συστήματα AI που σχεδιάζονται για τη δημιουργία σύνθετου κειμένου που απαιτεί σειριακή σκέψη. Μπορούν να σκέφτονται μπροστά, να θυμάονται τις προηγούμενες συζητήσεις και να χρησιμοποιούν διαφορετικά εργαλεία για να προσαρμόσουν τις απαντήσεις τους με βάση την κατάσταση και το στυλ που απαιτείται.
Σκεφτείτε μια ερώτηση στον τομέα του δικαίου, όπως: “Ποιες είναι οι πιθανές νομικές επιπτώσεις μιας συγκεκριμένης μορφής παραβίασης συμβολαίου στην Καλιφόρνια;” Ένα βασικό LLM με ένα σύστημα RAG μπορεί να ανακτήσει τις απαραίτητες πληροφορίες από νομικές βάσεις δεδομένων.
Για μια πιο περίπλοκη περίπτωση: “Με βάση τους νέους νόμους για την προστασία των δεδομένων, ποια είναι οι κοινές νομικές προκλήσεις που αντιμετωπίζουν οι εταιρείες και πώς έχουν αντιμετωπίστεί αυτά τα ζητήματα από τα δικαστήρια;” Αυτή η ερώτηση πηγαίνει πιο sâu από το απλό αναζήτηση γεγονότων. Είναι για την κατανόηση νέων κανόνων, της επίδρασής τους σε διαφορετικές εταιρείες και των απαντήσεων των δικαστηρίων. Ένα LLM agent θα διασπάσει αυτή την εργασία σε υπο-εργασίες, όπως η ανάκτηση των τελευταίων νόμων, η ανάλυση ιστορικών περιπτώσεων, η περίληψη νομικών εγγράφων και η πρόβλεψη τάσεων με βάση τα πρότυπα.
Συστατικά LLM Agents
Τα LLM agents γενικά αποτελούνται από τέσσερα συστατικά:
- Agent/Εγκέφαλος: Το βασικό μοντέλο γλώσσας που επεξεργάζεται και κατανοεί τη γλώσσα.
- Σχεδιασμός: Η ικανότητα να σκέφτεται, να διασπάει εργασίες και να αναπτύσσει συγκεκριμένα σχέδια.
- Μνήμη: Διατηρεί εγγραφές από τις προηγούμενες αλληλεπιδράσεις και μαθαίνει από αυτές.
- Χρήση Εργαλείων: Ενσωματώνει διάφορα εργαλεία για την εκτέλεση εργασιών.
Agent/Εγκέφαλος
Στην καρδιά ενός LLM agent βρίσκεται ένα μοντέλο γλώσσας που επεξεργάζεται και κατανοεί τη γλώσσα με βάση τα τεράστια δεδομένα στα οποία έχει εκπαιδευτεί. Ξεκινάτε δίνοντάς του μια συγκεκριμένη προτροπή, οδηγώντας τον agent σε πώς να απαντήσει, ποια εργαλεία να χρησιμοποιήσει και ποια είναι τα στόχοι. Μπορείτε να προσαρμόσετε τον agent με ένα πρόσωπο που ταιριάζει για συγκεκριμένες εργασίες ή αλληλεπιδράσεις, βελτιώνοντας την απόδοσή του.
Μνήμη
Το συστατικό της μνήμης βοηθά τα LLM agents να χειρίζονται σύνθετες εργασίες διατηρώντας εγγραφές από τις προηγούμενες ενέργειες. Υπάρχουν δύο основные τύποι μνήμης:
- Βραχυπρόθεσμη Μνήμη: Λειτουργεί σαν ένα σημειωματάριο, κρατώντας σημείωση από τις συνεχιζόμενες συζητήσεις.
- Μακροπρόθεσμη Μνήμη: Λειτουργεί σαν ένα ημερολόγιο, αποθηκεύοντας πληροφορίες από τις προηγούμενες αλληλεπιδράσεις για να μάθει πρότυπα και να λάβει καλύτερες αποφάσεις.
Συνδυάζοντας αυτούς τους τύπους μνήμης, ο agent μπορεί να προσφέρει πιο εξατομικευμένες απαντήσεις και να θυμάται τις προτιμήσεις του χρήστη με το χρόνο, δημιουργώντας μια πιο συνδεδεμένη και σχετική αλληλεπίδραση.
Σχεδιασμός
Ο σχεδιασμός επιτρέπει στα LLM agents να σκέφτονται, να διασπάουν εργασίες σε διαχειρίσιμα μέρη και να προσαρμόζουν σχέδια καθώς οι εργασίες εξελίσσονται. Ο σχεδιασμός περιλαμβάνει δύο основικές φάσεις:
- Σχέδιο Σύνθεσης: Διασπάει μια εργασία σε μικρότερες υπο-εργασίες.
- Σχέδιο Ανασκόπησης: Ανασκοπεί και αξιολογεί την αποτελεσματικότητα του σχεδίου, ενσωματώνοντας σχόλια για να βελτιώσει τις στρατηγικές.
Μέθοδοι όπως η Chain of Thought (CoT) και η Tree of Thought (ToT) βοηθούν σε αυτή τη διαδικασία διασπάσεων, επιτρέποντας στους agents να εξερευνήσουν διαφορετικά μονοπάτια για να λύσουν ένα πρόβλημα.
Για να εμβαθύνουμε στον κόσμο των agent AI, συμπεριλαμβανομένων των τρεχουσών ικανοτήτων και των πιθανών, συνιστάται να διαβάσετε “Auto-GPT & GPT-Engineer: Ένας Εργαστηριακός Οδηγός για τους Ηγετικούς Agent AI Σήμερα”
Ρύθμιση του Περιβάλλοντος
Για να κατασκευάσουμε το RAG agent μας, πρέπει να ρυθμίσουμε το περιβάλλον ανάπτυξής μας. Θα χρησιμοποιήσουμε Python και几 βασικές βιβλιοθήκες:
- LangChain: Για την ορχήστρα наших LLM και συστατικών ανάκτησης
- Chroma: Jako vector αποθήκευσης για τις εγγραφές εγγράφων
- OpenAI’s GPT μοντέλα: Jako βασικό LLM (μπορείτε να αντικαταστήσετε αυτό με ένα ανοιχτό μοντέλο αν προτιμάτε)
- FastAPI: Για τη δημιουργία ενός απλού API για αλληλεπίδραση με τον agent μας
Ας ξεκινήσουμε ρυθμίζοντας το περιβάλλον μας:
<p># Δημιουργία ενός νέου εικονικού περιβάλλοντος python -m venv rag_agent_env source rag_agent_env/bin/activate # Στο Windows, χρησιμοποιήστε `rag_agent_env\Scripts\activate`</p> <p># Εγκατάσταση απαραίτητων πακέτων pip install langchain chromadb openai fastapi uvicorn
Τώρα, ας δημιουργήσουμε ένα νέο αρχείο Python με το όνομα rag_agent.py και εισαγάγουμε τις απαραίτητες βιβλιοθήκες:
<p>from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores import Chroma from langchain.text_splitter import CharacterTextSplitter from langchain.llms import OpenAI from langchain.chains import RetrievalQA from langchain.document_loaders import TextLoader import os</p> <p># Ρύθμιση του κλειδιού API του OpenAI os.environ["OPENAI_API_KEY"] = "το κλειδί API σας εδώ"</p>
Κατασκευή ενός Απλού Συστήματος RAG
Τώρα που έχουμε ρυθμίσει το περιβάλλον μας, ας κατασκευάσουμε ένα βασικό σύστημα RAG. Θα ξεκινήσουμε δημιουργώντας μια βάση γνώσεων από ένα σύνολο εγγράφων και στη συνέχεια θα τη χρησιμοποιήσουμε για να απαντήσουμε σε ερωτήσεις.
Βήμα 1: Προετοιμασία των Εγγράφων
Πρώτα, πρέπει να φορτώσουμε και να προετοιμάσουμε τα έγγραφά μας. Για αυτό το παράδειγμα, ας υποθέσουμε ότι έχουμε ένα αρχείο κειμένου με το όνομα knowledge_base.txt με κάποιες πληροφορίες για την AI και τη μηχανική μάθηση.
<p># Φόρτωση του εγγράφου loader = TextLoader("knowledge_base.txt") documents = loader.load()</p> <p># Διαίρεση των εγγράφων σε τμήματα text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0) texts = text_splitter.split_documents(documents)</p> <p># Δημιουργία εγγραφών embeddings = OpenAIEmbeddings()</p> <p># Δημιουργία vector αποθήκευσης vectorstore = Chroma.from_documents(texts, embeddings)</p>
Βήμα 2: Δημιουργία μιας Αλυσίδας Ερωτήσεων με Ανάκτηση
Τώρα που έχουμε τη vector αποθήκευση μας, μπορούμε να δημιουργήσουμε μια αλυσίδα ερωτήσεων με ανάκτηση:
<p># Δημιουργία μιας αλυσίδας ερωτήσεων με ανάκτηση qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="stuff", retriever=vectorstore.as_retriever())</p>
Βήμα 3: Ερώτηση του Συστήματος
Τώρα μπορούμε να ερωτήσουμε το σύστημα RAG μας:
<p>ερώτηση = "Ποιες είναι οι κύριες εφαρμογές της μηχανικής μάθησης;" απάντηση = qa.run(ερώτηση) print(απάντηση)
Βήμα 4: Δημιουργία ενός LLM Agent
Ενώ το απλό μας σύστημα RAG είναι χρήσιμο, είναι khá περιορισμένο. Ας βελτιώσουμε το σύστημα μας δημιουργώντας ένα LLM agent που μπορεί να εκτελέσει πιο σύνθετες εργασίες και να σκέφτεται για τις πληροφορίες που ανακτά.
Ένα LLM agent είναι ένα σύστημα AI που μπορεί να χρησιμοποιήσει εργαλεία και να λάβει αποφάσεις για τις ενέργειες που πρέπει να εκτελέσει. Θα δημιουργήσουμε έναν agent που μπορεί όχι μόνο να απαντήσει σε ερωτήσεις αλλά και να εκτελέσει αναζητήσεις στο διαδίκτυο και βασικές μαθηματικές πράξεις.
Πρώτα, ας ορίσουμε κάποια εργαλεία για τον agent μας:
<p>from langchain.agents import Tool from langchain.tools import DuckDuckGoSearchRun from langchain.tools import BaseTool from langchain.agents import initialize_agent from langchain.agents import AgentType</p> <p># Ορισμός eines εργαλείου για τον υπολογιστή class CalculatorTool(BaseTool): name = "Υπολογιστής" description = "Χρήσιμο για μαθηματικές ερωτήσεις"</p> <p>def _run(self, query: str) try: return str(eval(query)) except: return "Δεν μπορώ να εκτελέσω αυτήν την πράξη. Παρακαλώ βεβαιωθείτε ότι η είσοδος είναι μια έγκυρη μαθηματική έκφραση."</p> <p># Δημιουργία εργαλείων search = DuckDuckGoSearchRun() calculator = CalculatorTool()</p> <p># Ορισμός εργαλείων tools = [Tool(name="Αναζήτηση", func=search.run, description="Χρήσιμο για ερωτήσεις για τρέχοντα γεγονότα"), Tool(name="RAG-Ερωτήσεις", func=qa.run, description="Χρήσιμο για ερωτήσεις για την AI και τη μηχανική μάθηση"), Tool(name="Υπολογιστής", func=calculator._run, description="Χρήσιμο για μαθηματικές πράξεις") ]</p> <p># Αρχικοποίηση του agent agent = initialize_agent(tools, OpenAI(temperature=0), agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True )</p>
Τώρα έχουμε έναν agent που μπορεί να χρησιμοποιήσει το σύστημα RAG μας, να εκτελέσει αναζητήσεις στο διαδίκτυο και να κάνει μαθηματικές πράξεις. Ας τον δοκιμάσουμε:
<p>απάντηση = agent.run("Ποια είναι η διαφορά μεταξύ της επιτηρημένης και της ανεπιτηρημένης μάθησης; Επίσης, ποιο είναι το 15% του 80;") print(απάντηση)</p>
Αυτός ο agent δείχνει ένα βασικό πλεονέκτημα των LLM agents: μπορούν να συνδυάσουν πολλά εργαλεία και βήματα σκέψης για να απαντήσουν σε σύνθετες ερωτήσεις.
Βελτίωση του Agent με Προηγμένες Τεχνικές RAG
Ενώ το τρέχον σύστημα RAG μας λειτουργεί καλά, υπάρχουν beberapa προηγμένες τεχνικές που μπορούμε να χρησιμοποιήσουμε για να το βελτιώσουμε:
a) Σημαντική Αναζήτηση με Dense Passage Retrieval (DPR)
Αντί να χρησιμοποιούμε απλή ανάκτηση με βάση εγγραφές, μπορούμε να υλοποιήσουμε το DPR για πιο ακριβή σημαντική αναζήτηση:
<p>from transformers import DPRQuestionEncoder, DPRContextEncoder</p> <p>question_encoder = DPRQuestionEncoder.from_pretrained("facebook/dpr-question_encoder-single-nq-base") context_encoder = DPRContextEncoder.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base")</p> <p># Συναρτήσεις για κωδικοποίηση διαδρόμων def encode_passages(passages): return context_encoder(passages, max_length=512, return_tensors="pt").pooler_output</p> <p>def encode_query(query): return question_encoder(query, max_length=512, return_tensors="pt").pooler_output</p>
b) Διεύρυνση Ερωτήματος
Μπορούμε να χρησιμοποιήσουμε τη διεύρυνση ερωτήματος για να βελτιώσουμε την απόδοση ανάκτησης:
<p>from transformers import T5ForConditionalGeneration, T5Tokenizer</p>
<p>model = T5ForConditionalGeneration.from_pretrained("t5-small")
tokenizer = T5Tokenizer.from_pretrained("t5-small")</p>
<p>def expand_query(query):
input_text = f"expand query: {query}"
input_ids = tokenizer.encode(input_text, return_tensors="pt")
outputs = model.generate(input_ids, max_length=50, num_return_sequences=3)
expanded_queries = [tokenizer.decode(output, skip_special_tokens=True) for output in outputs]
return expanded_queries</p>
c) Επανελέγχου Αναζήτησης
Μπορούμε να υλοποιήσουμε μια διαδικασία επανελέγχου όπου ο agent μπορεί να κάνει ερωτήσεις για να διευκρινίσει ή να επεκτείνει την αρχική του ανάκτηση:
<p>def iterative_retrieval(initial_query, max_iterations=3):
query = initial_query
for _ in range(max_iterations):
result = qa.run(query)
clarification = agent.run(f"Βάσει αυτού του αποτελέσματος: '{result}', ποια ερώτηση πρέπει να κάνω για να λάβω πιο συγκεκριμένες πληροφορίες;")
if clarification.lower().strip() == "κανένα":
break
query = clarification
return result</p>
# Χρήση αυτής της λειτουργίας στο agent σας
Υλοποίηση ενός Συστήματος Πολυπλών Agent
Για να χειριστούμε πιο σύνθετες εργασίες, μπορούμε να υλοποιήσουμε ένα σύστημα πολυπλών agent όπου διαφορετικά agent ειδικεύονται σε διαφορετικές περιοχές. Εδώ είναι ένα απλό παράδειγμα:
<p>class SpecialistAgent:
def __init__(self, name, tools):
self.name = name
self.agent = initialize_agent(tools, OpenAI(temperature=0), agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)</p>
<p>def run(self, query):
return self.agent.run(query)</p>
<p># Δημιουργία agent ειδικών
research_agent = SpecialistAgent("Ερευνά", [Tool(name="RAG-Ερωτήσεις", func=qa.run, description="Για ερωτήσεις AI και ML")])
math_agent = SpecialistAgent("Μαθηματικά", [Tool(name="Υπολογιστής", func=calculator._run, description="Για μαθηματικές πράξεις")])
general_agent = SpecialistAgent("Γενικά", [Tool(name="Αναζήτηση", func=search.run, description="Για γενικές ερωτήσεις")])</p>
<p>class Coordinator:
def __init__(self, agents):
self.agents = agents</p>
<p>def run(self, query):
# Καθορισμός του agent που θα χρησιμοποιηθεί
if "calculate" in query.lower() or any(op in query for op in ['+', '-', '*', '/']):
return self.agents['Math'].run(query)
elif any(term in query.lower() for term in ['ai', 'machine learning', 'deep learning']):
return self.agents['Research'].run(query)
else:
return self.agents['General'].run(query)</p>
<p>coordinator = Coordinator({'Research': research_agent, 'Math': math_agent, 'General': general_agent})</p>
<p># Δοκιμή του συστήματος πολυπλών agent
result = coordinator.run("Ποια είναι η διαφορά μεταξύ CNN και RNN; Επίσης, υπολογίστε το 25% του 120.")
print(result)</p>
Αυτό το σύστημα πολυπλών agent επιτρέπει την εξειδίκευση και μπορεί να χειριστεί ένα ευρύτερο φάσμα ερωτήσεων πιο αποτελεσματικά.
Αξιολόγηση και Βελτίωση των RAG Agents
Για να διασφαλίσουμε ότι το RAG agent μας εκτελείται καλά, πρέπει να υλοποιήσουμε μετρήσεις αξιολόγησης και τεχνικές βελτίωσης:
a) Αξιολόγηση Σημαντικότητας
Μπορούμε να χρησιμοποιήσουμε μετρήσεις όπως BLEU, ROUGE ή BERTScore για να αξιολογήσουμε τη σημαντικότητα των ανακτημένων εγγράφων:
from bert_score import score <p>def evaluate_relevance(query, retrieved_doc, generated_answer): P, R, F1 = score([generated_answer], [retrieved_doc], lang="en") return F1.mean().item()</p>
b) Αξιολόγηση Ποιότητας Απάντησης
Μπορούμε να χρησιμοποιήσουμε αξιολόγηση από άνθρωπο ή αυτόματες μετρήσεις για να αξιολογήσουμε την ποιότητα της απάντησης:
<p>from nltk.translate.bleu_score import sentence_bleu</p> <p>def evaluate_answer_quality(reference_answer, generated_answer): return sentence_bleu([reference_answer.split()], generated_answer.split())</p> <p># Χρήση αυτής της λειτουργίας για να αξιολογήσετε τις απαντήσεις του agent σας
Μελλοντικές Κατευθύνσεις και Προκλήσεις
Όσο κοιτάμε στο μέλλον των RAG agents, εμφανίζονται beberapa ενδιαφέρουσες κατευθύνσεις και προκλήσεις:
a) Πολυ-μορφική RAG: Επέκταση της RAG για να ενσωματώσει δεδομένα εικόνας, ήχου και βίντεο.
b) Ομοσπονδιακή RAG: Υλοποίηση της RAG σε κατανεμημένες, ιδιωτικές βάσεις γνώσεων.
c) Συνεχής Μάθηση: Ανάπτυξη μεθόδων για τους RAG agents να ενημερώνουν τις βάσεις γνώσεων και τα μοντέλα τους με το χρόνο.
d) Ηθικές Συμμετοχές: Αντιμετώπιση των προβλημάτων προκατάληψης, ισότητας και διαφάνειας στα συστήματα RAG.
e) Κλιμάκωση: Βελτίωση της RAG για μεγάλης κλίμακας, πραγματικού χρόνου εφαρμογές.
Συμπέρασμα
Η κατασκευή LLM agents για RAG από την αρχή είναι μια σύνθετη αλλά ανταποδοτική διαδικασία. Έχουμε καλύψει τα βασικά της RAG, υλοποιήσαμε ένα απλό σύστημα, δημιουργήσαμε ένα LLM agent, το βελτίωσαμε με προηγμένες τεχνικές, εξερευνήσαμε συστήματα πολυπλών agent και συζητήσαμε στρατηγικές αξιολόγησης και βελτίωσης.














