Hệ thống RAG và TxtAi Phần 1: Biến đổi Sinh sản Ngôn ngữ với Trí tuệ

Đối với phần đầu tiên của loạt bài viết này, chúng ta sẽ dựa vào hướng dẫn để triển khai quá trình RAG. Vậy RAG là gì? RAG, hay "Retrieval-Augmented Generation" (Tạo Sinh Sản Mở Rộng Tìm Kiếm), là một kỹ thuật tiên tiến trong trí tuệ nhân tạo, cụ thể là trong lĩnh vực xử lý ngôn ngữ tự nhiên (NLP), bao gồm việc làm giàu quá trình sinh sản văn bản bằng cách kết hợp một giai đoạn tìm kiếm thông tin. Phương pháp kết hợp này tích hợp sức mạnh của mô hình ngôn ngữ dựa trên deep learning với hiệu quả của hệ thống tìm kiếm thông tin nhằm tạo ra những phản hồi chính xác hơn và phù hợp với ngữ cảnh.

Thông qua bài viết này, chúng ta sẽ khám phá cách RAGs chuyển đổi phương pháp tiếp cận truyền thống đối với sinh sản ngôn ngữ bằng cách tích hợp các yếu tố động của tìm kiếm thông tin. Chúng ta sẽ xem xét các thành phần chính của công nghệ này, bao gồm cách mô hình nhận diện và trích xuất thông tin liên quan từ một cơ sở dữ liệu lớn hoặc kho văn bản trước khi bắt đầu quá trình sinh sản phản hồi. Điều này cho phép mô hình dựa không chỉ vào học hỏi nội tại mà còn vào dữ liệu bên ngoài cụ thể, đặc biệt là lợi ích cho những câu hỏi yêu cầu kiến thức cập nhật hoặc chuyên môn.

Hơn nữa, chúng ta sẽ thảo luận về những thách thức và cơ hội liên quan đến việc triển khai RAGs, nhấn mạnh tiềm năng của họ trong nhiều lĩnh vực ứng dụng, từ trợ lý ảo đến hệ thống đề xuất cá nhân hóa. Cuối cùng, chúng ta sẽ mô tả cách thiết lập một hệ thống RAG sử dụng công nghệ và công cụ tiên tiến, bằng cách cung cấp một hướng dẫn từng bước dựa trên hướng dẫn chính thức của công cụ Txtai. Cho dù bạn là một nhà phát triển giàu kinh nghiệm về PHP và khoa học dữ liệu hay chỉ đơn giản là tò mò để khám phá những tiến bộ mới nhất trong AI, bài viết này nhằm cung cấp một hiểu biết sâu sắc về công nghệ RAG và ảnh hưởng của nó đối với tương lai của xử lý ngôn ngữ tự nhiên.

Các Thành Phần Chính của Hệ thống RAG

RAGs, với bản chất kết hợp của mình, tích hợp hai thành phần thiết yếu: hệ thống truy xuất thông tin (Information Retrieval, IR) và mô hình sinh sản ngôn ngữ (Language Generation Model).

Hệ thống Truy xuất Thông tin: Giai đoạn đầu tiên của một RAG là tìm kiếm và truy xuất thông tin liên quan phản hồi cho một truy vấn. Giai đoạn này sử dụng các kỹ thuật tìm kiếm tiên tiến để quét nhanh các tập dữ liệu lớn, chọn lọc các đoạn văn bản có khả năng liên quan nhất đến câu hỏi được đặt ra.

Mô hình Sinh sản Ngôn ngữ: Một khi thông tin liên quan được truy xuất, nó được đưa vào một mô hình sinh sản ngôn ngữ. Mô hình này, thường dựa trên kiến trúc mạng nơ-ron như Transformers, sử dụng thông tin này để xây dựng một phản hồi hợp nhất và phù hợp với ngữ cảnh.

Thách thức và Cơ hội

RAGs đặt ra một số thách thức kỹ thuật và thực tiễn. Chẳng hạn, độ chính xác của quá trình truy xuất thông tin là rất quan trọng; việc truy xuất không chính xác có thể dẫn đến những phản hồi sai lầm. Ngoài ra, việc cân bằng tốc độ xử lý và độ chính xác là một điều cần xem xét, đặc biệt là cho các ứng dụng thời gian thực.

Tuy nhiên, những cơ hội do RAGs mang lại là đáng kể. Trong hỗ trợ khách hàng, ví dụ, RAGs có thể cung cấp câu trả lời chính xác và cá nhân hóa hơn so với các hệ thống sinh sản ngôn ngữ truyền thống. Trong nghiên cứu khoa học, chúng có thể giúp định hình những phản hồi dựa trên những công bố và khám phá mới nhất.

Triển khai Thực Tiễn của một RAG

