Chuyển đến nội dung chính

DeepSeek V3.1: Hướng dẫn kèm dự án demo

Tìm hiểu cách biến bất kỳ PDF nào thành trợ lý nghiên cứu tương tác bằng DeepSeek V3.1 và ứng dụng Streamlit.
· 12 phút đọc

Khám phá cùng AI

DeepSeek vừa phát hành DeepSeek V3.1, một mô hình suy luận lai quy mô lớn hỗ trợ cả chế độ trả lời “think” và “non-think”, rất phù hợp cho phân tích tài liệu tương tác.

Trong bài viết này, tôi sẽ tập trung vào năng lực tác tử (agentic) của DeepSeek V3.1 trong việc hiểu các bài báo nghiên cứu. Tôi sẽ giải thích từng bước cách biến bất kỳ PDF nào thành một trợ lý nghiên cứu tương tác thông qua ứng dụng Streamlit—tôi sẽ hướng dẫn bạn qua các bước:

  • Tích hợp DeepSeek V3.1 qua API của OpenRouter để suy luận trên tài liệu dài ở quy mô lớn
  • Trích xuất và phân tích văn bản PDF để xử lý các bài báo học thuật ở mọi độ dài
  • Thiết kế ứng dụng Streamlit cho phép người dùng chuyển đổi giữa câu trả lời nhanh, thực tế và suy luận sâu, có dẫn chứng
  • Triển khai theo dõi chi phí và đo lường hiệu năng cho các kịch bản nghiên cứu thực tế
  • Hỗ trợ câu trả lời bằng các trích dẫn lấy trực tiếp từ nguồn

Cuối cùng, ứng dụng của bạn sẽ trông như thế này:

Dự án demo DeepSeek V3.1

DeepSeek V3.1 là gì?

DeepSeek V3.1 là mô hình Mixture-of-Experts (MoE) lai với 671 tỷ tham số, được huấn luyện cho cả phong cách trả lời “thinking” (chi tiết, có lập luận) và “non-thinking” (thực tế, súc tích). Mô hình hỗ trợ ngữ cảnh 128.000 token và có thể truy cập qua API tương thích OpenAI của OpenRouter.

Benchmark DeepSeek V3.1

Nguồn: DeepSeek

Những tính năng quan trọng nhất của DeepSeek V3.1 gồm:

  • Xử lý ngữ cảnh dài: DeepSeek V3.1 xử lý hiệu quả các tài liệu cực dài, hỗ trợ cửa sổ ngữ cảnh lên đến 128.000 token (hơn 100 trang), rất phù hợp cho các bài nghiên cứu và báo cáo toàn diện.
  • Hai chế độ suy luận: Mô hình đi kèm hai chế độ sau:
    • Thinking mode: Cung cấp lập luận chi tiết theo từng bước và dẫn chứng trực tiếp từ nguồn để phân tích và phản biện sâu.
    • Non-thinking mode: Đưa ra phản hồi ngắn gọn, dựa trên sự thật để truy xuất thông tin nhanh và Hỏi & Đáp tức thì.
  • Kiến trúc mixture-of-experts lai: DeepSeek V3.1 kết hợp nhiều mạng con chuyên gia, cho phép vừa ghi nhớ sự kiện vừa tổng hợp nâng cao trong cùng một mô hình.
  • Quy trình tác tử và bổ trợ công cụ: Mô hình được thiết kế để tích hợp với hệ thống dựa trên tác tử và hỗ trợ sử dụng công cụ bên ngoài cho các quy trình nhiều bước, phong phú hơn.
  • Truy cập API tương thích OpenAI: Có thể truy cập qua API tương thích OpenAI của OpenRouter, giúp việc triển khai và tích hợp trở nên đơn giản cho nhà phát triển.

Demo DeepSeek V3.1: Trợ lý bài báo nghiên cứu

Trong phần này, tôi sẽ trình bày cách tôi dùng DeepSeek V3.1 để biến bất kỳ bài báo nghiên cứu PDF tải lên nào thành trợ lý nghiên cứu tương tác, vận hành bởi AI.

Cách thức hoạt động:

  • Tải lên một bài báo nghiên cứu PDF và xem trước văn bản đã trích xuất.
  • Đặt câu hỏi bằng ngôn ngữ tự nhiên về bài báo.
  • Chọn giữa chế độ “Explain in Brief” (non-think) hoặc “Explain in Detail” (think).
  • Nhận câu trả lời ngay kèm thời gian phản hồi, ước tính số token/chi phí và các trích dẫn hỗ trợ từ nguồn.

Bước 1: Điều kiện tiên quyết

Trước khi chạy bản demo này, hãy đảm bảo bạn đã chuẩn bị đầy đủ các điều kiện tiên quyết.

