📚OpenThaiRAG
เฟรมเวิร์กระบบ AI อัจฉริยะเพื่อการสร้างคำตอบโดยใช้การค้นคืนข้อมูล (Retrieval-Augmented Generation: RAG) แบบโอเพนซอร์สที่ออกแบบมาเฉพาะสำหรับการประมวลผลภาษาไทย
Last updated
เฟรมเวิร์กระบบ AI อัจฉริยะเพื่อการสร้างคำตอบโดยใช้การค้นคืนข้อมูล (Retrieval-Augmented Generation: RAG) แบบโอเพนซอร์สที่ออกแบบมาเฉพาะสำหรับการประมวลผลภาษาไทย
Last updated
OpenThaiRAG is an open-source Retrieval-Augmented Generation (RAG) framework designed specifically for Thai language processing. This project combines the power of vector databases, large language models, and information retrieval techniques to provide accurate and context-aware responses to user queries in Thai using OpenThaiGPT 1.5 as LLM.
OpenThaiRAG เป็นเฟรมเวิร์กการสร้างคำตอบโดยใช้การค้นคืนข้อมูล (Retrieval-Augmented Generation: RAG) แบบโอเพนซอร์สที่ออกแบบมาเฉพาะสำหรับการประมวลผลภาษาไทย โครงการนี้รวมพลังของฐานข้อมูลเวกเตอร์ โมเดลภาษาขนาดใหญ่ และเทคนิคการค้นคืนสารสนเทศเพื่อให้คำตอบที่แม่นยำและคำนึงถึงบริบทสำหรับคำถามของผู้ใช้ในภาษาไทย โดยใช้ OpenThaiGPT 1.5 เป็นโมเดลภาษาขนาดใหญ่ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับโครงการ OpenThaiGPT.
https://github.com/OpenThaiGPT/openthairag
Vector Database Integration: Utilizes Milvus for efficient storage and retrieval of document embeddings.
Multilingual Embedding Model: Incorporates the BAAI/bge-m3 model for generating high-quality embeddings for Thai text.
Advanced Retrieval: Implements a two-stage retrieval process with initial vector search and subsequent re-ranking for improved accuracy.
Large Language Model Integration: Seamlessly integrates with vLLM for generating human-like responses based on retrieved context.
RESTful API: Offers a Flask-based web API for easy integration into various applications.
การผสานรวมฐานข้อมูลเวกเตอร์: ใช้ Milvus สำหรับการจัดเก็บและค้นคืนเอ็มเบดดิงของเอกสารอย่างมีประสิทธิภาพ
โมเดลเอ็มเบดดิงหลายภาษา: รวม BAAI/bge-m3 model สำหรับการสร้างเอ็มเบดดิงคุณภาพสูงสำหรับข้อความภาษาไทย
การค้นคืนขั้นสูง: ใช้กระบวนการค้นคืนสองขั้นตอนด้วยการค้นหาเวกเตอร์เบื้องต้นและการจัดอันดับใหม่ในภายหลังเพื่อเพิ่มความแม่นยำ
การผสานรวมโมเดลภาษาขนาดใหญ่: ผสานรวมกับ vLLM อย่างราบรื่นเพื่อสร้างคำตอบที่เหมือนมนุษย์ตามบริบทที่ค้นคืนได้
RESTful API: นำเสนอ API เว็บที่ใช้ Flask เพื่อการผสานรวมที่ง่ายกับแอปพลิเคชันต่างๆ
Document Indexing: Allows users to index Thai documents, generating and storing embeddings for efficient retrieval.
Query Processing: Handles user queries by finding relevant documents and generating context-aware responses.
Document Management: Provides endpoints for listing and deleting indexed documents.
OpenThaiRAG aims to enhance natural language understanding and generation for Thai language applications, making it a valuable tool for developers working on chatbots, question-answering systems, and other NLP projects focused on Thai language processing.
การทำดัชนีเอกสาร: อนุญาตให้ผู้ใช้ทำดัชนีเอกสารภาษาไทย สร้างและจัดเก็บเอ็มเบดดิงสำหรับการค้นคืนอย่างมีประสิทธิภาพ
การประมวลผลคำถาม: จัดการคำถามของผู้ใช้โดยค้นหาเอกสารที่เกี่ยวข้องและสร้างคำตอบที่คำนึงถึงบริบท
การจัดการเอกสาร: ให้จุดเชื่อมต่อสำหรับการแสดงรายการและลบเอกสารที่ทำดัชนีไว้
OpenThaiRAG มีเป้าหมายเพื่อเพิ่มประสิทธิภาพการเข้าใจและการสร้างภาษาธรรมชาติสำหรับแอปพลิเคชันภาษาไทย ทำให้เป็นเครื่องมือที่มีคุณค่าสำหรับนักพัฒนาที่ทำงานเกี่ยวกับแชทบอท ระบบถาม-ตอบ และโครงการ NLP อื่นๆ ที่มุ่งเน้นการประมวลผลภาษาไทย
To install and run OpenThaiRAG using Docker Compose, follow these steps:
Ensure you have Docker and Docker Compose installed on your system.
Clone the OpenThaiRAG repository:
Build and start the containers using Docker Compose:
This command will:
Build the web service container
Start the Milvus standalone server
Start the etcd service
Start the MinIO service
Link all services together as defined in the docker-compose.yml file
Once all containers are up and running, the OpenThaiRAG API will be available at http://localhost:5000
.
To stop the services, run:
Note: Ensure that port 5000 is available on your host machine, as it's used to expose the web service. Also, verify that you have sufficient disk space for the Milvus, etcd, and MinIO data volumes.
For production deployments, it's recommended to adjust the environment variables and security settings in the docker-compose.yml file according to your specific requirements.
OpenThaiRAG utilizes several containers to provide its functionality. Here's an explanation of each container's role and purpose:
web:
Role: Main application container
Purpose: Hosts the Flask web service that provides the RESTful API for OpenThaiRAG. It handles document indexing, query processing, and interaction with other services.
milvus:
Role: Vector database
Purpose: Stores and manages document embeddings for efficient similarity search. It's crucial for the retrieval component of the RAG system.
etcd:
Role: Distributed key-value store
Purpose: Used by Milvus for metadata storage and cluster coordination. It ensures data consistency and helps manage the distributed nature of Milvus.
minio:
Role: Object storage
Purpose: Provides S3-compatible object storage for Milvus. It's used to store large objects and files that are part of the Milvus ecosystem.
These containers work together to create a robust and scalable infrastructure for the OpenThaiRAG system:
The web container interacts with Milvus for vector operations.
Milvus uses etcd for metadata management and MinIO for object storage.
This architecture allows for efficient document embedding storage, retrieval, and query processing, which are essential for the RAG (Retrieval-Augmented Generation) functionality of OpenThaiRAG.
To insert new documents into the RAG system, you can use the index_docs.py
script provided in the app
directory. This script reads text files from the /docs
folder and indexes their contents via the API. Here's how to use it:
Prepare your documents:
Create text files (.txt) containing the content you want to index.
Place these files in the /docs
directory of your project.
Run the indexing script:
This script will:
Read all .txt files in the /docs
directory.
Split each document into chunks of maximum 200 characters, including the title in each chunk.
Send each chunk to the indexing endpoint (http://localhost:5000/index by default).
Monitor the indexing process:
The script will log information about each indexed file.
At the end, it will report the total number of successfully indexed files and any files that couldn't be indexed.
You can also customize the indexing process by modifying the index_docs.py
script. For example, you can change the chunk size, adjust the indexing endpoint URL, or add additional preprocessing steps.
Note: Ensure that your OpenThaiRAG API is running and accessible at the specified URL before running the indexing script.
For more granular control or to index documents programmatically, you can use the /index
endpoint directly:
You can see more examples at /docs
.
To get a response from the RAG system, you can use the /completions
endpoint. This endpoint accepts a POST request with a JSON payload containing the user's query and optional parameters.
Here's a list of query parameters supported by the /completions
endpoint:
prompt
(required): The input text to generate completions for.
max_tokens
(optional): The maximum number of tokens to generate. Defaults to 16.
temperature
(optional): Controls randomness in generation. Higher values (e.g., 0.8) make output more random, lower values (e.g., 0.2) make it more focused. Defaults to 1.0.
top_p
(optional): An alternative to temperature, called nucleus sampling. Keeps the model from considering unlikely options. Defaults to 1.0.
n
(optional): How many completions to generate for each prompt. Defaults to 1.
stream
(optional): Whether to stream back partial progress. Defaults to false.
logprobs
(optional): Include the log probabilities on the logprobs
most likely tokens. Defaults to null.
echo
(optional): Echo back the prompt in addition to the completion. Defaults to false.
stop
(optional): Up to 4 sequences where the API will stop generating further tokens.
presence_penalty
(optional): Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far. Defaults to 0.
frequency_penalty
(optional): Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far. Defaults to 0.
best_of
(optional): Generates best_of completions server-side and returns the "best" (the one with the highest log probability per token). Defaults to 1.
logit_bias
(optional): Modify the likelihood of specified tokens appearing in the completion.
user
(optional): A unique identifier representing your end-user, which can help OpenAI to monitor and detect abuse.
Note: Some parameters may not be applicable depending on the specific model and configuration of your OpenThaiRAG setup.
You can take a look at /app/query_rag_using_openai.py
. To use the OpenAI library to get RAG responses, you can follow these steps:
Install the OpenAI library:
Configure the OpenAI client to use the vLLM server:
Define your prompt:
For a non-streaming response:
For a streaming response:
You can find the complete example in the /app/query_rag_using_openai.py
file.
For detailed API documentation and examples, please refer to our Postman collection: OpenThaiRAG API Postman Collection
OpenThaiGPT Team
Kobkrit Viriyayudhakorn (kobkrit@aieat.or.th)
Sumeth Yuenyong (sumeth.yue@mahidol.edu)
Apivadee Piyatumrong (apivadee.piy@nectec.or.th)
Jillaphat Jaroenkantasima (autsadang41@gmail.com)
Apache 2.0