Để triển khai một RAG, cần thực hiện một số bước:

Lựa chọn Công nghệ: Các mô hình biến đổi như BERT hoặc GPT có thể được sử dụng cho mô hình tạo, trong khi các hệ thống như Elasticsearch có thể được sử dụng cho việc truy xuất thông tin. Ở đây, chúng ta sẽ sử dụng MistralAI và hệ thống nội bộ của txtai. Chúng ta sẽ sau đó xem cách tích hợp các chỉ mục trực tiếp vào cơ sở dữ liệu PostgreSQL.

Chuẩn bị Dữ liệu: Chuẩn bị một kho dữ liệu lớn và đa dạng cho giai đoạn truy xuất. Kho dữ liệu này nên đại diện cho các loại truy vấn dự kiến. Để làm điều này, chúng ta sẽ truy xuất các trang nội dung của blog này.

Đào tạo và Tinh chỉnh:

Hãy huấn luyện mô hình sinh ngôn ngữ của bạn bằng cách sử dụng cả bộ dữ liệu và thông tin đã thu thập được. Có thể sẽ cần tinh chỉnh để thích nghi mô hình với các trường hợp sử dụng cụ thể.

Tích hợp và Kiểm thử: Tích hợp hệ thống RAG vào ứng dụng hoặc dịch vụ của bạn và thực hiện kiểm thử kỹ lưỡng để đánh giá hiệu suất và độ chính xác của nó.

Kết luận

"Retrieval-Augmented Generation" là một bước tiến thú vị trong lĩnh vực AI, mở ra những hướng mới cho các ứng dụng xử lý ngôn ngữ tự nhiên phức tạp và chính xác hơn. Mặc dù nó đặt ra thách thức, nhưng tiềm năng của nó trong các lĩnh vực khác nhau khiến nó trở nên vô giá đối với các doanh nghiệp và nhà phát triển muốn tận dụng những đổi mới AI mới nhất. Bằng cách theo dõi các bước và nguyên tắc được đề cập trong bài viết này, các nhà phát triển PHP và chuyên gia khoa học dữ liệu có thể bắt đầu khám phá thế giới thú vị của RAG để nâng cao khả năng xử lý ngôn ngữ tự nhiên của các ứng dụng của họ.

Lời của tác giả: Đừng tự. lừa mình nữa. Phần đầu của bài viết này được viết với sự trợ giúp của trí tuệ nhân tạo. Phải thừa nhận rằng nó đã làm rất tốt. Có vẻ rõ ràng là một trí tuệ nhân tạo đã được đào tạo với các khái niệm của chính nó. Điều này đã làm cho bài tập viết trở nên rất thú vị. Vai trò của tôi chỉ đơn giản là "chỉ đường" một cách tương tác để có được thông tin rõ ràng nhất có thể. Bây giờ, sau khi đã có một đoạn giới thiệu lý thuyết, chúng ta có thể dễ dàng tiến tới phần thực hành hơn.

Trước hết, công nghệ được chọn cho bài viết đầu tiên này là TxtAi. Tại sao? Vâng, bởi vì nó được tạo ra cho điều đó. Và một khi bạn hiểu cách nó hoạt động, bạn sẽ nhận ra rằng nó đại diện cho một khoản tiết kiệm thời gian đáng kể. Xem xét rằng sẽ có dữ liệu để chuẩn bị, cơ sở hạ tầng để thiết lập, và các khía cạnh kỹ thuật khác, nếu chúng ta có thể tiết kiệm thời gian trong quá trình phát triển, nó luôn là thời gian đạt được cho khách hàng cuối cùng. Bạn sẽ thấy rằng mọi thứ không chỉ được thực hiện trong ba cú nhấp chuột. Bạn cần dữ liệu, và đó cuối cùng là nơi mà bạn sẽ mất nhiều thời gian nhất.

Chúng ta hãy tiến tới phần mã nguồn. Chúng ta giả định rằng bạn đã hoàn thành bước cài đặt Llama.cpp. Bạn có một tài khoản trên Huggingface với một token và môi trường Python của bạn đã hoạt động. Chúng ta bắt đầu bằng cách cài đặt các phụ thuộc nhỏ của mình:

pipenv shell
pipenv install txtai[pipeline] autoawq install nltk['punkt']
pipenv install  install git+https://github.com/abetlen/llama-cpp-python.git
pip install hf-transfer

Chúng ta sẽ cần một mô hình, và chúng ta đã chọn TheBloke/Mistral-7B-OpenOrca-GGUF. Bạn sẽ thấy rằng Llm từ MistralAi rất ấn tượng khi viết nội dung. Tùy thuộc vào phần cứng của bạn, hãy sử dụng phiên bản nhẹ hơn của mô hình: https://huggingface.co/TheBloke/Mistral-7B-OpenOrca-GGUF/tree/main