Bước 1.1: Thư viện cần cài 

Trước hết, hãy đảm bảo bạn đã cài các gói sau:

pip install streamlit openai pypdf

Lệnh này đảm bảo bạn có đủ các phụ thuộc cốt lõi cho giao diện, xử lý PDF và yêu cầu API.

Bước 1.2: Thiết lập khóa API OpenRouter 

Mô hình DeepSeek V3.1 có sẵn trên nhiều nền tảng cùng với DeepSeek Official API. Tuy nhiên, tôi dùng OpenRouter vì nền tảng này cung cấp quyền truy cập nhiều khóa API cho nhiều mô hình và là lựa chọn tiết kiệm chi phí nhất cho bản demo này. Các bước tạo API Key cho DeepSeek V3.1:

  • Tạo tài khoản tại https://openrouter.ai/
  • Đi tới tab Models và tìm “DeepSeek V3.1”. Bạn cũng có thể chọn phiên bản base, nhưng phiên bản này chỉ được huấn luyện cho dự đoán token kế tiếp thô, khiến việc nhắc lệnh khó hơn. Vì vậy, tôi dùng bản chat “deepseek/deepseek-chat-v3.1.”

DeepSeek V3.1 trên OpenRouter

  • Cuộn xuống và nhấp Create API Key. Điền tên khóa và hạn mức tín dụng (tùy chọn), rồi nhấp Create. Lưu API key này để dùng sau. 

Tạo API key

  • Tiếp theo, vào tab Credits và thêm thông tin thẻ hoặc ngân hàng. Bạn cũng có thể thanh toán qua Amazon Pay hoặc tiền mã hóa. Với demo này, tôi nạp khoảng 8 USD, là đủ.

Nạp tín dụng

Giờ hãy đặt API key của bạn làm biến môi trường trước khi chạy ứng dụng:

export OPENROUTER_API_KEY=your_api_key

Chọn API phù hợp

API chính thức của DeepSeek phù hợp nhất với khối lượng công việc tự động, lưu lượng lớn.

Với hầu hết các nhu cầu nghiên cứu, giáo dục hoặc demo, bao gồm Trợ lý Bài báo Nghiên cứu bằng Streamlit này, tôi ưu tiên OpenRouter vì đây là lựa chọn đơn giản và linh hoạt hơn. Nền tảng cung cấp mức giá toàn cầu có thể dự đoán, không giới hạn theo cửa sổ thời gian hay cần quản lý logic bộ nhớ đệm, rất phù hợp cho phân tích ngẫu hứng, truy vấn tài liệu độc nhất và cộng tác dễ dàng.

Lưu ý: Sử dụng DeepSeek V3.1 qua API chỉ cần khoảng 8 GB bộ nhớ cho giao diện người dùng, giúp bạn không phải tự lưu trữ cục bộ mô hình 670 tỷ tham số khổng lồ, vốn sẽ cần hơn 170 GB dung lượng đĩa và GPU mạnh.

Bước 2: Thiết lập ứng dụng Streamlit

Để đưa DeepSeek V3.1 vào một giao diện thân thiện với người dùng, chúng ta sẽ dùng Streamlit làm khung ứng dụng và kết nối với mô hình qua API tương thích OpenAI của OpenRouter. 

Bước 2.1: Cấu hình

Bước này bao gồm thiết lập môi trường, xác thực API và cấu hình cơ bản cho Streamlit.

import streamlit as stimport pypdfimport tempfilefrom openai import OpenAIimport osimport timeimport rest.set_page_config(    page_title="DeepSeek V3.1 Research Assistant",    layout="wide")with st.sidebar:    st.title("Research Paper Assistant")    st.info("Tip: Ask about the methods, findings, or reasoning for best results.")OPENROUTER_API_KEY = os.environ.get("OPENROUTER_API_KEY", "")if not OPENROUTER_API_KEY:    st.warning("Add your OpenRouter API key to an environment variable.")    st.stop()client = OpenAI(    base_url="https://openrouter.ai/api/v1",    api_key=OPENROUTER_API_KEY,)

Trong đoạn mã trên, lời gọi hàm st.set_page_config() tùy chỉnh tiêu đề trang và bố cục ứng dụng Streamlit. Ứng dụng lấy khóa API OpenRouter từ biến môi trường và khởi tạo client tương thích OpenAI, trỏ tới endpoint API của OpenRouter, đảm bảo mọi lời gọi LLM tiếp theo được định tuyến và xác thực đúng cho DeepSeek V3.1.

Bước 2.2: Hàm tiện ích

Trước khi xây dựng luồng chính, chúng ta cần các hàm tiện ích vững chắc để xử lý tài liệu và ước tính tài nguyên. Ở bước này, ta định nghĩa các hàm hỗ trợ để trích xuất văn bản từ PDF tải lên, xem trước nội dung tài liệu, đếm xấp xỉ số token và ước tính chi phí dựa trên mức giá DeepSeek V3.1 của OpenRouter. 

