Checklist Khi Sử Dụng Copilot
- Chọn AI Model phù hợp: Chọn giữa các models cho fast coding hoặc planning/reasoning.
- Chọn Mode phù hợp: Sử dụng công cụ tối ưu cho việc chỉnh sửa, đặt câu hỏi hoặc duy trì flow writing code.
- Config instruction (rule): Sử dụng custom instructions (chính là rule) để get suggestion code chuẩn convention coding và structure.
- Prompt engineering:Viết prompt hiệu quả và cung cấp ngữ cảnh để nhận được response tốt nhất.
- Workspace index (Lập Chỉ Mục Cho Workspace): Nhận responses chính xác cho các câu hỏi về Codebase.
- Tái sử dụng prompt: Tiết kiệm thời gian bằng cách lưu và tái sử dụng prompt cụ thể cho task (nhiệm vụ) trong project.
1. Chọn Model AI Phù Hợp
Copilot cung cấp nhiều Model AI khác nhau để lựa chọn, tùy thuộc vào nhu cầu cụ thể của:
- Fast coding: Phù hợp cho các task viết code nhanh và không phức tạp.
- GPT-4o
- GPT-4.1 (base của Github Copilot)
- Gemini 2.0 Flash
- Reasoning/planning: Thích hợp cho các tác vụ yêu cầu suy luận và lập kế hoạch phức tạp.
- Claude Sonnet 3.7 (Thinking)
- Claude Sonnet 4.0 (Thinking)
- Claude Opus 4.0 Thinking
- Gemini 2.5 Pro
2. Chọn Mode Phù Hợp
Mode | Trường Hợp Sử Dụng |
Code completions | Nhận inline suggestion trực tiếp khi coding và viết comment để generate code trực tiếp (Bật NES trong setting để multiple tab trong file) |
Chat | Tạo từng chat conversation với nghiệp vụ cụ thể để brainstorming design ideas, lên planning hoặc nhận code suggestions đúng nhất |
Edit | Sử dụng ngôn ngữ tự nhiên để bắt đầu phiên chỉnh sửa mã. Tự động áp dụng thay đổi mã lớn trên nhiều file trong workspace. |
Agent | Thực hiện các yêu cầu cấp cao bằng cách bắt đầu luồng mã hóa tác nhân. Copilot tự động gọi nhiều công cụ để lập kế hoạch và thực hiện các thay đổi mã và nhiệm vụ cần thiết. |
2.1 Chi tiết cách sử dụng các Mode:
2.1.1 Ask Mode
Trường hợp sử dụng
- Cần giải thích đoạn code phức tạp
- Tìm hiểu khái niệm hoặc kiến thức mới chưa biết (nên đính kèm link doc của website)
- Debug, tìm nguyên nhân
- Tìm kiếm ý tưởng hoặc giải pháp cho nghiệp vụ hoặc tính năng cụ thể.
Ưu điểm
- Phản hồi nhanh
- Không edit file code hiện tại
- Tập trung vào kiến thức hơn là chỉnh sửa
2.1.2 Edit Mode
Trường hợp sử dụng
- Thay đổi định dạng/cấu trúc code (refactor code)
- Thực hiện thay đổi nhỏ trên nhiều file
- Tạo chức năng đơn giản không cần sử dụng tool hay thinking của agent
Ưu điểm
- Tập trung vào thay đổi chi tiết cụ thể 1 phần nhỏ
- Có preview trước code khi accept/reject
- Ít rủi ro hơn Agent mode
2.1.3 Agent Mode
Trường hợp sử dụng
- Tạo feature phức tạp trên nhiều file cần chi tiết theo structure rule hoặc convention.
- Refactor logic nghiệp vụ phức tạp.
- Cần cung cấp thêm context data từ nguồn bên ngoài bằng các dùng tool (MCP server).
Ưu điểm
- Gọi nhiều tool của IDE và tool của MCP bên ngoài để thực hiện nhiều step.
- Hiểu toàn cục của ngữ cảnh (context).
- Khả năng tự động hóa cao hơn (nếu setting auto approve)
3. Config Instruction (Rule)
Khi Copilot generates code or trả lời questions, nó cố gắng phù hợp với source code hiện tại như libraries you use hoặc cách đặt tên cho các biến, …. Tuy nhiên, nó có thể không luôn có đủ context để làm điều này hiệu quả. Ví dụ: Nếu làm việc với version framework (hoặc library) cụ thể, cần cung cấp ngữ cảnh bổ sung trong prompt của mình.
Để nâng cao phản hồi AI, có thể sử dụng instructions files để cung cấp chi tiết context về coding practices, coding vention, tools hoặc chi tiết spec. Có thể đính kèm các instructions này vào prompt chat hoặc áp dụng chúng tự động.
Có thể thêm instruction (rule) global cho project (workspace) vào file .github/copilot-instructions.md
3.1 Để tạo instruction (rule) mới
- Chạy lệnh Chat: New Instructions File từ Command Palette (Ctrl/Cmd + Shift + P)
- Lệnh này tạo tệp .instructions.md trong thư mục .github/instructions.
- Thêm hướng dẫn ở định dạng Markdown vào tệp. Ví dụ:
# Custom instructions for Copilot
## Project context
This project is a web application built with React and Node.js.
## Indentation
We use tabs, not spaces.
## Coding style
Use camelCase for variable names and prefer arrow functions over traditional function expressions.
## Testing
We use Jest for unit testing and Playwright for end-to-end testing.
- Tùy chọn, thêm mẫu glob vào trường metadata applyTo để chỉ định file nào áp dụng instructions.
—
applyTo: “**/*.ts”
—
Coding practices for TypeScript files
…
3.2 Sử dụng instruction (rule) trong chat
- Chọn Add Context
- Chọn Instructions..
- Chọn instruction đã tạo trong project
4. Prompt Engineering (Kỹ Thuật Viết Prompt)
Nâng cao chất lượng response của Copilot bằng cách sử dụng prompt hiệu quả. Một prompt được viết tốt có thể giúp Copilot hiểu requements tốt hơn và tạo ra suggestion code phù hợp hơn.
4.1 Bắt đầu chung chung, sau đó cụ thể hóa
Generate a Calculator class.
Add methods for addition, subtraction, multiplication, division, and factorial.
Don‘t use any external libraries and don’t use recursion.
4.2 Cung cấp ví dụ về những mình gì muốn
Generate a function that takes a string and returns the number of vowels in it.
Example:
findVowels(“hello”) returns 2
findVowels(“sky”) returns 0
4.3 Phân chia tasks phức tạp (complex) thành nhiều task đơn giản (simpler) hơn
Thay vì yêu cầu Copilot tạo project lập kế hoạch bữa ăn, hãy chia nhỏ thành các task nhỏ hơn:
- Generate a function nhận danh sách nguyên liệu và trả về danh sách công thức.
- Generate a function nhận danh sách công thức và trả về danh sách mua sắm.
- Generate a function nhận danh sách công thức và trả về kế hoạch bữa ăn cho tuần.
4.4 Cung cấp context và tools phù hợp
Cần context đầy đủ và phù hợp cho prompt để nhận được anwser chính xác và phù hợp hơn trong chat. Với các tools phù hợp, có thể tăng năng suất (productivity) phát triển nhiều.
- Trong Agent Mode, chọn nút Select Tools… để cung cấp các tools biết chắc chắn cần sử dụng hoặc thêm tools rõ ràng vào prompt bằng # + {tool}
- Sử dụng #codebase để cho phép Copilot tìm tệp phù hợp tự động bằng cách thực hiện tìm kiếm mã (Nếu không biết chắc chắn ở đâu thì mới dùng để AI find code còn nếu biết chắc chắn thì nên target thẳng đên code scope luôn)
- Sử dụng công cụ #fetch (bên Cursor thì chỉ cần vứt link website vào hoặc @web) để lấy nội dung từ trang web hoặc sử dụng #githubRepo để thực hiện tìm kiếm code trên kho lưu trữ GitHub.
- Thêm tham chiếu file, folder hoặc symbol trong prompt bằng cách sử dụng #<file name>, #<folder name> hoặc #<symbol>(eg: #sym:handleCreateXXX).
- Kéo thả file, folder hoặc tab đang trình chỉnh sửa vào prompt chat để cung cấp nhưng phần liên quan đến modify hoặc đặt question explain.
- Thêm problems, test failures hoặc terminal output vào prompt chat để có đầy đủ context cụ thể cho kịch bản đang bị lỗi.
- Thêm images hoặc screenshots vào prompt để cho phép Copilot phân tích hình ảnh.
- Trong Agent Mode, prompt preview project để mở trực tiếp bằng trình duyệt tích hợp sẵn trong vscode.
Khi sử dụng Agent Mode, Copilot tự động tìm các file và context phù hợp (cách này để tối ưu thời gian tìm nghiên cứu, sau khi target được phạm vi nhất định thì nên target chuẩn context để có kết quả chính xác nhất ở một session chat mới – trick: có thể tìm hiểu rồi viết nội dung vào file .md sau đó ở session chat khác bảo Agent phân tích và sửa lỗi (Cursor có thể add context @Past Chats để lấy context trong chat khác)).
4.4.1 Tips and Tricks sử dụng codebase (workspace) context
Cách diễn đạt câu hỏi có thể ảnh hưởng đáng kể đến chất lượng context và độ chính xác của anwser. Để optimize results, hãy sử dụng các tips sau:
- Hãy nêu câu hỏi cụ thể và chi tiết, tránh những thuật ngữ mơ hồ (avoiding vague) hoặc không rõ ràng (ambiguous terms) như what does this do(cái này có tác dụng gì) (trong đó “cái này“(this) có thể được hiểu là câu trả lời cuối cùng, current file hoặc toàn bộ dự án (whole project), …).
- Kết hợp các thuật ngữ (terms) và khái niệm (concepts) có khả năng xuất hiện trong code hoặc document vào prompt.
- Xem lại các tài liệu tham khảo (used references) đã sử dụng trong các response (anwser) trước để đảm bảo các file có liên quan. Lặp lại câu hỏi nếu cần.
- Bao gồm context có liên quan một cách rõ ràng bằng cách slsecting code hoặc mentioning chat variables như #editor #selection or #<file name>
- Response có thể lấy từ nhiều tham chiếu (references), chẳng hạn như find exceptions without a catch block (tìm ngoại lệ mà không có khối catch) hoặc provide examples of how handleError is called(cung cấp ví dụ về cách gọi handleError). Tuy nhiên, đừng mong đợi phân tích code toàn diện trên codebase, chẳng hạn như how many times is this function invoked?(hàm này được gọi bao nhiêu lần?) hoặc rectify all bugs in this project(sửa tất cả lỗi trong dự án này).
- Tránh đưa ra thông tin ngoài code (hiện tại), chẳng hạn như who contributed to this file?(ai đã đóng góp vào file này?) hoặc summarize review comments for this folder(tóm tắt các bình luận đánh giá cho thư mục này).
4.4.2 Sử dụng biến #codebase để tham chiếu toàn bộ source code (trong cursor /path-base-folder):
Where is the database connection string used in #codebase?
4.4.3 Sử dụng symbol để cung cấp code selection vào context:
use function #sym:handleCreateXXX for refactor #create-xxx.ts
Cách target phạm vi code bằng symbols (Symbols can be variables, functions, classes, methods, or other named elements in workspace)
Cách 1: Sử dụng # + {symbol} sau đó bấm tab. Ví dụ: #handleCreateXXX , #DEFAULT_HEIGHT
Cách 2: Bấm Add context → Symbols… → nhập tên biến, hàm, … → enter
Cursor IDE
Cách 1: @ + {symbol} (chỉ target từng symbol 1)
Cách 2: Bấm Add context → Code → nhập tên biến, hàm, … → check box (chọn được nhiều symbol)
4.5 Lặp lại prompt đến khi đạt được mong muốn (sau khi đặt mong muốn có thể chat nhờ verify thêm các use case, edge case)
Chat thêm các prompt tiếp để tinh chỉnh (refine) hoặc sửa đổi (modify) response. Ví dụ:
- Chat prompt 1: “Write a function to calculate the factorial of a number” → response
- Chat prompt 2: “Don’t use recursion and optimize by using caching” → response
- Chat prompt 3: “Use meaningful variable names” → response
4.6 Giữ lịch sử chat liên quan
Copilot sử dụng lịch sử trong cùng chat conversation để cung cấp ngữ cảnh (đây này gọi là context windows). Vì vậy, xóa các câu hỏi và phản hồi trước đó khỏi lịch sử nếu chúng không liên quan để đảm bảo không bị gerate thêm response mơ hồ hoặc là bị out of context (tự phải cắt ngắn context đã có đi).
Hoặc, tạo mới chat conversation nếu muốn thay đổi context cho 1 task mới hoặc question mới.
5. Workspace Index (Lập Chỉ Mục Cho Workspace)
Copilot sử dụng index để tìm kiếm nhanh chóng và chính xác trong source code (theo hiểu biết thì Cursor IDE hay bất kì AI code nào khác đều vậy):
- Remotely index: Dành cho các repo GitHub (có đăng nhập tài khoản github ở vscode), sử dụng tìm code của GitHub để lập index toàn bộ codebase, cho phép Copilot tìm kiếm nhanh chóng ngay cả với source code lớn.
- Locally index: Dành cho các kho lưu trữ không phải GitHub (không đăng nhập tài khoản github ở vscode hoặc code được để trên gitlab,… ), Copilot có thể tạo index cục bộ trên máy cá nhân để hỗ trợ tìm kiếm mã hiệu quả (không hỗ trợ lượng code lớn).
5.1 Chi tiết về indexing (Codebase indexing)
Tính năng Codebase không truyền toàn bộ mã nguồn vào context của mô hình ngôn ngữ (LLM). Thay vào đó, nó sử dụng một cơ chế tìm kiếm thông minh để trích xuất và sử dụng thông tin sau khi search ở codebase một cách hiệu quả.
5.1.1 Cách hoạt động của Codebase trong VSCode Copilot hay Cursor IDE
Indexing và Embedding:
- Khi mở một project, Cursor sẽ index toàn bộ codebase bằng cách chia nhỏ mã nguồn thành các đoạn nhỏ và tính toán embedding cho từng đoạn đó. Cursor sử dụng quá trình indexing để phân tích và hiểu cấu trúc của project, bao gồm:
- 1. Cấu trúc tệp
- 2. Định nghĩa hàm và lớp
- 3.Khai báo biến
- 4.Mối quan hệ giữa các phần của mã nguồn
- Các embedding này được lưu trữ trong một vector database trên cloud, cùng với thông tin về vị trí dòng và đường dẫn tương đối của tệp.
Truy xuất thông tin theo ngữ cảnh:
- Khi đặt câu hỏi hoặc yêu cầu về mã nguồn, Cursor sẽ sử dụng các embedding đã lưu để truy xuất các đoạn mã liên quan và chỉ đưa những phần cần thiết vào context của mô hình ngôn ngữ.
Giới hạn context:
- Do các mô hình ngôn ngữ lớn (LLMs) có giới hạn về kích thước context, việc truyền toàn bộ codebase là không khả thi. Thay vào đó, Cursor chỉ đưa vào context những phần mã có liên quan trực tiếp đến yêu cầu của prompt.
Sumary: Codebase của thằng cursor chỉ dựa vào indexing đó tìm kiếm ra text theo prompt đang ở các file nào (chi tiết tìm kiếm là: tìm kiếm ngữ nghĩa (semantic search) dựa trên embedding) rồi nó đưa nội dung cái file hoặc function code hoặc biến đó vào context chứ không phải codebase indexing đó là nó sẽ hiểu cả source code
ref: codebase indexing
6. Tái Sử Dụng prompt (Prompt Template)
File prompt cho phép lưu prompt cho một task cụ thể với context và instruction của nó trong file Markdown. Có thể đính kèm và tái sử dụng prompt đó trong chat. Nếu lưu prompt trong workspace, cũng có thể chia sẻ nó với team.
6.1 Tạo prompt tái sử dụng (prompt template)
- Tạo tệp prompt với lệnh Chat: New Prompt File trong Command Palette (Ctrl/Cmd + Shift + P)
- Lệnh này tạo tệp .prompt.md trong thư mục .github/prompts tại root workspace.
- Mô tả prompt và context liên quan ở định dạng Markdown.
Ví dụ, sử dụng prompt này để tạo new React form component.
Your goal is to generate a new React form component.
Ask for the form name and fields if not provided.
Requirements for the form:
– Use form design system components: [design-system/Form.md](../docs/design-system/Form.md)
– Use `react-hook-form` for form state management:
– Always define TypeScript types for your form data
– Prefer _uncontrolled_ components using register
– Use `defaultValues` to prevent unnecessary rerenders
– Use `yup` for validation:
– Create reusable validation schemas in separate files
– Use TypeScript types to ensure type safety
– Customize UX-friendly validation rules
VN:
– Mục tiêu của bạn là tạo thành phần biểu mẫu React mới.
– Yêu cầu tên biểu mẫu và trường nếu chưa được cung cấp.
Yêu cầu cho biểu mẫu:
– Sử dụng các thành phần hệ thống thiết kế biểu mẫu: [design-system/Form.md](../docs/design-system/Form.md)
– Sử dụng `react-hook-form` để quản lý form state
– Luôn định nghĩa TypeScript types cho form data
– Ưu tiên _uncontrolled_ components bằng cách sử dụng register
– Sử dụng `defaultValues` để ngăn chặn rerender không cần thiết
– Sử dụng `yup` để xác thực
– Tạo validation schemas tái sử dụng trong các file riêng biệt
– Sử dụng TypeScript types để đảm bảo an toàn kiểu
– Tùy chỉnh quy tắc xác thực thân thiện với UX
– Tùy chọn, thêm metadata về cách chạy prompt trong chat. Sử dụng trường mode để chỉ định chế độ chat và trường tools để chỉ định tools cho Agent Mode
—
mode: “agent”
tools: [“githubRepo”, “codebase”]
description: “Generate a new React form component”
—
Your goal is to generate a new React form component based on the templates in #githubRepo contoso/react-templates.
Requirements for the form:
– Use form design system components: [design-system/Form.md](../docs/design-system/Form.md)
– Use `react-hook-form` for form state management:
– Always define TypeScript types for your form data
VN:
—
mode: “agent”
tools: [“githubRepo”, “codebase”]
description: “Tạo new React form component”
—
Mục tiêu của bạn là tạo một React form component mới dựa trên các mẫu trong #githubRepo contoso/react-templates.
Requirements for the form:
– Sử dụng các thành phần của hệ thống thiết kế biểu mẫu: [design-system/Form.md](../docs/design-system/Form.md)
– Sử dụng `react-hook-form` để quản lý form state
– Luôn định nghĩa TypeScript types cho form data
6.2 Sử dụng prompt templete trong chat
Sử dụng bằng cách type / + {prompt file name}
Ví dụ, nhập /new-react-form để run prompt template có tên .github/prompts/new-react-form.prompt.md