huggingface-cli download TheBloke/Mistral-7B-OpenOrca-GGUF mistral-7b-openorca.Q8_0.gguf --local-dir /Data/Projets/Llm/Models/MistralAi-OpenOrqa/mistral-7b-openorca.Q8_0.gguf --cache-dir /Data/Projets/Llm/Models/huggingface_cache/

export HF_HUB_ENABLE_HF_TRANSFER=1 &&  huggingface-cli download TheBloke/Mistral-7B-OpenOrca-GGUF mistral-7b-openorca.Q2_K.gguf --local-dir /Data/Projets/Llm/Models/MistralAi-OpenOrqa/mistral-7b-openorca.Q2_K.gguf --cache-dir /Data/Projets/Llm/Models/huggingface_cache/

Lợi thế của kho lưu trữ này là tệp định dạng gguf đã được chuẩn bị sẵn cho chúng ta, vì vậy chúng ta có thể sử dụng nó trực tiếp với llama.cppTxtAi. Do đó, không cần GPU. Một lần nữa, ý tưởng là để minh họa cách nó hoạt động và để hình dung việc sử dụng thiết bị dành cho mục đích này.

untranslated

Chúng tôi sẽ cần vật liệu để thực hiện việc trích xuất dữ liệu. Cảm ơn neuml đã cung cấp cho chúng tôi các tệp mẫu. Tải xuống tài liệu từ địa chỉ này, hoặc sử dụng một trong những tệp của bạn bằng cách điều chỉnh mã sau.

from llama_cpp import Llama
from txtai.pipeline import Textractor
import nltk
# Création de notre connection à Llama.cpp avec ces parrametres par defauts.
llm = Llama(
    model_path="/Data/Projets/Llm/Models/MistralAi-OpenOrqa/mistral-7b-openorca.Q8_0.gguf/mistral-7b-openorca.Q8_0.gguf", n_ctx=2048)
# On récupere le texte de notre fichier docx.
textractor = Textractor()
text = textractor("datas/tuto1/document.docx")


# execution de notre appel au modèle.
def execute(question, context):
    # on crée un prompt de démarrage
    prompt = f"""<|im_start|>system You are a friendly assistant. You answer questions from users.<|im_end|> 
    <|im_start|>user Answer the following question using only the context below. Only include information 
    specifically discussed or general AI and LLMs related subject. 
  question: {question}
  context: {context} <|im_end|>
  <|im_start|>assistant
  """

    tokens = nltk.word_tokenize(text)
    print(len(tokens))
    return llm(prompt,
               temperature=0.1,
               max_tokens=10000,
               top_p=0.2,
               top_k=10,
               repeat_penalty=1.2)

# on lance notre methode avec une question mais aussi un contexte tiré de notre fichier docx.
result = execute("Write a long article about TxtAi explaining how it works. You can show code example. Explain how it could solve problem in small and larger company. Make the accurate answer you can do. Make an intro and a conclusion. This could be a general speech in a conference or a learning lesson at Partitech University. Make your answer in french", text)
print(result['choices'][0]['text'])
print(result['choices'][0]['text'])
print(result['usage'])

Đây là kết quả.

 Titre : TxtAi, la base de données d'embeddings pour les recherches sémantiques et l'orchestration des LLMs (Langage de Modèle Linguistique)

Dans cet article, nous allons expliquer comment TxtAi fonctionne en tant que base de données d'embeddings complète pour la recherche sémantique, l'orchestration des Langages de Modèles Linguistiques (LLMs) et les workflows linguistiques. Nous allons également présenter un exemple de code et montrer comment TxtAi peut résoudre des problèmes dans des entreprises de taille différente, que ce soit une petite ou grande entreprise.

TxtAi est une base de données d'embeddings conçue pour faciliter la recherche sémantique et l'orchestration des LLMs. Elle offre plusieurs fonctionnalités importantes, telles que :
1. Recherche vectorielle avec SQL, stockage objet, modélisation du sujet ;
2. Créer des embeddings pour le texte, les documents, la audio et l'image;
3. Pipelines alimentés par des LLMs qui exécutent des prompts de LLM;
4. Workflows permettant de joindre plusieurs pipelines ensemble et d'aggreguer des logiques métier ;
5. Construire avec Python ou YAML, avec des bindings API disponibles pour JavaScript, Java, Rust et Go.

Pour illustrer comment TxtAi fonctionne, voici un exemple de code en Python :


***python
from txtai import TextSearch, DocumentEmbeddings, ImageEmbeddings, Pipeline, Workflow

# Création d'un pipeline avec une LLM
llm_pipeline = Pipeline(model="gpt-3")

# Créer des embeddings pour le texte et l'image
text_embeddings = DocumentEmbeddings("documents.txt", model="all-MiniLM-L6-v2")
image_embeddings = ImageEmbeddings("images/*.jpg", model="BLIP")