def pdf_to_text(uploaded_file):    with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as tmp_file:        tmp_file.write(uploaded_file.read())        tmp_path = tmp_file.name    reader = pypdf.PdfReader(tmp_path)    text = ""    for page in reader.pages:        page_text = page.extract_text()        if page_text:            text += page_text + "\n"    return textdef preview_pdf_text(text, max_chars=600):    preview = text[:max_chars]    if len(text) > max_chars:        preview += "\n...\n[Preview truncated]"    return previewdef count_tokens(text):    return max(1, int(len(text) / 4))def estimate_cost(tokens, mode="input"):    if mode == "input":        return tokens / 1_000_000 * 0.20    else:        return tokens / 1_000_000 * 0.80

Với các hàm tiện ích này, backend của chúng ta đã sẵn sàng hỗ trợ một giao diện trợ lý nghiên cứu có khả năng mở rộng:

  • Phân tích PDF hiệu quả: Hàm pdf_to_text() xử lý PDF nhiều trang thành văn bản thuần, đồng thời giữ ranh giới trang, giúp dữ liệu phù hợp để đưa vào LLM và xử lý hạ nguồn.
  • Đếm token và ước tính chi phí: Hàm count_tokens() cho ước lượng số token để theo dõi mức dùng API so với cửa sổ ngữ cảnh lớn của DeepSeek. Còn estimate_cost() chuyển đổi số token này thành phản hồi chi phí theo thời gian thực dựa trên giá OpenRouter cho đầu vào và đầu ra, giúp người dùng nắm rõ ngân sách tính toán cho mỗi truy vấn.
  • Tạo bản xem trước: Hàm preview_pdf_text() tạo bản xem trước rút gọn, cho phép người dùng kiểm tra tính toàn vẹn và mức liên quan của nội dung trích xuất trước khi phát sinh chi phí mô hình hoặc chạm giới hạn API.

Với các khối xây dựng này, giờ ta có thể lắp ghép trọn vẹn ứng dụng Streamlit cho Hỏi & Đáp bài nghiên cứu theo ngữ cảnh dài, mang tính tác tử.

Bước 2.3: Ứng dụng Streamlit

Với các tiện ích cốt lõi đã có, giờ ta ghép giao diện người dùng Streamlit chính, kết nối xử lý PDF, ước tính token/chi phí, Hỏi & Đáp do người dùng điều khiển và tương tác trực tiếp với DeepSeek V3.1 qua OpenRouter. 

st.header("Research Paper Assistant")pdf_file = st.file_uploader("Upload your research paper (PDF)", type=["pdf"])if "paper_text" not in st.session_state or st.session_state.get("last_uploaded") != pdf_file:    if pdf_file is not None:        with st.spinner("Extracting text from PDF..."):            st.session_state.paper_text = pdf_to_text(pdf_file)            st.session_state.last_uploaded = pdf_file            st.success(f"PDF uploaded. Total characters extracted: {len(st.session_state.paper_text):,}")            with st.expander("Preview of extracted PDF text:"):                st.code(preview_pdf_text(st.session_state.paper_text), language='markdown')paper_text = st.session_state.get("paper_text")if paper_text:    input_tokens = count_tokens(paper_text)    st.caption(f"Estimated input tokens: {input_tokens:,} (Estimated input cost: ${estimate_cost(input_tokens):.3f})")    question = st.text_area("Ask a question about this paper:", height=80, placeholder="E.g. What are the main findings?")    mode = st.radio(        "Select Mode",        ["Explain in Brief (Non-Think)", "Explain in Detail (Think)"],        horizontal=True,    )    go = st.button("Get Answer", use_container_width=True)    if question and go:        if mode == "Explain in Brief (Non-Think)":            prompt = (                f"{paper_text}\n\n"                f"Question: {question}\n"                "First, answer in a few sentences. Then, quote 1–2 exact sentences from the above paper that best support your answer. "                "Show each quote on a new line."            )            thinking_flag = False            header = "Explain in Brief (Non-Think)"        else:            prompt = (                f"{paper_text}\n\n"                f"Question: {question}\n"                "First, answer in detail with reasoning and evidence. Then, quote 2–3 exact sentences from the above paper that most strongly support your answer. "                "List the quotes after your answer."            )            thinking_flag = True            header = "Explain in Detail (Think)"        with st.spinner(f"Generating answer..."):            start_time = time.perf_counter()            try:                response = client.chat.completions.create(                    model="deepseek/deepseek-chat-v3.1",                    messages=[                        {"role": "system", "content": "You are a helpful research assistant."},                        {"role": "user", "content": prompt}                    ],                    max_tokens=900,                    extra_body={"thinking": thinking_flag},                 )                answer = response.choices[0].message.content.strip()                output_tokens = count_tokens(answer)            except Exception as e:                answer = f"Error: {e}"                output_tokens = 0            end_time = time.perf_counter()            elapsed_time = end_time - start_time            parts = re.split(r"(?:^|\n)(Quotes?:?)", answer, flags=re.IGNORECASE)            if len(parts) >= 3:                main_answer = parts[0].strip()                quotes = parts[2].strip()            else:                main_answer = answer                quotes = None            st.markdown(f"### {header}")            st.info(f"Time taken: {elapsed_time:.2f} seconds | Output tokens: {output_tokens} (Est. output cost: ${estimate_cost(output_tokens, 'output'):.3f})")            st.write(main_answer)            if quotes:                st.markdown("**Supporting Quotes:**")                st.success(quotes)

