AGI và AI tương lai

Xây dựng Trình đại lý LLM cho RAG từ đầu và hơn thế nữa: Hướng dẫn toàn diện

mm
Thêm Unite.AI vào các nguồn ưu tiên của bạn trên Google

LLM như GPT-3, GPT-4 và các đối tác mã nguồn mở của chúng thường gặp khó khăn trong việc thu thập thông tin cập nhật và đôi khi tạo ra ảo giác hoặc thông tin không chính xác.

Sinh sản tăng cường thu thập (RAG) là một kỹ thuật kết hợp sức mạnh của LLM với thu thập thông tin bên ngoài. RAG cho phép chúng tôi dựa trên phản hồi LLM vào 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 được tạo bởi AI.

Trong bài đăng trên blog này, chúng tôi sẽ khám phá cách xây dựng trình đại lý LLM cho RAG từ đầu,深入 vào kiến trúc, chi tiết thực hiện và các kỹ thuật tiên tiến. Chúng tôi sẽ bao gồm mọi thứ từ cơ bản của RAG đến tạo ra các trình đại lý tinh vi có khả năng lý luận phức tạp và thực hiện nhiệm vụ.

Trước khi chúng tôi xây dựng trình đại lý LLM của mình, hãy hiểu RAG là gì và tại sao nó lại quan trọng.

RAG, hoặc Sinh sản tăng cường thu thập, là một phương pháp kết hợp thu thập thông tin với tạo văn bản. Trong một hệ thống RAG:

  • Một truy vấn được sử dụng để thu thập tài liệu liên quan từ cơ sở kiến thức.
  • Các 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 thu thập được.
RAG

RAG

Phương pháp này có một số lợi thế:

  • Độ chính xác được cải thiện: Bằng cách dựa trên phản hồi vào thông tin thu thập được, RAG giảm ảo giác và cải thiện độ chính xác thực tế.
  • Thông tin cập nhật: Cơ sở kiến 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 niềm tin và cho phép kiểm tra thực tế.

Hiểu về Trình đại lý LLM

 

Khi bạn gặp phải một vấn đề không có câu trả lời đơn giản, bạn thường cần thực hiện một số bước, suy nghĩ cẩn thận và nhớ những gì bạn đã thử. Trình đại lý LLM được thiết kế cho chính xác những tình huống như vậy trong các ứng dụng mô hình ngôn ngữ. Chúng kết hợp phân tích dữ liệu toàn diện, lập kế hoạch chiến lược, thu thập 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.

Trình đại lý LLM là gì?

Trình đại lý LLM là các hệ thống AI tiên tiến được thiết kế để tạo ra văn bản phức tạp đòi hỏi lý luận tuần tự. Chúng có thể suy nghĩ trước, nhớ lại các cuộc trò chuyện trong quá khứ và sử dụng các công cụ khác nhau để điều chỉnh phản hồi của chúng dựa trên tình huống và phong cách cần thiết.

Xét một câu hỏi trong lĩnh vực pháp lý như: “Những kết quả pháp lý tiềm năng của một loại vi phạm hợp đồng cụ thể ở California là gì?” Một LLM cơ bản với hệ thống RAG có thể thu thập thông tin cần thiết từ cơ sở dữ liệu pháp lý.

Đối với một kịch bản chi tiết hơn: “Ánh sáng của các luật bảo vệ dữ liệu mới, những thách thức pháp lý chung mà các công ty phải đối mặt là gì và các 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 không chỉ là tìm kiếm thông tin. Nó là về việc hiểu các quy tắc mới, tác động của chúng đối với các công ty khác nhau và phản ứng của tòa án. Một trình đại lý LLM sẽ chia nhiệm vụ này thành các nhiệm vụ con, chẳng hạn như thu thập các luật mới nhất, phân tích các vụ án lịch sử, tóm tắt tài liệu pháp lý và dự đoán xu hướng dựa trên mẫu.

