Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Important
Server Protokol Konteks Model SQL (MCP) tersedia di pembuat API Data versi 1.7 dan yang lebih baru. Untuk kemampuan terbaru dan perbaikan bug, gunakan rilis 2.0 terbaru.
Server SQL Model Context Protocol (MCP) berfungsi dengan klien yang kompatibel dengan MCP, bukan hanya layanan AI yang dihosting cloud. Jika lingkungan Anda membatasi akses model bahasa besar cloud (LLM) —umum dalam industri kesehatan, pertahanan, keuangan, energi, dan maritim—Anda dapat menghubungkan model lokal yang disajikan melalui Ollama atau alat serupa. Panduan ini mencakup pengaturan, konfigurasi metadata bidang, dan pola prompt yang membuat model lokal kecil dapat diandalkan.
Prasyarat
- CLI Data API Builder diinstal dan dikonfigurasi dengan setidaknya satu entitas. PasangCLI .
-
Ollama dengan model yang mendukung panggilan alat (misalnya,
qwen3:8b,llama3.1:8b). -
Python 3.10+ dengan paket
mcpdanollama. - Instans SQL Server yang berjalan dengan data.
Langkah 1: Mengonfigurasi metadata bidang
Metadata bidang adalah langkah konfigurasi terpenting untuk akurasi model lokal. Tanpa nama dan deskripsi bidang, agen hanya melihat nama entitas dan menebak nama kolom dengan salah.
Warning
Melewati langkah ini menghasilkan server MCP yang secara teknis berfungsi tetapi secara fungsional tidak dapat digunakan oleh model apa pun yang membaca respons alat. Model tersebut tidak memiliki informasi tentang kolom Anda.
Tambahkan entitas Anda dengan deskripsi, lalu tambahkan deskripsi bidang yang menyertakan nilai yang valid untuk kolom yang dibatasi:
dab add ServerInventory \
--source dbo.ServerInventory \
--permissions "anonymous:read" \
--description "SQL Server instance inventory with version, environment, and sizing data"
dab update ServerInventory \
--fields.name InstanceName --fields.primary-key true \
--fields.description "SQL Server instance name (e.g., YOURSERVER01)"
dab update ServerInventory \
--fields.name Environment \
--fields.description "Deployment environment. Valid values: Prod, Dev, Test, UAT"
Untuk referensi CLI lengkap dan praktik terbaik—termasuk nilai yang dibatasi, deskripsi parameter, dan pola pembuatan skrip—lihat Menambahkan deskripsi ke entitas.
Note
dab update CLI memperlakukan koma sebagai pemisah argumen. Jika deskripsi Anda berisi koma, edit dab-config.json langsung sebagai gantinya.
Langkah 2: Mulai SQL MCP Server
dab start
SQL MCP Server mendengarkan pada http://localhost:5000/mcp menggunakan transport HTTP streaming secara default. Setiap klien yang mengimplementasikan protokol MCP dapat terhubung ke titik akhir ini.
Langkah 3: Sambungkan model lokal Anda
Bangun klien MCP yang menghubungkan model Ollama Anda ke SQL MCP Server. Contoh Python berikut menggunakan MCP Python SDK dan paket ollama.
Pasang dependensi
pip install mcp ollama
Harness Python minimal
import asyncio
import json
from mcp import ClientSession
from mcp.client.streamable_http import streamable_http_client
import ollama
MCP_URL = "http://localhost:5000/mcp"
MODEL = "qwen3:8b"
async def get_schema(session: ClientSession) -> str:
"""Call describe_entities and format results for the system prompt."""
result = await session.call_tool("describe_entities", arguments={})
entities = json.loads(result.content[0].text)
lines = []
for entity in entities.get("entities", []):
fields = ", ".join(
f"{f['name']} ({f.get('description', 'no description')})"
for f in entity.get("fields", [])
)
lines.append(f"- {entity['name']}: {entity.get('description', '')}")
if fields:
lines.append(f" Fields: {fields}")
return "\n".join(lines)
async def run(user_question: str):
async with streamable_http_client(MCP_URL) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
# Preinject schema into the system prompt
schema_text = await get_schema(session)
system_prompt = f"""You query a SQL database through MCP tools.
Available entities:
{schema_text}
Rules:
- Use the exact field names shown above.
- Answer count questions with the count only.
- Do not produce summaries unless asked.
- Do not invent example data. Only return data from tool responses.
- If no results, say "No results found" and stop.
"""
# Get available tools for Ollama
tools_result = await session.list_tools()
ollama_tools = [
{
"type": "function",
"function": {
"name": t.name,
"description": t.description or "",
"parameters": t.inputSchema,
},
}
for t in tools_result.tools
]
messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_question},
]
# Chat loop: let the model call tools until it produces a final answer
while True:
response = ollama.chat(
model=MODEL, messages=messages, tools=ollama_tools
)
msg = response["message"]
messages.append(msg)
if not msg.get("tool_calls"):
print(msg["content"])
break
for tc in msg["tool_calls"]:
result = await session.call_tool(
tc["function"]["name"],
arguments=tc["function"]["arguments"],
)
messages.append(
{
"role": "tool",
"content": result.content[0].text,
}
)
asyncio.run(run("How many SQL 2019 servers are in production?"))
Harness ini menangani siklus penuh: prainjeksi skema, penemuan alat, panggilan alat multi-giliran, dan ekstraksi jawaban akhir. Sesuaikan MODEL dan MCP_URL untuk lingkungan Anda.
Prasuntik skema saat memulai
Model lokal kecil (di bawah parameter 14B) menghasilkan panggilan alat yang lebih andal ketika metadata skema berada di prompt sistem sebelum percakapan dimulai. Alih-alih mengandalkan model untuk memanggil describe_entities sendiri selama percakapan, panggil di harness startup dan masukkan hasilnya.
Mengapa pra-injeksi penting
| Approach | Perilaku dengan model kecil |
|---|---|
| Penemuan dinamis | Model harus memutuskan untuk memanggil describe_entities terlebih dahulu, lalu menginterpretasikan hasil, lalu memanggil alat yang tepat dengan nama bidang yang benar. Beberapa titik kegagalan. |
| Preinjeksi | Model langsung melihat nama entitas, nama kolom, dan deskripsi. Lakukan pemanggilan alat dengan benar pada percobaan pertama. |
Contoh harness di bagian sebelumnya menunjukkan pola ini. Fungsi get_schema() memanggil describe_entities sekali pada saat startup dan memformat hasilnya ke dalam prompt sistem.
Tip
Model cloud yang lebih besar (GPT-4o, Claude) biasanya dapat mengenali skema selama percakapan tanpa preinjeksi. Pola ini paling berharga untuk model di bawah parameter 14B.
Membatasi respons model
Sebuah model dapat melakukan pemanggilan alat yang benar, mengambil data yang tepat, dan namun tetap menghasilkan jawaban yang salah. Misalnya, model yang ditanya "ada berapa server produksi?" mungkin mengambil 16 baris dengan benar, lalu menjawab dengan ringkasan eksekutif sepanjang 40 baris yang berisi contoh yang dihalusinasikan alih-alih memberikan angka 16.
Tambahkan aturan negatif eksplisit ke prompt sistem Anda:
Rules:
- Answer count questions with the count only.
- Do not produce summaries unless the user asks for one.
- Do not invent example data. Only return data from tool responses.
- If a tool returns no results, say "No results found" and stop.
Keakuratan panggilan alat dan disiplin jawaban adalah masalah yang berbeda. DAB memastikan pengambilan data yang akurat melalui lapisan alat. Prompt harness Anda mengontrol bagaimana model menyajikan hasil.
Considerations
| Topic | Rincian |
|---|---|
| Perangkat Keras | Pemanggilan alat dapat berjalan pada perangkat keras sederhana. Model parameter 8B pada GPU Nvidia konsumen (RAM video 8 GB) menghasilkan hasil yang berguna. Perkirakan latensi dalam kisaran puluhan detik per pertanyaan, sehingga cocok untuk beban kerja batch. |
| Batch vs. interaktif | Model kecil sangat cocok untuk pemrosesan batch (laporan performa, kueri inventaris) di mana toleransi latensi lebih tinggi. |
| Ketersediaan alat | Alat aggregate_records ini hanya tersedia di versi 2.0 dan yang lebih baru. Pada versi 1.7.x, kueri hitungan dan agregasi memaksa model untuk membaca semua baris yang cocok. Lihat ketersediaan alat menurut versi. |
| Transportasi | Model lokal terhubung ke /mcp melalui HTTP streaming.
transpor input/output standar (stdio) adalah alternatif untuk konfigurasi proses tunggal. |
| Authentication | Untuk pengembangan lokal, gunakan izin anonymous. Untuk produksi, konfigurasikan autentikasi yang sesuai dengan lingkungan Anda. |