# Créer une recherche vectorielle avec SQL et stockage objet
text_search = TextSearch(sql_query="SELECT * FROM documents WHERE similarity > 0.8", storage="object-store")

# Construire un workflow pour joindre les pipelines ensemble
workflow = Workflow([llm_pipeline, text_search, text_embeddings, image_embeddings])

# Exécutez le workflow et affichez les résultats
results = workflow.run()
print(results)
*** 
Ce code montre comment créer un pipeline avec une LLM, générer des embeddings pour du texte et des images, puis construire un workflow qui utilise ces pipelines pour effectuer une recherche vectorielle sur la base de données.

En ce qui concerne l'impact dans les entreprises, TxtAi peut aider à résoudre divers problèmes en améliorant la recherche sémantique et en facilitant le travail des LLMs. Pour une petite entreprise, cela signifie que les employés peuvent accélérer leurs processus de recherche grâce à l'utilisation d'embeddings pour indexer rapidement leur contenu. Dans un contexte plus grand, TxtAi peut aider à améliorer la performance des systèmes de recommandation et à simplifier le développement de workflows linguistiques complexes.

En conclusion, TxtAi est une base d'embeddings complète qui facilite la recherche sémantique et l'orchestration des LLMs pour les entreprises de toutes tailles. Grâce à ses fonctionnalités avancées en matière de vectorisation, de modélisation du sujet et de workflows linguistiques, TxtAi peut améliorer considérablement la productivité et l'efficacité des organisations dans divers domaines.

Lưu ý rằng đầu ra là trực tiếp ở định dạng Markdown. Tôi đã thay đổi dấu đánh dấu mã, nếu không nó sẽ không dễ đọc lắm.

Chúng ta hãy chuyển sang phần giải thích bổ sung về các tham số được sử dụng trong lời gọi của chúng ta:

Đầu tiên, đoạn nhắc. Làm thế nào chúng ta định nghĩa đoạn nhắc mà chúng ta gửi tới mô hình? Không có phép thuật ở đây. Bạn sẽ cần phải trực tiếp đến tài liệu của mô hình. Tại đây, trên HuggingFace: https://huggingface.co/TheBloke/Mistral-7B-OpenOrca-GGUF

Như bạn có thể thấy, đoạn nhắc mong đợi rõ ràng: nó yêu cầu các khu vực <|im_start|>system <|im_start|>user và một khu vực<|im_start|> để dành không gian cho mô hình trả lời bạn. Mẹo ở đây là định nghĩa một bối cảnh trong lời nhắc. Điều quan trọng cần hiểu là không gian dành cho lời nhắc phải được định sẵn.

n_ctx=2048 = Số lượng token được phân bổ cho bối cảnh. Điều này được quy định trong tài liệu trên Huggingface. Làm thế nào để xác định số lượng token? Việc tính toán số lượng token phụ thuộc vào phương pháp mã hóa token được sử dụng. Mã hóa token là quá trình phân tách văn bản thành các token. Dưới đây là một số bước chung để tính toán số lượng token:

import nltk
nltk.download('punkt')  # Assurez-vous d'avoir le package 'punkt' téléchargé pour la tokenisation
text = "Votre texte ici."
tokens = nltk.word_tokenize(text)
number_of_tokens = len(tokens)

Trong ví dụ của chúng tôi, số lượng token của lời nhắc được tính là 264. Số lượng token trả lại trong phản hồi là 3182. Thực tế, mô hình trả lại cho chúng tôi thông tin sau:

{'prompt_tokens': 552, 'completion_tokens': 938, 'total_tokens': 1490}

Điều này khiến việc dự đoán số lượng token trở nên phức tạp hơn một chút.

temperature=0.1

Temperature điều khiển mức độ ngẫu nhiên trong việc chọn từ hoặc cụm từ. Nó ảnh hưởng đến các xác suất liên quan đến mỗi lựa chọn có thể có trong quá trình tạo văn bản.

  • Ở mức temperature thấp (gần 0), mô hình có xu hướng chọn những từ có khả năng xuất hiện cao nhất, dẫn đến việc tạo ra văn bản dễ dự đoán và mạch lạc hơn. Tuy nhiên, điều này cũng có thể làm cho văn bản được tạo ra ít đa dạng và đôi khi lặp lại.
  • Ở mức temperature cao, mô hình mạo hiểm hơn trong việc chọn những từ ít có khả năng xuất hiện. Điều này có thể dẫn đến việc tạo ra văn bản sáng tạo, độc đáo hoặc bất ngờ hơn, nhưng đôi khi cũng kém mạch lạc hoặc liên quan. Trong mô hình tạo văn bản, temperature đóng vai trò như một điều chỉnh giữa sự mạch lạc và sự sáng tạo. Việc điều chỉnh cẩn thận temperature có thể ảnh hưởng lớn đến chất lượng và phong cách của văn bản được tạo ra.

