带有MCP和RAG的Llamafile故事生成器
一个Python项目,使用LangChain连接到本地运行的llamafile,并使用MCP(模型上下文协议)桥 模拟工具调用 以及使用《精灵宝钻》作为背景的RAG(检索增强生成)。
特性
- 模拟MCP工具调用:使用基于提示的工具调用与任何LLM(Gemma、DeepSeek等)配合使用
- 多种工具:故事生成的三个示例工具(角色名称、地点、事件)
- 检索增强生成:使用《精灵宝钻》文本提供丰富的上下文知识
- 本地法学硕士:完全使用骆驼纤维在当地运行
- 可靠的:基于Flask的简单网桥,易于调试和理解
运作原理
大多数开源LLM(包括Gemma和DeepSeek-R1) 不支持原生OpenAI风格的函数调用该项目通过以下方式解决了这一问题:
- 法学硕士教学 以特定格式输出工具调用:
TOOL_CALL: function_name(args) - 解析 LLM的文本输出,用于检测工具调用
- 执行 MCP工具,并将结果注入到对话中
- 继续 与工具的对话结果
对于许多模型,这种“模拟”方法比本机函数调用更可靠。
安装
使用uv安装依赖项:
uv sync依赖关系包括:
langchain和langchain-openai用于LLM集成flask和requests对于MCP桥faiss-cpu和sentence-transformers对于RAGmcp用于MCP服务器协议
用法
1.开始你的羊驼之旅(1号航站楼)
推荐:Gemma(速度更快)
~/programas/google_gemma-3-12b-it-Q4_K_M.llamafile --server --nobrowser -ngl 18 --gpu nvidia替代方案:DeepSeek(速度较慢但体积较大)
~/programas/DeepSeek-R1-Distill-Qwen-14B-Q4_K_M.llamafile --server --nobrowser -ngl 32 --gpu nvidia等到你看到 llama server listening at http://localhost:8080
2.启动MCP电桥(端子2)
桥接代码被拆分为一个库和一个示例运行器。
- 图书馆:
mcp_bridge_flask.py出口create_bridge_app(...)和run_bridge(...). - 跑步者示例:
mcp_bridge_example.py定义示例工具(elf名称、位置、事件)并运行桥。
运行示例网桥:
python mcp_bridge_example.py您应该看到类似以下内容:
Starting example bridge on http://127.0.0.1:8081 using local example tools
* Running on http://127.0.0.1:80813.运行故事生成器(终端3)
简单版本(无RAG,快速):
uv run python llm_story_simple.py完整版(含Silmarillion的RAG):
uv run python llm_story_working.py增强版(使用多种工具):
uv run python llm_story_with_tools.py示例客户端(调用 llm_query):
python llm_story.py这将:
- 检查MCP网桥连接
- 为RAG加载精灵宝钻(如果使用
llm_story_working.py) - 检索有关精灵、艺术和Valinor的相关上下文
- 请求一个关于精灵学习绘画的故事
- LLM输出
TOOL_CALL: get_elf_name(count=1) - 该桥调用MCP工具并获得一个名称(例如,“Luis Agulló”)
- LLM可以根据需要调用其他工具(位置、事件)
- LLM使用工具结果和RAG上下文生成托尔金风格的故事
测试
测试桥梁是否正常工作:
uv run python test_simple_bridge.py测试所有三个工具:
uv run python test_all_tools.py检查桥梁健康状况:
curl http://127.0.0.1:8081/health直接调用测试工具:
uv run python test_tool_calling.py项目结构
.
.├── mcp_bridge_flask.py # Library: factory `create_bridge_app` and helper `run_bridge`
.├── mcp_bridge_example.py # Runnable example that defines local tools and runs the bridge
.├── mcp_server.py # MCP server (generic API, no default tools)
.├── llm_query.py # LangChain integration with RAG (fallbacks when libs missing)
.├── llm_story.py # Example client that calls `llm_query` (default example)
.├── llm_story_simple.py # Simple story generator (no RAG)
.├── llm_story_working.py # Full RAG + MCP story generator
.├── llm_story_with_tools.py # Using multiple tools
.├── test_simple_bridge.py # Test the bridge
.├── test_all_tools.py # Test all three tools
.├── test_deepseek_tools.py # Test if models support native function calling
.├── silmarillion.txt # RAG knowledge base
.├── README.md # This file
.└── TOOLS_REFERENCE.md # Complete tools documentation哪些模型支持本机函数调用?
根据测试:
✅ 支持本机函数调用:
- GPT-4、GPT-4 Turbo、GPT-3.5 Turbo(OpenAI API)
- Claude 3+(无烟煤API)
- 西北风大,西北风7B-Instruct-v0.2+
- Nous Hermes模特(经过专门训练)
- 功能模型(专门设计)
❌ 不支持本机函数调用:
- 杰玛 (我们正在使用的)-使用模拟桥
- DeepSeek-R1 -使用模拟桥梁
- LLaMA 2(LLaMA 3有部分支持)
- Phi模型
- 无
解决方案: 使用 mcp_bridge_simple.py 适用于所有型号!
故障排除
桥超时
- DeepSeek-R1 由于思维链推理,速度非常慢
- 切换到 杰玛 以获得更快的响应
- 减小上下文大小或故事长度
- 增加网桥中的超时时间
LLM不调用该工具
- 确保您正在使用
mcp_bridge_simple.py(不是mcp_bridge.py) - 模拟桥向LLM教授工具调用语法
- 检查网桥日志,查看是否检测到工具调用
端口已在使用中
pkill -f "mcp_bridge"高级:创建自己的MCP工具
该系统现在包括 三个示例工具:
get_elf_name(count=1)-生成字符名称get_location_description(style='brief')-生成设置get_random_event()-生成绘图事件
看 工具_参考.md 以获取完整的文档。
快速添加工具示例
编辑 mcp_server.py 添加新工具:
@app.list_tools()
async def list_tools() -> list[Tool]:
return [
Tool(
name="your_tool_name",
description="What your tool does",
inputSchema={
"type": "object",
"properties": {
"param": {"type": "string", "description": "Parameter description"}
}
}
)
]
@app.call_tool()
async def call_tool(name: str, arguments: dict) -> list[TextContent]:
if name == "your_tool_name":
result = do_something(arguments["param"])
return [TextContent(type="text", text=result)]然后将工具添加到 mcp_bridge_simple.py 在 call_mcp_tool() 功能。
许可证
麻省理工学院