Ứng dụng Streamlit này triển khai một trợ lý bài báo nghiên cứu động dùng DeepSeek V3.1, xử lý mọi thứ từ nạp tài liệu đến Hỏi & Đáp theo ngữ cảnh với LLM. Các chức năng chính do ứng dụng Streamlit đảm trách gồm:

1. Tải PDF và bộ nhớ đệm

Người dùng tải tệp PDF qua giao diện, sau đó:

  • Ứng dụng kiểm tra st.session_state xem tệp có mới không. Nếu có, nó trích xuất văn bản và lưu vào session_state cùng tham chiếu tải lên, tránh việc trích xuất lặp lại ở mỗi tương tác.
  • Sau khi trích xuất, ứng dụng hiển thị xem trước khoảng 600 ký tự đầu của tài liệu, kèm thống kê như số ký tự, ước tính token đầu vào và chi phí.

2. Truy vấn của người dùng và chọn chế độ

Khi tài liệu đã nạp, người dùng có thể nhập câu hỏi và chọn giữa Non-think và Think, trong đó giao diện điều chỉnh hướng dẫn nhắc lệnh cho từng chế độ:

  • Non-think mode: Trả về câu trả lời ngắn với 1–2 trích dẫn hỗ trợ từ bài báo.
  • Think mode: Trả về câu trả lời chi tiết, có dẫn chứng với 2–3 trích dẫn hỗ trợ.

3. Thiết kế prompt và gọi API

Khi người dùng nhấp "Get Answer", ứng dụng sẽ:

  • Xây dựng prompt giàu ngữ cảnh, chèn nội dung bài báo, câu hỏi và hướng dẫn trả lời.
  • Đặt tham số thinking trong yêu cầu API OpenRouter (extra_body={"thinking": thinking_flag}), đảm bảo mô hình chạy ở đúng chế độ suy luận thay vì dựa vào nhiệt độ.
  • Đo thời gian suy luận, số token đầu ra và chi phí cho mỗi phản hồi, rồi hiển thị để minh bạch.

4. Hậu xử lý và hiển thị

Câu trả lời trả về được phân tách để tách phản hồi chính và các trích dẫn hỗ trợ (nếu có). Sau đó, cả câu trả lời và trích dẫn được hiển thị trong giao diện, làm nổi bật bằng chứng văn bản chính xác từ bài báo nguồn.

Để tự thử, hãy lưu mã dưới tên app.py và khởi chạy:

streamlit run app.py

Trong các thử nghiệm của tôi, DeepSeek V3.1 mất nhiều thời gian hơn đáng kể để tạo câu trả lời “think” chi tiết so với phản hồi “non-think” ngắn. Lý do là đầu ra dài hơn và có lập luận cần nhiều tính toán và thời gian hơn.

Kết luận

Hướng dẫn này minh họa cách chúng ta có thể dùng DeepSeek V3.1 để xây dựng một trợ lý bài báo nghiên cứu tương tác có khả năng phân tích tài liệu dài, đưa ra cả câu trả lời súc tích lẫn chi tiết, và theo dõi chi phí theo thời gian thực—tất cả trong một ứng dụng Streamlit. Nếu bạn muốn tiếp tục xây dựng dự án với DeepSeek, tôi khuyên bạn xem hướng dẫn về DeepSeek V3.2-Speciale mới.

Aashi Dutt

Tác giả

Aashi Dutt

Tôi là Chuyên gia Google Developers trong lĩnh vực ML (Gen AI), Chuyên gia Kaggle 3x và Đại sứ Women Techmakers với hơn 3 năm kinh nghiệm trong ngành công nghệ. Tôi đồng sáng lập một startup công nghệ y tế vào năm 2020 và hiện đang theo học thạc sĩ khoa học máy tính tại Georgia Tech, chuyên sâu về học máy.

Chủ đề

Liên quan