max_tokens=10000

Tham số max_tokens được sử dụng trong các mô hình xử lý ngôn ngữ tự nhiên (NLP), như MistralAI và các mô hình dựa trên mạng nơ-ron khác. Nó đóng vai trò quan trọng trong việc xác định chiều dài của đầu ra được tạo ra bởi mô hình. Dưới đây là một số chi tiết quan trọng:

  • max_tokens chỉ định số lượng tối đa các token (từ, dấu câu, ký hiệu, v.v.) mà mô hình có thể tạo ra hoặc xử lý một lúc. Một "token" là đơn vị nhỏ nhất của xử lý trong NLP.
  • Khi tạo văn bản, max_tokens giới hạn chiều dài của văn bản được sản xuất. Nếu mô hình đạt đến giới hạn này trong quá trình tạo ra, nó sẽ dừng việc tạo thêm văn bản.
  • Trong các nhiệm vụ hiểu hoặc phân tích văn bản, tham số này có thể giới hạn lượng văn bản được phân tích cùng một lúc.
  • Giới hạn số lượng token là quan trọng để quản lý việc sử dụng tài nguyên máy tính. Giá trị max_tokens càng cao, yêu cầu bộ nhớ và sức mạnh tính toán càng nhiều để sinh ra hoặc xử lý văn bản. Điều này đặc biệt quan trọng đối với những mô hình NLP lớn, có thể tiêu thụ nhiều tài nguyên.
  • Dành cho Sinh văn bản Ngắn gọn: Một giá trị max_tokens thấp có thể được sử dụng cho những phản hồi ngắn gọn, như trong chatbots hay hệ thống trả lời câu hỏi.
  • Dành cho Văn bản Dài hơn: Một giá trị cao hơn cần thiết cho những nhiệm vụ như tạo ra bài viết, câu chuyện, hoặc các hình thức nội dung dài hơn. Việc lựa chọn giá trị phù hợp cho max_tokens phụ thuộc vào ứng dụng cụ thể và khả năng của hệ thống mà mô hình được chạy.

Thường xuyên cần tìm một sự cân bằng giữa chất lượng và độ dài của văn bản được sinh ra, và những hạn chế về hiệu suất. Tóm lại, max_tokens là một tham số thiết yếu giúp kiểm soát độ dài của văn bản được tạo ra bởi mô hình NLP đồng thời quản lý nguồn lực máy tính cần thiết. Việc điều chỉnh phù hợp là rất quan trọng để đạt được kết quả tối ưu phù hợp với nhu cầu cụ thể của ứng dụng.

top_p=0.2

Tham số top_p, còn được biết đến với tên gọi "nucleus sampling," là một cài đặt quan trọng trong các mô hình sinh văn bản như MistralAI. Nó được sử dụng để điều khiển đa dạng và sự sáng tạo của văn bản được generat. Dưới đây là giải thích chi tiết: Khi mô hình đang tạo văn bản, nó gán một xác suất cho mỗi từ tiềm năng làm từ tiếp theo. top_p hoạt động để lọc những từ này dựa trên tổng xác suất của chúng. Thực tế, điều này có nghĩa là mô hình chỉ xem xét một tập hợp con các từ tiềm năng mà tổng xác suất của chúng đạt đến ngưỡng top_p. Điều khiển Đa dạng Văn bản:

  • Với một top_p thấp, mô hình hạn chế bản thân trong một số lượng nhỏ các lựa chọn có xác suất cao, dẫn đến văn bản dễ đoán trước và ít đa dạng hơn.
  • Với một top_p cao, mô hình xem xét nhiều lựa chọn tiềm năng hơn, từ đó tăng đa dạng và sự sáng tạo của văn bản generated, nhưng phải trả giá bằng sự mạch lạc.
  • Không giống như temperature, điều chỉnh xác suất của tất cả các lựa chọn tiềm năng, top_p chỉ đơn giản giới hạn nhóm từ được xem xét cho việc sinh văn bản dựa trên tổng xác suất của chúng.

top_p cung cấp một cách thức thay thế cho việc lấy mẫu dựa trên tham số top_k, nơi chỉ có k từ có xác suất cao nhất được xem xét, bất kể xác suất tuyệt đối của chúng ra sao.

  • Dành cho văn bản chuẩn hơn: Sử dụng một top_p thấp hơn nếu bạn muốn văn bản có tính mạch lạc và phù hợp hơn với dữ liệu huấn luyện.
  • Dành cho văn bản sáng tạo hơn: Một top_p cao hơn phù hợp cho các nhiệm vụ cần sáng tạo hoặc tính nguyên bản, như sáng tác văn học hoặc sinh ra những khái niệm độc đáo.

