Add initial implementation of MCP server and related tools for BMI calculation

This commit is contained in:
Xin Wang
2026-08-20 00:07:25 +08:00
commit 6502adb1e1
7 changed files with 635 additions and 0 deletions

94
rag.py Normal file
View File

@@ -0,0 +1,94 @@
"""稀疏检索 / 简单 RAG"""
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
# 1. 简单切块
def chunk_text(text, chunk_size=60, overlap=15):
chunks = []
start = 0
while start < len(text):
end = start + chunk_size
chunk = text[start:end]
chunks.append(chunk)
if end >= len(text):
break
start = end - overlap
return chunks
# 2. 知识库原文
document = """
职工请事假,应当提前一个工作日通过OA系统提交申请,
经部门负责人审批同意后方可休假。
职工因疾病无法正常工作的,可以申请病假。
病假应当提供医院出具的相关证明材料。
员工因工作需要出差的,应提前提交出差申请。
住宿费用按照公司差旅管理制度规定的标准报销。
职工连续工作满一年后可以享受带薪年休假。
年休假天数根据职工累计工作年限确定。
""".replace("\n", "")
# 3. 文档切块
chunks = chunk_text(
document,
chunk_size=60,
overlap=15
)
print("=== chunks ===")
for i, chunk in enumerate(chunks):
print(i, chunk)
# 4. 给所有 chunk 建 TF-IDF 索引
vectorizer = TfidfVectorizer(
analyzer="char",
ngram_range=(1, 3)
)
doc_vectors = vectorizer.fit_transform(chunks)
# 5. 用户问题
query = "事假怎么申请?"
# 6. Query 转成同一个 TF-IDF 空间
query_vector = vectorizer.transform([query])
# 7. 计算 query 与所有 chunk 的相似度
scores = cosine_similarity(
query_vector,
doc_vectors
)[0]
# 8. Top-K
top_k = 3
top_indices = scores.argsort()[::-1][:top_k]
print("\n=== query ===")
print(query)
print("\n=== retrieval result ===")
for index in top_indices:
print(
f"score={scores[index]:.4f}",
chunks[index]
)