Các thành phần của Trình đại lý LLM

Trình đại lý LLM thường bao gồm bốn thành phần:

  1. Trình đại lý/ Não bộ: Mô hình ngôn ngữ cốt lõi xử lý và hiểu ngôn ngữ.
  2. Lập kế hoạch: Khả năng suy nghĩ, chia nhỏ nhiệm vụ và phát triển kế hoạch cụ thể.
  3. Bộ nhớ: Giữ lại hồ sơ của các tương tác trong quá khứ và học hỏi từ chúng.
  4. Sử dụng công cụ: Tích hợp các tài nguyên khác nhau để thực hiện nhiệm vụ.

Trình đại lý/ Não bộ

Ở trung tâm của một trình đại lý LLM là một mô hình ngôn ngữ xử lý và hiểu ngôn ngữ dựa trên lượng dữ liệu lớn mà nó đã được đào tạo. Bạn bắt đầu bằng cách đưa cho nó một lời nhắc cụ thể, hướng dẫn trình đại lý cách phản hồi, công cụ nào để sử dụng và mục tiêu để nhắm tới. Bạn có thể tùy chỉnh trình đại lý với một nhân vật phù hợp cho các nhiệm vụ hoặc tương tác cụ thể, tăng cường hiệu suất của nó.

Bộ nhớ

Thành phần bộ nhớ giúp trình đại lý LLM xử lý các nhiệm vụ phức tạp bằng cách giữ lại hồ sơ của 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 như một cuốn sổ tay, theo dõi các cuộc thảo luận đang diễn ra.
  • Bộ nhớ dài hạn: Hoạt động như một nhật ký, lưu trữ thông tin từ các tương tác trong quá khứ để học hỏi mẫu 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, trình đại lý có thể cung cấp phản hồi được tùy chỉnh hơn và nhớ lại sở thích người dùng theo thời gian, tạo ra tương tác liên quan và phù hợp hơn.

Lập kế hoạch

Lập kế hoạch cho phép trình đại lý LLM suy nghĩ, chia nhỏ nhiệm vụ thành các phần có thể quản lý 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:

  • Thành lập kế hoạch: Chia nhỏ một nhiệm vụ thành các nhiệm vụ con.
  • Phản ánh kế hoạch: Xem xét và đánh giá hiệu quả của kế hoạch, kết hợp phản hồi để tinh chỉnh chiến lược.

Các phương pháp như Chain of Thought (CoT) và Tree of Thought (ToT) giúp trong quá trình phân chia này, cho phép trình đại lý khám phá các đường dẫn khác nhau để giải quyết một vấn đề.

Để tìm hiểu thêm về thế giới của các trình đại lý AI, bao gồm cả khả năng và tiềm năng hiện tại của chúng, hãy xem “Auto-GPT & GPT-Engineer: Hướng dẫn sâu về các trình đại lý AI hàng đầu hiện nay”

Thiết lập Môi trường

Để xây dựng trình đại lý RAG của chúng tôi, chúng tôi sẽ cần thiết lập môi trường phát triển của mình. Chúng tôi sẽ sử dụng Python và một số thư viện chính:

  • LangChain: Để điều phối các thành phần LLM và thu thập của chúng tôi
  • Chroma: Là kho vectơ của chúng tôi cho các bản nhúng tài liệu
  • Mô hình GPT của OpenAI: Là LLM cơ bản của chúng tôi (bạn có thể thay thế nó bằng mô hình mã nguồn mở nếu muốn)
  • FastAPI: Để tạo một API đơn giản để tương tác với trình đại lý của chúng tôi

Hãy bắt đầu bằng cách thiết lập môi trường của chúng tôi:


<p># Tạo một môi trường ảo mới
python -m venv rag_agent_env
source rag_agent_env/bin/activate # Trên Windows, sử dụng `rag_agent_env\Scripts\activate`</p>