Giá trị của top_p thường là một số thực từ 0 đến 1. Việc chọn lựa giá trị phù hợp cho top_p phụ thuộc vào loại văn bản bạn muốn tạo ra và sự cân bằng mong muốn giữa sự sáng tạo và mạch lạc. Tóm lại, top_p là một tham số quan trọng để điều khiển đa dạng và sự sáng tạo trong sinh văn bản. Điều chỉnh nó cho phép tìm ra sự cân đối phù hợp giữa việc sản xuất văn bản độc đáo và duy trì một độ nhất quán nhất định với phong cách và nội dung của dữ liệu huấn luyện.

top_k=10

Tham số top_k là một thiết lập quan trọng khác. Nó đóng vai trò quan trọng trong việc xác định sự lựa chọn từ của mô hình trong quá trình sinh văn bản.Trong sinh sản văn bản, mô hình đánh giá xác suất của nhiều từ tiềm năng như từ tiếp theo. top_k hạn chế lựa chọn này chỉ trong số k từ có xác suất cao nhất. Ví dụ, nếu top_k được đặt thành 10, mô hình sẽ chỉ xem xét 10 từ có xác suất cao nhất để tiếp tục câu ở mỗi bước sinh sản.

  • Một top_k thấp (như 5 hoặc 10) khiến cho văn bản được tạo ra dễ đoán và mạch lạc hơn, vì nó tự giới hạn trong những lựa chọn có khả năng nhất.
  • Một top_k cao tăng tính đa dạng của từ được sinh ra, vì nó cho phép mô hình lựa chọn từ một loạt các khả năng rộng lớn hơn, có thể dẫn đến việc tạo ra các văn bản sáng tạo hoặc bất ngờ hơn.
  • Khác với top_p, chọn từ dựa trên một ngưỡng của xác suất tích lũy, top_k tập trung độc quyền vào số lượng cố định của những lựa chọn có xác suất cao nhất. - top_k thường được sử dụng phối hợp cùng nhiệt độ để tinh chỉnh thêm kết quả được tạo ra.
  • Đối với các văn bản chuẩn hóa hơn: một top_k thấp thường được sử dụng cho các nhiệm vụ đòi hỏi tính nhất quán và chính xác, như trả lời câu hỏi.
  • Đối với các văn bản sáng tạo hơn: một top_k cao có thể được sử dụng để kích thích sự sáng tạo, hữu ích trong viết lách sáng tạo hoặc sinh ra ý tưởng.
  • Giá trị của top_k thường là một số nguyên. Sự lựa chọn của giá trị này phụ thuộc vào sự cân bằng mong muốn giữa sự sáng tạo và nhất quán trong văn bản được tạo ra.

Tóm lại, top_k là một tham số ảnh hưởng trực tiếp đến sự đa dạng và nguyên bản của văn bản được sinh ra bởi một mô hình NLP. Nó cần được điều chỉnh theo mục tiêu cụ thể của tác vụ sinh văn bản, giữ trong đầu sự cân bằng giữa đa dạng nội dung và trung thành với phong cách và cấu trúc của dữ liệu huấn luyện.

repeat_penalty=1.2

repeat_penalty là một tham số được sử dụng để giảm thiểu sự lặp lại trong văn bản được tạo. Đây là một khía cạnh quan trọng để cải thiện chất lượng và đa dạng của văn bản sản xuất.

  • Tham số này nhằm mục đích phạt sự lặp lại của từ hoặc cụm từ đã xuất hiện trong văn bản được tạo ra. Nói cách khác, nó giảm khả năng chọn lại từ hoặc cụm từ đã được sử dụng gần đây.
  • Khi mô hình sinh văn bản, nó gán điểm (xác suất) cho các từ tiềm năng sử dụng tiếp theo. Nếu một từ đã được sử dụng, repeat_penalty giảm điểm số của từ đó, làm cho nó ít có khả năng được chọn lại.
  • Càng cao repeat_penalty, sự phạt cho việc lặp từ càng mạnh.
  • Với một repeat_penalty thấp hay không có, mô hình có thể tạo ra văn bản với sự lặp đi lặp lại thường xuyên, có thể khiến văn bản đơn điệu hoặc kém tự nhiên.
  • Với repeat_penalty cao, mô hình có xu hướng tránh lặp lại từ, góp phần tăng đa dạng và phong phú cho văn bản. Tuy nhiên, một hình phạt quá cao cũng có thể buộc mô hình phải sử dụng những từ kém phù hợp, có thể ảnh hưởng đến tính liền mạch của văn bản.
  • Đối với văn bản chảy mượt: Một repeat_penalty vừa phải hữu ích để tránh lặp từ trong khi vẫn duy trì sự nhất quán và dòng chảy tự nhiên của văn bản.
  • Đối với văn bản đa dạng cao: repeat_penalty cao hơn có thể được sử dụng để kích thích sự đa dạng trong văn bản, đặc biệt trong các bối cảnh sáng tạo.

