×
Community Blog Thử nghiệm chatbot đơn giản sử dụng Qwen-Plus Python SDK

Thử nghiệm chatbot đơn giản sử dụng Qwen-Plus Python SDK

Customer Support Chatbot using QwenPlus and RAG with Langchain

Xin chào tất cả các bạn, mình làm việc như một system admin là nhiều, nên nghe về AI và sử dụng mà chưa nghĩ tới xây dựng ra một cái gì đó "hay ho" hơn. Nhân một dịp được nghe về RAG, mình mới bất ngờ về tính ứng dụng của nó, khi không phải tốn nhiều resource chạy một mô hình LLM tại localhost hay phải training lại với dữ liệu nội bộ. Và tình cờ Alibaba Cloud miễn phí thử nghiệm các API của họ trong các mô hình LLM như qwen2, qwen-max, mình đã thử nghiệm viết một chatbot tư vấn sản phẩm đơn giản. Tuy các ứng dụng này không mới, và dù chỉ code cơ bản, nhưng là một dân ngoài nghề, mình cũng khó tránh khỏi có nhiều sai sót.

1. Alibaba Cloud Model Studio

Alibaba Cloud Model AI là một nền tảng toàn diện bao gồm những mô hình AI tạo sinh (Foundation models) hàng đầu của Alibaba Qwen-Max, Qwen-Plus, Qwen-Turbo, Qwen 2 series,... đa dạng cho các tác vụ về hình ảnh, âm thanh, sáng tạo nội dung hay thị giác máy tính.
Alibaba Model Studio cùng hàng loạt các công cụ tiện dụng như các SDK, Vector database, OpenSearch LLM,... cung cấp một hệ sinh thái dành cho việc phát triển các ý tưởng sáng tạo từ AI hay triển khai RAG.

2. Tổng quan về Retrieval-Augmented Generation (RAG)

Với sự ra đời của các mô hình ngôn ngữ lớn (LLM) như Qwen, và Model Studio cung cấp cho người dùng khả năng sử dụng trực tiếp các mô hình chuyên nghiệp đó. Nhưng nó được xây dựng trong một phạm vi ứng dụng rộng lớn với nguồn dữ liệu vô cùng lớn, và khó có thể phù hợp với nhiệm vụ nhỏ hay chi tiết mà người dùng đặt ra, như làm một "nhân viên tư vấn" về sản phẩm cụ thể của một công ty. Thay vì phải xây dựng các model hay dành nhiều tài nguyên để huấn luyện lại với các bộ dữ liệu đặc thù. Người dùng có thể sử dụng RAG để bù đắp sự thiếu hụt về "context" hay ngữ cảnh cụ thể cho các bài toán của riêng mình. Như bài toàn chat bot tư vấn sản phẩm cho công ty, thay vì gửi câu hỏi "Sản phẩm X là gì?" đến Qwen, ta có thể thêm các ngữ cảnh về sản phẩm và thay đổi promt như: "Sản phẩm X này có các thông số như sau...., bạn hãy giúp tôi tư vấn cho khách hàng có câu hỏi: "Sản phẩm X này là gì?"". Điều đó giúp các mô hình hiểu rõ hơn về ngữ cảnh của câu hỏi và nội dung cần trả lời, từ đó có thể đưa ra các phản hồi phù hợp và chuyên nghiệp như một tư vấn viên thực thụ.
Tuy nhiên RAG cũng có những thách thức của mình, như việc xây dựng các database như thế nào, hay việc chọn ra các context như thế nào để thêm vào promt. Ở các mục sau, mình sẽ xây dựng một mô hình RAG pipeline cơ bản với langchain và chroma vector db, để xem về hoạt động của nó và hiệu quả khi ứng dụng với mô hình Qwen-Plus.

3. Xây dựng Chatbot

1. Xây dựng Vector database