<p># Cài đặt các gói yêu cầu
pip install langchain chromadb openai fastapi uvicorn

Giờ đây, 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:


<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># Thiết lập khóa API OpenAI của bạn
os.environ[&quot;OPENAI_API_KEY&quot;] = &quot;khóa-api-của-bạn&quot;</p>

Xây dựng Hệ thống RAG Đơn giản

Giờ đây chúng tôi đã thiết lập môi trường của mình, hãy xây dựng một hệ thống RAG cơ bản. Chúng tôi 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 nó để trả lời các truy vấn.

Bước 1: Chuẩn bị Tài liệu

Trước tiên, chúng tôi cần tải và chuẩn bị tài liệu của mình. Đối với ví dụ này, hãy giả sử chúng tôi có một tệp văn bản có tên là knowledge_base.txt với một số thông tin về AI và học máy.


<p># Tải tài liệu
loader = TextLoader(&quot;knowledge_base.txt&quot;)
documents = loader.load()</p>

<p># Chia tài liệu thành các phần
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)</p>

<p># Tạo các bản nhúng
embeddings = OpenAIEmbeddings()</p>

<p># Tạo một kho vectơ
vectorstore = Chroma.from_documents(texts, embeddings)</p>

Bước 2: Tạo Chuỗi QA Dựa trên Thu thập

Giờ đây chúng tôi đã có kho vectơ của mình, chúng tôi có thể tạo một chuỗi QA dựa trên thu thập:


<p># Tạo một chuỗi QA dựa trên thu thập
qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type=&quot;stuff&quot;, retriever=vectorstore.as_retriever())</p>

Bước 3: Truy vấn Hệ thống

Chúng tôi có thể truy vấn hệ thống RAG của mình:


<p>query = &quot;Những ứng dụng chính của học máy là gì?&quot;
result = qa.run(query)
print(result)

Bước 4: Tạo Trình đại lý LLM

Mặc dù hệ thống RAG đơn giản của chúng tôi hữu ích, nhưng nó khá hạn chế. Hãy nâng cao nó bằng cách tạo một trình đại lý LLM có thể thực hiện các nhiệm vụ phức tạp hơn và suy nghĩ về thông tin nó thu thập.

Một trình đại lý 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ề các hành động nào để thực hiện. Chúng tôi sẽ tạo một trình đại lý có thể không chỉ 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.

Trước tiên, hãy định nghĩa một số công cụ cho trình đại lý của chúng tôi:


<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># Định nghĩa một công cụ máy tính
class CalculatorTool(BaseTool):
name = &quot;Máy tính&quot;
description = &quot;Có ích khi bạn cần trả lời câu hỏi về toán học&quot;</p>

<p>def _run(self, query: str)
try:
return str(eval(query))
except:
return &quot;Tôi không thể tính toán điều đó. Hãy đảm bảo đầu vào của bạn là một biểu thức toán học hợp lệ.&quot;</p>

<p># Tạo các thể hiện công cụ
search = DuckDuckGoSearchRun()
calculator = CalculatorTool()</p>

<p># Định nghĩa các công cụ
tools = [Tool(name=&quot;Tìm kiếm&quot;, func=search.run, description=&quot;Có ích khi bạn cần trả lời câu hỏi về các sự kiện hiện tại&quot;),
Tool(name=&quot;RAG-QA&quot;, func=qa.run, description=&quot;Có ích khi bạn cần trả lời câu hỏi về AI và học máy&quot;),
Tool(name=&quot;Máy tính&quot;, func=calculator._run, description=&quot;Có ích khi bạn cần thực hiện các phép tính toán học&quot;)
]</p>

<p># Khởi tạo trình đại lý
agent = initialize_agent(tools, OpenAI(temperature=0), agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True
)</p>

Giờ đây chúng tôi đã có một trình đại lý có thể sử dụng hệ thống RAG của chúng tôi, thực hiện tìm kiếm trên web và thực hiện các phép tính. Hãy thử nghiệm nó:


