Trí tuệ tổng hợp nhân tạo
Xây dựng Đại lý LLM cho RAG từ đầu đến cuối: Hướng dẫn toàn diện

Các LLM như GPT-3, GPT-4 và đối tác nguồn mở của chúng thường gặp khó khăn trong việc truy xuất thông tin cập nhật và đôi khi có thể tạo ra ảo giác hoặc thông tin không chính xác.
Thế hệ tăng cường truy xuất (RAG) là một kỹ thuật kết hợp sức mạnh của LLM với việc truy xuất kiến thức bên ngoài. RAG cho phép chúng tôi đưa ra các phản hồi LLM dựa trên thông tin thực tế, cập nhật, cải thiện đáng kể độ chính xác và độ tin cậy của nội dung do AI tạo ra.
Trong bài đăng trên blog này, chúng ta sẽ khám phá cách xây dựng các tác nhân LLM cho RAG từ đầu, đi sâu vào kiến trúc, chi tiết triển khai và các kỹ thuật nâng cao. Chúng ta sẽ đề cập đến mọi thứ, từ những kiến thức cơ bản về RAG cho đến việc tạo ra các tác nhân tinh vi có khả năng suy luận phức tạp và thực thi tác vụ.
Trước khi đi sâu vào việc xây dựng đại lý LLM, chúng ta hãy cùng tìm hiểu RAG là gì và tại sao nó lại quan trọng.
RAG, hay Thế hệ tăng cường truy xuất, là một phương pháp kết hợp kết hợp truy xuất thông tin với tạo văn bản. Trong hệ thống RAG:
- Một truy vấn được sử dụng để truy xuất các tài liệu liên quan từ cơ sở tri thức.
- Những tài liệu này sau đó được đưa vào mô hình ngôn ngữ cùng với truy vấn ban đầu.
- Mô hình tạo ra phản hồi dựa trên cả truy vấn và thông tin được truy xuất.
Cách tiếp cận này có một số ưu điểm:
- Cải thiện độ chính xác: Bằng cách phản hồi căn cứ vào thông tin được truy xuất, RAG làm giảm ảo giác và cải thiện độ chính xác thực tế.
- Thông tin cập nhập: Cơ sở tri thức có thể được cập nhật thường xuyên, cho phép hệ thống truy cập thông tin hiện tại.
- Minh bạch: Hệ thống có thể cung cấp nguồn thông tin, tăng cường độ tin cậy và cho phép kiểm tra thực tế.
Hiểu đại lý LLM
Khi gặp một vấn đề không có câu trả lời đơn giản, bạn thường cần làm theo một số bước, suy nghĩ cẩn thận và ghi nhớ những gì bạn đã thử. Tác nhân LLM được thiết kế cho chính xác các loại tình huống này trong các ứng dụng mô hình ngôn ngữ. Họ kết hợp phân tích dữ liệu kỹ lưỡng, lập kế hoạch chiến lược, truy xuất dữ liệu và khả năng học hỏi từ các hành động trong quá khứ để giải quyết các vấn đề phức tạp.
Đại lý LLM là gì?
Tác nhân LLM là hệ thống AI tiên tiến được thiết kế để tạo văn bản phức tạp đòi hỏi phải suy luận tuần tự. Họ có thể suy nghĩ trước, ghi nhớ các cuộc trò chuyện trước đây và sử dụng các công cụ khác nhau để điều chỉnh phản ứng của mình dựa trên tình huống và phong cách cần thiết.
Hãy xem xét một câu hỏi trong lĩnh vực pháp lý chẳng hạn như: “Kết quả pháp lý tiềm ẩn của một loại vi phạm hợp đồng cụ thể ở California là gì?” LLM cơ bản với hệ thống tạo tăng cường truy xuất (RAG) có thể lấy thông tin cần thiết từ cơ sở dữ liệu pháp lý.
Để có một kịch bản chi tiết hơn: "Trước những luật bảo mật dữ liệu mới, những thách thức pháp lý phổ biến mà các công ty phải đối mặt là gì, và tòa án đã giải quyết những vấn đề này như thế nào?" Câu hỏi này đào sâu hơn việc chỉ tra cứu thông tin. Nó đòi hỏi sự hiểu biết về các quy định mới, tác động của chúng đối với các công ty khác nhau, và phản hồi của tòa án. Một chuyên viên LLM sẽ chia nhỏ nhiệm vụ này thành các nhiệm vụ nhỏ hơn, chẳng hạn như tìm kiếm các luật mới nhất, phân tích các vụ án lịch sử, tóm tắt các văn bản pháp lý và dự báo xu hướng dựa trên các mô hình.
Các thành phần của Đại lý LLM
Các đại lý LLM thường bao gồm bốn thành phần:
- Đặc vụ/Bộ não: Mô hình ngôn ngữ cốt lõi xử lý và hiểu ngôn ngữ.
- Lập kế hoạch: Khả năng suy luận, chia nhỏ nhiệm vụ và xây dựng kế hoạch cụ thể.
- Bộ nhớ: Duy trì hồ sơ về các tương tác trong quá khứ và học hỏi từ chúng.
- Sử dụng công cụ: Tích hợp nhiều nguồn lực khác nhau để thực hiện nhiệm vụ.
Đặc vụ/Bộ não
Cốt lõi của tác nhân LLM là mô hình ngôn ngữ xử lý và hiểu ngôn ngữ dựa trên lượng dữ liệu khổng lồ mà nó đã được đào tạo. Bạn bắt đầu bằng cách đưa ra lời nhắc cụ thể, hướng dẫn nhân viên cách phản hồi, sử dụng công cụ nào và mục tiêu cần hướng tới. Bạn có thể tùy chỉnh nhân viên hỗ trợ với một cá nhân phù hợp với các nhiệm vụ hoặc tương tác cụ thể, nâng cao hiệu suất của nhân viên đó.
Bộ nhớ
Thành phần bộ nhớ giúp các tác nhân LLM xử lý các tác vụ phức tạp bằng cách duy trì bản ghi các hành động trong quá khứ. Có hai loại bộ nhớ chính:
- Bộ nhớ ngắn hạn: Hoạt động giống như một sổ ghi chú, theo dõi các cuộc thảo luận đang diễn ra.
- Trí nhớ dài hạn: Chức năng giống như một cuốn nhật ký, lưu trữ thông tin từ các tương tác trong quá khứ để tìm hiểu các mô hình và đưa ra quyết định tốt hơn.
Bằng cách kết hợp các loại bộ nhớ này, tác nhân có thể đưa ra nhiều phản hồi phù hợp hơn và ghi nhớ sở thích của người dùng theo thời gian, tạo ra sự tương tác được kết nối và phù hợp hơn.
Lập kế hoạch
Việc lập kế hoạch cho phép các tác nhân LLM suy luận, phân chia nhiệm vụ thành các phần có thể quản lý được và điều chỉnh kế hoạch khi nhiệm vụ phát triển. Lập kế hoạch bao gồm hai giai đoạn chính:
- Lập kế hoạch: Chia nhỏ một nhiệm vụ thành các nhiệm vụ phụ nhỏ hơn.
- Phản ánh kế hoạch: Rà soát, đánh giá tính hiệu quả của kế hoạch, kết hợp các phản hồi để hoàn thiện chiến lược.
Các phương pháp như Chuỗi tư duy (CoT) và Cây tư duy (ToT) hỗ trợ quá trình phân rã này, cho phép các tác nhân khám phá các con đường khác nhau để giải quyết vấn đề.
Để tìm hiểu sâu hơn về thế giới của các tác nhân AI, bao gồm cả khả năng và tiềm năng hiện tại của chúng, hãy cân nhắc việc đọc “Auto-GPT & GPT-Engineer: Hướng dẫn chuyên sâu về các đại lý AI hàng đầu hiện nay”
Thiết lập môi trường
Để xây dựng tác nhân RAG, chúng ta cần thiết lập môi trường phát triển. Chúng ta sẽ sử dụng Python và một số thư viện chính:
- LangChain: Để sắp xếp LLM và các thành phần truy xuất của chúng tôi
- Chroma: Là kho lưu trữ vectơ của chúng tôi để nhúng tài liệu
- Các mô hình GPT của OpenAI: Là LLM cơ sở của chúng tôi (bạn có thể thay thế mô hình này bằng mô hình nguồn mở nếu muốn)
- API nhanh: Để tạo một API đơn giản để tương tác với đại lý của chúng tôi
Chúng ta hãy bắt đầu bằng cách thiết lập môi trường của mình:
# Create a new virtual environment python -m venv rag_agent_env source rag_agent_env/bin/activate # On Windows, use `rag_agent_env\Scripts\activate` # Install required packages pip install langchain chromadb openai fastapi uvicorn
Bây giờ, hãy tạo một tệp Python mới có tên là rag_agent.py và nhập các thư viện cần thiết:
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 # Set your OpenAI API key os.environ["OPENAI_API_KEY"] = "your-api-key-here"
Xây dựng hệ thống RAG đơn giản
Bây giờ chúng ta đã thiết lập xong môi trường, hãy cùng xây dựng một hệ thống RAG cơ bản. Chúng ta sẽ bắt đầu bằng cách tạo một cơ sở kiến thức từ một tập hợp tài liệu, sau đó sử dụng cơ sở này để trả lời các truy vấn.
Bước 1: Chuẩn bị hồ sơ
Trước tiên, chúng ta cần tải và chuẩn bị tài liệu. Trong ví dụ này, giả sử chúng ta có một tệp văn bản tên là knowledge_base.txt chứa một số thông tin về AI và học máy.
# Load the document loader = TextLoader("knowledge_base.txt") documents = loader.load() # Split the documents into chunks text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0) texts = text_splitter.split_documents(documents) # Create embeddings embeddings = OpenAIEmbeddings() # Create a vector store vectorstore = Chroma.from_documents(texts, embeddings)
Bước 2: Tạo Chuỗi QA dựa trên truy xuất
Bây giờ chúng ta đã có kho lưu trữ vectơ, chúng ta có thể tạo chuỗi QA dựa trên truy xuất:
# Create a retrieval-based QA chain qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="stuff", retriever=vectorstore.as_retriever())
Bước 3: Truy vấn hệ thống
Bây giờ chúng ta có thể truy vấn hệ thống RAG của mình:
query = "What are the main applications of machine learning?" result = qa.run(query) print(result)
Bước 4: Tạo Đại lý LLM
Mặc dù hệ thống RAG đơn giản của chúng ta rất hữu ích, nhưng nó vẫn còn khá hạn chế. Hãy cùng cải tiến nó bằng cách tạo ra một tác nhân LLM có thể thực hiện các tác vụ phức tạp hơn và suy luận về thông tin mà nó thu thập được.
Một tác nhân LLM là một hệ thống AI có thể sử dụng các công cụ và đưa ra quyết định về hành động cần thực hiện. Chúng ta sẽ tạo ra một tác nhân không chỉ có thể trả lời câu hỏi mà còn thực hiện tìm kiếm trên web và các phép tính cơ bản.
Đầu tiên, hãy xác định một số công cụ cho tác nhân của chúng ta:
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 # Define a calculator tool class CalculatorTool(BaseTool): name = "Calculator" description = "Useful for when you need to answer questions about math" def _run(self, query: str) try: return str(eval(query)) except: return "I couldn't calculate that. Please make sure your input is a valid mathematical expression." # Create tool instances search = DuckDuckGoSearchRun() calculator = CalculatorTool() # Define the tools tools = [Tool(name="Search",func=search.run,description="Useful for when you need to answer questions about current events"), Tool(name="RAG-QA",func=qa.run,description="Useful for when you need to answer questions about AI and machine learning"), Tool(name="Calculator",func=calculator._run,description="Useful for when you need to perform mathematical calculations") ] # Initialize the agent agent = initialize_agent(tools, OpenAI(temperature=0), agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True )
Bây giờ chúng ta đã có một tác nhân có thể sử dụng hệ thống RAG, thực hiện tìm kiếm trên web và tính toán. Hãy cùng kiểm tra nó:
result = agent.run("What's the difference between supervised and unsupervised learning? Also, what's 15% of 80?") print(result)
Tác nhân này thể hiện ưu điểm chính của tác nhân LLM: chúng có thể kết hợp nhiều công cụ và các bước suy luận để trả lời các truy vấn phức tạp.
Tăng cường tác nhân bằng kỹ thuật RAG nâng cao
Mặc dù hệ thống RAG hiện tại của chúng tôi hoạt động tốt nhưng có một số kỹ thuật nâng cao mà chúng tôi có thể sử dụng để nâng cao hiệu suất của nó:
a) Tìm kiếm ngữ nghĩa với truy xuất đoạn đường dày đặc (DPR)
Thay vì sử dụng truy xuất dựa trên nhúng đơn giản, chúng ta có thể triển khai DPR để tìm kiếm ngữ nghĩa chính xác hơn:
from transformers import DPRQuestionEncoder, DPRContextEncoder question_encoder = DPRQuestionEncoder.from_pretrained("facebook/dpr-question_encoder-single-nq-base") context_encoder = DPRContextEncoder.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base") # Function to encode passages def encode_passages(passages): return context_encoder(passages, max_length=512, return_tensors="pt").pooler_output # Function to encode query def encode_query(query): return question_encoder(query, max_length=512, return_tensors="pt").pooler_output
b) Mở rộng truy vấn
Chúng ta có thể sử dụng tính năng mở rộng truy vấn để cải thiện hiệu suất truy xuất:
from transformers import T5ForConditionalGeneration, T5Tokenizer model = T5ForConditionalGeneration.from_pretrained("t5-small") tokenizer = T5Tokenizer.from_pretrained("t5-small") 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
c) Tinh chỉnh lặp đi lặp lại
Chúng tôi có thể triển khai quy trình sàng lọc lặp đi lặp lại trong đó tác nhân có thể đặt các câu hỏi tiếp theo để làm rõ hoặc mở rộng truy xuất ban đầu:
def iterative_retrieval(initial_query, max_iterations=3): query = initial_query for _ in range(max_iterations): result = qa.run(query) clarification = agent.run(f"Based on this result: '{result}', what follow-up question should I ask to get more specific information?") if clarification.lower().strip() == "none": break query = clarification return result # Use this in your agent's process
Triển khai hệ thống đa tác nhân
Để xử lý các tác vụ phức tạp hơn, chúng ta có thể triển khai một hệ thống đa tác nhân, trong đó mỗi tác nhân chuyên về một lĩnh vực riêng. Dưới đây là một ví dụ đơn giản:
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) def run(self, query): return self.agent.run(query) # Create specialist agents research_agent = SpecialistAgent("Research", [Tool(name="RAG-QA", func=qa.run, description="For AI and ML questions")]) math_agent = SpecialistAgent("Math", [Tool(name="Calculator", func=calculator._run, description="For calculations")]) general_agent = SpecialistAgent("General", [Tool(name="Search", func=search.run, description="For general queries")]) class Coordinator: def __init__(self, agents): self.agents = agents def run(self, query): # Determine which agent to use 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) coordinator = Coordinator({'Research': research_agent, 'Math': math_agent, 'General': general_agent}) # Test the multi-agent system result = coordinator.run("What's the difference between CNN and RNN? Also, calculate 25% of 120.") print(result)
Hệ thống đa tác nhân này cho phép chuyên môn hóa và có thể xử lý nhiều truy vấn hiệu quả hơn.
Đánh giá và tối ưu hóa các tác nhân RAG
Để đảm bảo tác nhân RAG của chúng tôi hoạt động tốt, chúng tôi cần triển khai các số liệu đánh giá và kỹ thuật tối ưu hóa:
a) Đánh giá sự liên quan
Chúng tôi có thể sử dụng các số liệu như BLEU, ROUGE hoặc BERTScore để đánh giá mức độ liên quan của các tài liệu được truy xuất:
from bert_score import score def evaluate_relevance(query, retrieved_doc, generated_answer): P, R, F1 = score([generated_answer], [retrieved_doc], lang="en") return F1.mean().item()
b) Đánh giá chất lượng câu trả lời
Chúng tôi có thể sử dụng đánh giá của con người hoặc số liệu tự động để đánh giá chất lượng câu trả lời:
from nltk.translate.bleu_score import sentence_bleu def evaluate_answer_quality(reference_answer, generated_answer): return sentence_bleu([reference_answer.split()], generated_answer.split()) # Use this to evaluate your agent's responses
Định hướng và thách thức trong tương lai
Khi chúng tôi nhìn về tương lai của các đặc vụ RAG, một số hướng đi và thách thức thú vị sẽ xuất hiện:
a) RAG đa phương thức: Mở rộng RAG để kết hợp dữ liệu hình ảnh, âm thanh và video.
b) RAG liên kết: Triển khai RAG trên các cơ sở kiến thức được phân phối và bảo vệ quyền riêng tư.
c) Học liên tục: Phát triển các phương pháp để đại lý RAG cập nhật cơ sở kiến thức và mô hình theo thời gian.
d) Những cân nhắc về đạo đức: Giải quyết sự thiên vị, công bằng và minh bạch trong hệ thống RAG.
e) khả năng mở rộng: Tối ưu hóa RAG cho các ứng dụng thời gian thực, quy mô lớn.
Kết luận
Việc xây dựng các tác nhân LLM cho RAG từ đầu là một quá trình phức tạp nhưng bổ ích. Chúng tôi đã tìm hiểu những kiến thức cơ bản về RAG, triển khai một hệ thống đơn giản, tạo ra một tác nhân LLM, cải tiến nó bằng các kỹ thuật tiên tiến, khám phá các hệ thống đa tác nhân và thảo luận về các chiến lược đánh giá và tối ưu hóa.