Mình lấy dữ liệu một dịch vụ trên trang chủ của website , do chỉ là thử nghiệm đơn giản, mình lấy thông tin sản phẩm từ trong chủ của website, ghi vào một file txt bình thường, việc chuẩn hóa cũng là một giai đoạn quan trọng, nhưng cũng có nhiều công cụ hỗ trợ. Sau khi có một file text chứa thông tin công khai về dịch vụ của công ty, mình bắt đầu xử lý với langchain.
LangChain là một framework được viết bằng Python và JavaScript, nó cung cấp các công cụ để thao tác và xây dụng ứng dụng dựa trên LLMs.
Sau khi có được file txt làm dữ liệu, mình cần phải embedding, hay biến đổi nó sang dạng mà máy có thể xử lý được, có rất nhiều cách làm, và cũng có rất nhiều mô hình làm việc này. Mình tìm tên các mô hình có có sẵn trên HuggingFace: https://huggingface.co/spaces/mteb/leaderboard, bảng này cũng liệt kê thứ tự benchmark của chúng. Lúc đầu mình chọn mô hình gte-Qwen2-7B-instruct, đứng hạng thứ 2 ( với sự cạnh tranh và phát triển nhanh chóng, thứ tự trên bảng luôn được cập nhật liên tục). Tuy nhiên, với yêu cầu Ram khá cao nên mình đổi sang mô hình gte-qwen2-1.5b-instruct. Sau khi lựa mô hình mình sẽ tiến hành embedding file doc của mình thành các vector, và lưu vào một VectorDatabase, ở đây mình chọn Chroma chạy ở local. Có một đoạn khó ở đây là là việc vector hóa không thể thực hiện trên toàn bộ document, mà phải chia document thành các chunk nhỏ hơn, và việc chia các chunk như thế nào cần rất nhiều kỹ năng và những thử nghiệm để cho ra kết quả tối ưu. Mình chọn một khoảng là 512 và sử dụng RecursiveCharacterTextSplitter. Với langchain, code chỉ cần vài dòng đơn giản:

from langchain_huggingface import HuggingFaceEmbeddings
from langchain_community.document_loaders import TextLoader
from sentence_transformers import SentenceTransformer
from langchain_chroma import Chroma
# Chia du lieu
doc_path="/content/doc.txt"
loader = TextLoader(path, encoding='utf-8')
documents=loader.load()
text_splitter=  RecursiveCharacterTextSplitter(chunk_size=512,chunk_overlap=100)
docs_split= text_splitter.split_documents(documents)
# Tai embedding model
model_name = "Alibaba-NLP/gte-qwen2-1.5b-instruct"
embedding = HuggingFaceEmbeddings(
    model_name=model_name
)
# Tao Vector Database
vectorStore = Chroma.from_documents(
    documents=docs_split,
    collection_name="vps_store",
    embedding=embeddings,
    persist_directory="/content/")

Sau bước này, mình đã có một knowledge database cơ bản. Để sử dụng thử, có thể gọi lệnh:

query="What is VPS?"
docs = vectorStore.similarity_search(query,k=2)

Quá trình này gọi là Retrieval, nôm na là tìm kiếm những nội dung liên quan đến câu query từ database để làm context cho promt sẽ gửi đến LLM model. Sẽ có rất nhiều nội dung liên quan (hay tương tự) được trích xuất, và mình lấy k=2 nội dung đầu tiên:
Ali_Query2

2. Tương tác với Model Studio SDK

Để gọi API đến các mô hình ngôn ngữ lớn trong Model Studio, mình sử dụng python SDK có sẵn. Hiện tại SDK đang hỗ trợ hai ngôn ngữ Python và Java, ngoài ra, các ngôn ngữ khác có thể gọi thông qua HTTP( đọc thêm tại đây). Với python có thể cài đặt đơn giản bằng lệnh sau:

pip install dashscope

Lưu ý rằng trước khi sử dụng, mình phải có API key. Để tạo key, có thể search trên web console của Alibaba Cloud từ khóa "Model Studio" sau đó truy cập và Activate dịch vụ, sau khi dịch vụ được activate thành công. Mình truy cập System Tools -> API-KEY để tạo key.

Ali_API_Key

Sau khi có key, mình bắt đầu xây dựng hàm để tương tác với các model của Alibaba. Danh sách các model có thể xem ở mục Model Gallery (Alibaba cũng cung cấp đầy đủ code ví dụ trong đây).
Để tiện dụng mình đã tạo một class  MyChatBot (các bạn xem thêm hàm init), và hàm call_chat là một method của class, nó nhận vào input là câu query của người dùng. Và trả về nội dung phản hồi từ LLL model, ở đây mình chọn QwenPlus. Khi gọi đến QwenPlus, có thểm truyền promt theo format định sẵn, bao gồm role và và content, nội dung của user nhập vào thì là role user và content là nội dung của user, còn những promt chỉ thị hay thêm context có thể đặt trong system role. Trong hàm, mình cũng gọi từ database ở bước 2, và chọn ra 4 kết quả có liên quan nhất để thêm vào promt.

def __init__(self,vector_db,api_key_path):
    self.name = "AI"
    self.history = []
    self.flatform=dashscope
    self.knowledge_base = vector_db
    self.endpoint = 'https://dashscope-intl.aliyuncs.com/api/v1'
    #self.api_key=""
    self.api_key_path=api_key_path