<p>result = agent.run(&quot;Sự khác biệt giữa học máy giám sát và không giám sát là gì? Ngoài ra, 15% của 80 là gì?&quot;)
print(result)</p>

Trình đại lý này thể hiện một lợi thế chính của trình đại lý LLM: chúng có thể kết hợp nhiều công cụ và các bước suy nghĩ để trả lời các truy vấn phức tạp.

Nâng cao Trình đại lý với Các Kỹ thuật RAG Tiên tiến

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 tiên tiến 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 Nghĩa với Dense Passage Retrieval (DPR)

Thay vì sử dụng thu thập dựa trên bản nhúng đơn giản, chúng tôi có thể thực hiện DPR để tìm kiếm nghĩa chính xác hơn:


<p>from transformers import DPRQuestionEncoder, DPRContextEncoder</p>

<p>question_encoder = DPRQuestionEncoder.from_pretrained(&quot;facebook/dpr-question_encoder-single-nq-base&quot;)
context_encoder = DPRContextEncoder.from_pretrained(&quot;facebook/dpr-ctx_encoder-single-nq-base&quot;)</p>

<p># Hàm để mã hóa đoạn văn
def encode_passages(passages):
return context_encoder(passages, max_length=512, return_tensors=&quot;pt&quot;).pooler_output</p>

<p># Hàm để mã hóa truy vấn
def encode_query(query):
return question_encoder(query, max_length=512, return_tensors=&quot;pt&quot;).pooler_output</p>

b) Mở rộng Truy vấn

Chúng tôi có thể sử dụng mở rộng truy vấn để cải thiện hiệu suất thu thập:


<p>from transformers import T5ForConditionalGeneration, T5Tokenizer</p>

<p>model = T5ForConditionalGeneration.from_pretrained(&quot;t5-small&quot;)
tokenizer = T5Tokenizer.from_pretrained(&quot;t5-small&quot;)</p>

<p>def expand_query(query):
input_text = f&quot;mở rộng truy vấn: {query}&quot;
input_ids = tokenizer.encode(input_text, return_tensors=&quot;pt&quot;)
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) Tinh chỉnh Lặp lại

Chúng tôi có thể thực hiện một quá trình tinh chỉnh lặp lại trong đó trình đại lý có thể đặt các câu hỏi tiếp theo để làm rõ hoặc mở rộng truy vấn ban đầu của nó:


<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&quot;Dựa trên kết quả này: &#039;{result}&#039;, câu hỏi tiếp theo nào tôi nên hỏi để có được thông tin cụ thể hơn?&quot;)
if clarification.lower().strip() == &quot;không&quot;:
break
query = clarification
return result</p>

# Sử dụng điều này trong quá trình của trình đại lý

Triển khai Hệ thống Đa Trình đại lý

Để xử lý các nhiệm vụ phức tạp hơn, chúng tôi có thể triển khai một hệ thống đa trình đại lý trong đó các trình đại lý khác nhau chuyên về các lĩnh vực khác nhau. Dưới đây là một ví dụ đơn giản:


<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># Tạo các trình đại lý chuyên môn
research_agent = SpecialistAgent(&quot;Nghiên cứu&quot;, [Tool(name=&quot;RAG-QA&quot;, func=qa.run, description=&quot;Để trả lời câu hỏi về AI và ML&quot;)])
math_agent = SpecialistAgent(&quot;Toán học&quot;, [Tool(name=&quot;Máy tính&quot;, func=calculator._run, description=&quot;Để thực hiện các phép tính toán học&quot;)])
general_agent = SpecialistAgent(&quot;Tổng quát&quot;, [Tool(name=&quot;Tìm kiếm&quot;, func=search.run, description=&quot;Để trả lời câu hỏi chung&quot;)])</p>

<p>class Coordinator:
def __init__(self, agents):
self.agents = agents</p>