Giá trị cụ thể của repeat_penalty sẽ phụ thuộc vào đặc thù của mô hình và loại văn bản bạn muốn tạo ra. Nó thường đòi hỏi sự thử nghiệm với các giá trị khác nhau để tìm ra sự cân bằng lý tưởng.

Để biết thêm thông tin, đây là một đoạn trích từ tài liệu của llama_cpp_python. Nó có thể hữu ích cho việc hiểu rõ hơn về một số tham số.

https://llama-cpp-python.readthedocs.io/en/latest/api-reference/- model_path (str) – Đường dẫn đến model.

  • Giải thích: Chỉ ra nơi tệp model được lưu trữ trên máy tính của bạn.

  • n_gpu_layers (int, mặc định: 0) – Số lớp được chuyển đến GPU (-ngl). Nếu là -1, tất cả các lớp đều được chuyển.

    • Giải thích: Xác định bao nhiêu lớp của model nên được chạy trên GPU. Có ích để quản lý tải giữa CPU và GPU.
  • main_gpu (int, mặc định: 0) - GPU sử dụng cho các tính toán tạm thời và tensor nhỏ.

    • Giải thích: Chọn GPU nào (nếu có nhiều GPU) được sử dụng cho các hoạt động chính.
  • tensor_split (Optional[List[float]], mặc định: None) - Cách chia tensor giữa các GPU. Nếu là None, model không được chia.

    • Giải thích: Cho phép phân phối dữ liệu của model giữa nhiều GPU, nếu có.
  • vocab_only (bool, mặc định: False) - Chỉ tải từ vựng, không tải trọng số của model.

    • Giải thích: Có ích nếu bạn chỉ cần từ vựng tích hợp sẵn của model, không cần phần đã được huấn luyện.
  • use_mmap (bool, mặc định: True) - Sử dụng mmap nếu có thể.

    • Giải thích: mmap cho phép quản lý bộ nhớ hiệu quả hơn khi tải các tệp lớn.
  • use_mlock (bool, mặc định: False) - Buộc hệ thống giữ model trong RAM.

    • Giải thích: Đảm bảo rằng model luôn ở trong bộ nhớ trực tiếp để truy cập nhanh hơn.
  • seed (int, mặc định: LLAMA_DEFAULT_SEED) - Giá trị seed cho bộ sinh số ngẫu nhiên, -1 cho giá trị ngẫu nhiên.

    • Giải thích: Xác định chuỗi các số ngẫu nhiên được sử dụng, quan trọng cho khả năng tái tạo kết quả.
  • n_ctx (int, mặc định: 512) - Ngữ cảnh văn bản, 0 = ngữ cảnh của model.

    • Giải thích: Xác định kích cỡ của ngữ cảnh (số lượng token) mà model sử dụng cho việc dự đoán.
  • n_batch (int, mặc định: 512) - Kích cỡ xử lý tối đa mỗi batch cho lời nhắc.

    • Giải thích: Xác định bao nhiêu lời nhắc có thể được xử lý cùng một lúc.
  • n_threads (Optional[int], mặc định: None) - Số lượng luồng sử dụng cho việc tạo ra.

    • Giải thích: Cho phép cấu hình đa luồng để tăng tốc việc tạo ra.
  • n_threads_batch (Optional[int], mặc định: None) - Số lượng luồng sử dụng cho xử lý batch.

    • Giải thích: Tương tự như n_threads, nhưng cụ thể cho xử lý batch.
  • rope_scaling_type (Optional[int], mặc định: LLAMA_ROPE_SCALING_UNSPECIFIED) - Kiểu tỷ lệ RoPE, theo liệt kê của llama_rope_scaling_type. Xem: llama.cpp yêu cầu kéo #2054

    • Giải thích: Tham số nâng cao liên quan đến việc tỷ lệ các tính toán nhất định trong model.
  • rope_freq_base (float, mặc định: 0.0) - Tần số cơ bản của RoPE, 0 = tần số của model.

    • Giải thích: Đặt giá trị cơ bản cho việc tính toán tần số trong RoPE, một tham số nâng cao của model.
  • rope_freq_scale (float, mặc định: 0.0) - Yếu tố tỷ lệ tần số RoPE, 0 = tỷ lệ của model.

    • Giải thích: Điều chỉnh tỷ lệ của tần số được sử dụng trong RoPE.
  • yarn_ext_factor (float, mặc định: -1.0) - Yếu tố ngoại suy trộn YaRN, số âm = tỷ lệ của model.

    • Giải thích: Tham số nâng cao ảnh hưởng đến cách YaRN, một phần của model, trộn dữ liệu.
  • yarn_attn_factor (float, mặc định: 1.0) - Yếu tố tỷ lệ cường độ chú ý của YaRN.

    • Giải thích: Điều chỉnh tỷ lệ của một số tính toán trong YaRN.
  • yarn_beta_fast (float, mặc định: 32.0) – Kích thước chỉnh sửa nhanh thấp của YaRN.

    • Giải thích: Tham số kỹ thuật liên quan đến chỉnh sửa nhanh trong YaRN.Dưới đây là bản dịch của chuỗi yêu cầu sang tiếng Việt:
  • yarn_beta_slow (float, mặc định: 1.0) – Kích thước hiệu chỉnh chậm cao của YaRN.

    • Giải thích: Tham số kỹ thuật cho việc hiệu chỉnh chậm trong YaRN.
  • yarn_orig_ctx (int, mặc định: 0) – Kích thước bối cảnh gốc của YaRN.

    • Giải thích: Xác định kích thước bối cảnh gốc cho một số tính toán cụ thể trong YaRN.
  • f16_kv (bool, mặc định: True) – Sử dụng fp16 cho bộ nhớ đệm KV, ngược lại là fp32.

    • Giải thích: Xác định định dạng dữ liệu trong bộ nhớ đệm khóa/giá trị, ảnh hưởng đến hiệu suất và sử dụng bộ nhớ.
  • logits_all (bool, mặc định: False) – Trả về logit cho tất cả các token, không chỉ token cuối cùng. Phải là True để hoàn thiện việc trả về logprobs.

    • Giải thích: Nếu True, mô hình sẽ cung cấp logit (điểm số trước hàm kích hoạt) cho mỗi token được sinh ra.
  • embedding (bool, mặc định: False) – Chỉ ở trong chế độ nhúng.

    • Giải thích: Nếu True, mô hình sẽ hoạt động trong chế độ nhúng, dùng để lấy các biểu diễn vector của dữ liệu.
  • last_n_tokens_size (int, mặc định: 64) – Số lượng token tối đa để giữ trong deque last_n_tokens.

    • Giải thích: Xác định kích cỡ bộ đệm cho các token được sinh ra gần nhất.
  • lora_base (Optionalstrstrstr, mặc định: None) – Đường dẫn tùy chọn đến mô hình cơ sở, hữu ích nếu bạn sử dụng mô hình cơ sở được lượng tử hóa và muốn áp dụng LoRA cho một mô hình f16.

    • Giải thích: Cho phép áp dụng các điều chỉnh LoRA vào một mô hình cơ sở cụ thể.
  • lora_path (Optionalstrstrstr, mặc định: None) – Đường dẫn đến tập tin LoRA để áp dụng cho mô hình.

    • Giải thích: Chỉ định tập tin LoRA để sửa đổi mô hình.
  • numa (bool, mặc định: False) – Kích hoạt hỗ trợ NUMA. (CHÚ Ý: Giá trị ban đầu của tham số này được sử dụng cho phần còn lại của chương trình vì giá trị này được thiết lập trong llama_backend_init)

    • Giải thích: Kích hoạt hoặc vô hiệu hóa hỗ trợ cho NUMA, phương pháp tối ưu hóa quản lý bộ nhớ trên các hệ thống với nhiều CPU.
  • chat_format (str, mặc định: 'llama-2') – Chuỗi xác định định dạng trò chuyện để sử dụng khi gọi create_chat_completion.

    • Giải thích: Xác định định dạng đầu ra cho các phiên trò chuyện được sinh ra.
  • chat_handler (OptionalLlamaChatCompletionHandlerLlamaChatCompletionHandlerLlamaChatCompletionHandler, mặc định: None) – Trình xử lý trò chuyện tùy chọn để sử dụng khi gọi create_chat_completion.

    • Giải thích: Cho phép tùy chỉnh quy trình xử lý các phiên trò chuyện.
  • verbose (bool, mặc định: True) – Hiển thị đầu ra chi tiết trên stderr.

    • Giải thích: Nếu True, mô hình sẽ cung cấp thông tin chi tiết về hoạt động của nó trong quá trình thực thi.

Và đây là giới thiệu về RAG. Chúng ta chưa đi sâu vào vấn đề, nhưng phần đầu tiên này đã giúp chúng ta nêu bật được khái niệm và cách thức hoạt động. Hẹn gặp lại ở phần 2, nơi chúng ta sẽ bắt đầu nhập dữ liệu vào cơ sở dữ liệu. Chúng ta sẽ xem TxtAi tự mình thực hiện các truy vấn để lấy nội dung và cung cấp cho chúng ta một phản hồi nhất quán phù hợp với người dùng.