def call_chat(self,input):
    self.flatform.base_http_api_url = self.endpoint
    self.flatform.api_key_file_path = self.api_key_path
    contexts=self.knowledge_base.similarity_search(input,k=3)
    system_promt="You are a professional consultant of Vinahost Company, please use the following information to advise the our client "
    content= f'{system_promt}:{contexts[0].page_content} {contexts[1].page_content} {contexts[2].page_content}'
    send_messages=[{'role': 'system', 'content': content}]
    send_messages.append({'role': 'user', 'content': input})
    print(send_messages)
    model_response = self.flatform.Generation.call("qwen-max",
                                messages=send_messages,
                                result_format='message',
                                )
    if model_response.status_code != HTTPStatus.OK:
      print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
                model_response.request_id, model_response.status_code,
                model_response.code, model_response.message
            ))

    else:
      return model_response.output.choices[0]['message']['content']
    return model_response.output.choices[0]['message']['content']

Kết quả trả về từ API có dạng như sau:

{"status_code": 200, "request_id": "c6a72e7b-4311-9ffe-a426-4ec5cb5c9eb2", "code": "", "message": "", "output": {"text": null, "finish_reason": null, "choices": [{"finish_reason": "stop", "message": {"role": "assistant", "content": "..... "}}]}, "usage": {"input_tokens": 222, "output_tokens": 280, "plugins": {}, "total_tokens": 502}}

3. Tạo chatbot với gradio.

Gradio là một công cụ thông dụng được xây dựng sẵn, dễ dàng cho việc "thể hiện" các kết quả của mình. Chỉ vài dòng code cơ bản, mình đã có một giao diện chat bot:

import gradio as gr
def gradiofn(input,history):
  mybot = MyChatBot(vectorStore,'/content/api_key.txt')
  mybot.set_history(history)
  res=mybot.call_chat(input)
  return res

interface = gr.ChatInterface(
  fn=gradiofn,
  textbox=gr.Textbox(placeholder="Ask me anything"),
  retry_btn=None,
)
interface.launch(debug=True)

4. Kết quả

Sau khi run, mình có chạy thử và đạt được một số kết quả như hình dưới đây:
Ali_Result

Với câu hỏi trên, theo thống kê mình đã dùng 180 input_tokens, 303 out_put tokens. Kết quả so sánh khi không có RAG thì có thể thấy khi dùng RAG câu trả lời rõ ràng, đầy đủ và chính xác hơn, có thể nhiều quảng cáo (do có trong database), còn khi không có RAG, câu trả lời tuy ngắn gọn, súc tích, nhưng có điểm sai sót là Vinahost thành lập năm 2008:
Ali_Result_noRAG

Ví dụ trên vẫn chưa thật sự rõ ràng vì câu hỏi còn khác chung và thông tin vẫn có trên internet, thì dưới đây là một câu hỏi khác, rõ ràng hơn về dịch vụ nội bộ, với câu hỏi này, mình đã dùng 465 input_token và 385 output_token:
Ali_Cheapest

Có thể thấy câu trả lời ở trên khá ấn tượng khi nó cung cấp đầy đủ package name, giá, cấu hình và các khuyến mãi, đồng thời còn đề xuất thêm về các gói upgrade trong tương lai.

5. Kết luận

Ở trên, mình đã có một đoạn thử nghiệm đơn giản, nhờ các interface của langchain và Alibaba Cloud Model Studio, mình có thể tự tay phát triển một chatbot AI nhanh chóng cho việc hỗ trợ tư vấn sản phẩm của công ty, tuy nhiên, hiệu quả không phải phụ thuộc hoàn toàn vào Qwen Model, mà phụ thuộc vào độ chính xác của ngữ cảnh cung cấp cho mô hình. Điều đó cần các kỹ thuật nâng cao, cũng như cần sự hỗ trợ thêm từ hệ sinh thái của Alibaba Cloud mà các bài viêt sau mình sẽ giới thiệu.

6. Tham khảo

  1. Langchain Sentence Transformers on Hugging Face
  2. Alibaba Cloud Model Studio
  3. Alibaba Cloud Model Studio API document
  4. RAG
  5. Gradio Document
  6. Alibaba Cloud Model Studio - Model Gallery
0 1 1
Share on

Nguyen Phuc Khang

5 posts | 1 followers

You may also like

Comments

Nguyen Phuc Khang

5 posts | 1 followers

Related Products