<p>def run(self, query):
# Xác định trình đại lý nào để sử dụng
if &quot;tính toán&quot; in query.lower() or any(op in query for op in [&#039;+&#039;, &#039;-&#039;, &#039;*&#039;, &#039;/&#039;]):
return self.agents[&#039;Toán học&#039;].run(query)
elif any(term in query.lower() for term in [&#039;ai&#039;, &#039;machine learning&#039;, &#039;deep learning&#039;]):
return self.agents[&#039;Nghiên cứu&#039;].run(query)
else:
return self.agents[&#039;Tổng quát&#039;].run(query)</p>

<p>coordinator = Coordinator({&#039;Nghiên cứu&#039;: research_agent, &#039;Toán học&#039;: math_agent, &#039;Tổng quát&#039;: general_agent})</p>

<p># Thử nghiệm hệ thống đa trình đại lý
result = coordinator.run(&quot;Sự khác biệt giữa CNN và RNN là gì? Ngoài ra, tính toán 25% của 120.&quot;)
print(result)</p>

Hệ thống đa trình đại lý này cho phép chuyên môn hóa và có thể xử lý một loạt các truy vấn phức tạp hơn.

Đánh giá và Tối ưu hóa Trình đại lý RAG

Để đảm bảo trình đại lý RAG của chúng tôi hoạt động tốt, chúng tôi cần triển khai các chỉ số đánh giá và các kỹ thuật tối ưu hóa:

a) Đánh giá Liên quan

Chúng tôi có thể sử dụng các chỉ số như BLEU, ROUGE hoặc BERTScore để đánh giá sự liên quan của các tài liệu thu thập được:


from bert_score import score

<p>def evaluate_relevance(query, retrieved_doc, generated_answer):
P, R, F1 = score([generated_answer], [retrieved_doc], lang=&quot;en&quot;)
return F1.mean().item()</p>

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 các chỉ số tự động để đánh giá chất lượng câu trả lời:


<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># Sử dụng điều này để đánh giá phản hồi của trình đại lý

Hướng Tiếp theo và Thách thức

Khi chúng tôi nhìn vào tương lai của trình đại lý RAG, một số hướng tiếp theo và thách thức thú vị xuất hiện:

a) RAG Đa phương tiện: Mở rộng RAG để kết hợp dữ liệu hình ảnh, âm thanh và video.

b) RAG Liên bang: Triển khai RAG trên các cơ sở kiến thức phân tán, bảo mật.

c) Học Liên tục: Phát triển các phương pháp để trình đại lý RAG cập nhật cơ sở kiến thức và mô hình của chúng theo thời gian.

d) Xem xét Đạo đức: Giải quyết các vấn đề về thiên vị, công bằng và minh bạch trong các hệ thống RAG.

e) Tính khả dụng: Tối ưu hóa RAG cho các ứng dụng quy mô lớn, thời gian thực.

Kết luận

Xây dựng trình đại lý LLM cho RAG từ đầu là một quá trình phức tạp nhưng thú vị. Chúng tôi đã bao gồm các nguyên tắc cơ bản của RAG, triển khai một hệ thống đơn giản, tạo một trình đại lý LLM, nâng cao nó với các kỹ thuật tiên tiến, khám phá các hệ thống đa trình đại lý và thảo luận về các chiến lược đánh giá và tối ưu hóa.

Tôi đã dành 5 năm qua để đắm mình trong thế giới hấp dẫn của Máy học và Học sâu. Đam mê và chuyên môn của tôi đã dẫn tôi đến việc đóng góp vào hơn 50 dự án kỹ thuật phần mềm đa dạng, với sự tập trung đặc biệt vào AI/ML. Sự tò mò liên tục của tôi cũng đã thu hút tôi đến với Xử lý Ngôn ngữ Tự nhiên, một lĩnh vực tôi渴望 khám phá thêm.