FastAPI + Ollama AI 角色参数设定指南

FastAPI + Ollama AI 角色参数设定指南

环境准备

pip install fastapi ollama httpx

确保 Ollama 服务已启动并运行在 http://localhost:11434

基础集成

基本 FastAPI 应用

from fastapi import FastAPI
import httpx

app = FastAPI()

@app.get("/query")
async def query_ollama(model: str, prompt: str):
    async with httpx.AsyncClient() as client:
        response = await client.post(
            "http://localhost:11434/api/generate",
            json={
                "model": model,
                "prompt": prompt
            }
        )
        return {"result": response.json()["response"]}

带系统提示词的聊天接口

from fastapi import FastAPI
import httpx

app = FastAPI()

@app.post("/chat")
async def chat_endpoint(request: dict):
    model = request.get("model", "deepseek-chat")
    messages = request.get("messages", [])
    system_prompt = request.get("system_prompt", "你是一个专业的AI助手")
    
    async with httpx.AsyncClient() as client:
        response = await client.post(
            "http://localhost:11434/api/chat",
            json={
                "model": model,
                "system": system_prompt,
                "messages": messages
            }
        )
        return {"result": response.json()}

多轮对话示例

# 第一次对话
response = await client.post(
    "http://localhost:11434/api/chat",
    json={
        "model": "deepseek-chat",
        "system": "你是一个专业的AI助手",
        "messages": [
            {"role": "user", "content": "你好,请帮我回答一个问题"}
        ]
    }
)
first_response = response.json()["response"]

# 第二次对话(包含历史)
response = await client.post(
    "http://localhost:11434/api/chat",
    json={
        "model": "deepseek-chat",
        "system": "你是一个专业的AI助手",
        "messages": [
            {"role": "user", "content": "你好,请帮我回答一个问题"},
            {"role": "assistant", "content": first_response},
            {"role": "user", "content": "请告诉我2024年的诺贝尔物理学奖获得者是谁"}
        ]
    }
)
final_response = response.json()["response"]

角色参数示例

1. 专业 AI 助手

system_prompt = """
你是一个专业的AI助手,擅长使用互联网和工具来解决用户的问题。
你必须严格按照以下规则进行:
1. 先分析用户请求,确定是否需要使用工具
2. 如果需要使用工具,调用相应的工具
3. 如果不需要使用工具,直接回答用户的问题
4. 如果不确定如何回答,可以向用户请求更多信息
"""

2. 专业翻译员

system_prompt = """
你是一个专业的翻译员,擅长将英文翻译成指定的语言。
你需要按照以下步骤工作:
1. 首先确认用户需要将英文翻译成哪种语言
2. 然后将英文翻译成指定的语言
3. 如果翻译过程中遇到困难,可以向用户请求帮助
4. 最终提供翻译结果和原始英文文本
"""

3. 专业程序员

system_prompt = """
你是一个专业的程序员,擅长使用代码解决用户的问题。
你需要按照以下步骤工作:
1. 首先确认用户需要解决的问题
2. 然后提供解决该问题的代码
3. 如果代码中有错误,可以向用户解释并请求反馈
4. 最终提供完整的解决方案和解释
"""

使用模板引擎

基础模板示例

from string import Template

# 定义系统提示词模板
system_prompt_template = """
你是一个专业的{specialty},擅长{skills}。
你需要按照以下步骤工作:
1. {step1}
2. {step2}
3. {step3}
"""

# 渲染模板
system_prompt = Template(system_prompt_template).substitute(
    specialty="AI助手",
    skills="回答各种问题",
    step1="分析用户请求",
    step2="使用可用工具解决问题",
    step3="提供清晰简洁的回答"
)

# 使用渲染后的提示词
async with httpx.AsyncClient() as client:
    response = await client.post(
        "http://localhost:11434/api/chat",
        json={
            "model": "deepseek-chat",
            "system": system_prompt,
            "messages": [{"role": "user", "content": "请帮我解决一个问题"}]
        }
    )

动态角色模板

from fastapi import FastAPI
from string import Template

app = FastAPI()

# 角色模板配置
ROLE_TEMPLATES = {
    "programmer": {
        "specialty": "程序员",
        "skills": "编写和调试代码",
        "step1": "理解需求",
        "step2": "编写代码",
        "step3": "测试和优化"
    },
    "translator": {
        "specialty": "翻译员",
        "skills": "中英文互译",
        "step1": "理解原文",
        "step2": "准确翻译",
        "step3": "润色和校对"
    },
    "teacher": {
        "specialty": "教师",
        "skills": "知识讲解",
        "step1": "分析问题",
        "step2": "深入浅出讲解",
        "step3": "总结和复习"
    }
}

@app.post("/dynamic-role")
async def dynamic_role_chat(role: str, user_prompt: str):
    if role not in ROLE_TEMPLATES:
        raise HTTPException(status_code=400, detail="不支持的角色类型")
    
    # 使用模板生成系统提示词
    system_prompt = Template(system_prompt_template).substitute(
        **ROLE_TEMPLATES[role]
    )
    
    async with httpx.AsyncClient() as client:
        response = await client.post(
            "http://localhost:11434/api/chat",
            json={
                "model": "deepseek-chat",
                "system": system_prompt,
                "messages": [{"role": "user", "content": user_prompt}]
            }
        )
        return response.json()

使用示例

# 使用程序员角色
response = await client.post(
    "/dynamic-role",
    json={
        "role": "programmer",
        "user_prompt": "请帮我写一个冒泡排序算法"
    }
)

# 使用翻译员角色
response = await client.post(
    "/dynamic-role",
    json={
        "role": "translator",
        "user_prompt": "请将这段代码注释翻译成中文"
    }
)

# 使用教师角色
response = await client.post(
    "/dynamic-role",
    json={
        "role": "teacher",
        "user_prompt": "请解释什么是递归"
    }
)

完整应用示例

from fastapi import FastAPI, HTTPException
import httpx
from typing import Dict, List, Optional
from pydantic import BaseModel

app = FastAPI()

class Message(BaseModel):
    role: str  # "user" 或 "assistant"
    content: str

class ChatRequest(BaseModel):
    model: str = "deepseek-chat"
    system_prompt: str = "你是一个专业的AI助手"
    user_prompt: str = "你好,请帮我回答一个问题"
    messages: Optional[List[Message]] = None

@app.post("/chat")
async def chat_endpoint(request: ChatRequest):
    try:
        ollama_messages = request.messages or []
        ollama_messages.append({"role": "user", "content": request.user_prompt})
        
        async with httpx.AsyncClient() as client:
            response = await client.post(
                "http://localhost:11434/api/chat",
                json={
                    "model": request.model,
                    "system": request.system_prompt,
                    "messages": ollama_messages
                }
            )
            
            if response.status_code != 200:
                raise HTTPException(
                    status_code=response.status_code,
                    detail=f"Ollama API调用失败: {response.text}"
                )
            
            return response.json()
            
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

API 使用说明

基本查询

  • 端点:GET /query
  • 参数:
    • model: 模型名称
    • prompt: 提示词

聊天接口

  • 端点:POST /chat
  • 请求体:
    {
      "model": "deepseek-chat",
      "system_prompt": "你是一个专业的AI助手",
      "user_prompt": "用户输入的问题",
      "messages": [
        {"role": "user", "content": "历史消息1"},
        {"role": "assistant", "content": "历史回复1"}
      ]
    }
    
### 使用 Ollama 创建机器学习模型 为了使用 Ollama 创建和部署本地机器学习模型,需遵循特定流程来确保顺利操作。此过程不仅涉及安装必要的软件包,还包括配置环境以及通过命令行工具管理模型。 #### 安装与初始化 对于希望基于 Ollama 平台构建新模型的开发者来说,首先要确保已正确设置了开发环境。这通常意味着要按照官方指南完成基础设置工作,比如安装 Docker 或其他容器化解决方案以便更好地隔离不同版本间的依赖关系[^1]。 #### 准备硬件资源 考虑到运行大型语言模型所需的计算能力,在准备阶段还需评估可用硬件条件。特别是内存大小方面的要求不可忽视;例如,如果打算训练或加载较小规模(如70亿参数量级)的语言模型,则至少需要配备有8GB RAM 的设备;而对于更大尺寸(如130亿参数级别),则建议拥有不低于16GB RAM 的计算机系统作为支撑平台[^2]。 #### 下载预训练权重文件 一旦确认好物理资源配置无误之后就可以着手获取预先训练好的模型权重了。这些可以从开源社区获得或者是购买商业授权的产品。下载完成后将其放置于指定目录下等待后续调用。 #### 编写微调脚本 针对具体应用场景可能还需要进一步调整现有架构使之更贴合实际需求——即所谓的“迁移学习”。此时可以编写Python脚本来实现这一目标。下面给出一段简单的代码片段用于展示如何利用Hugging Face Transformers库来进行快速原型设计: ```python from transformers import AutoModelForCausalLM, Trainer, TrainingArguments model_name_or_path = "path_to_your_pretrained_model" output_dir = "./results" training_args = TrainingArguments( output_dir=output_dir, num_train_epochs=3, per_device_train_batch_size=4, ) trainer = Trainer( model=model_name_or_path, args=training_args, train_dataset=train_dataset, eval_dataset=val_dataset, ) trainer.train() ``` 这段代码展示了怎样定义训练参数并通过`Trainer`类接口执行整个优化循环。当然这里只是提供了一个非常基本的例子,真实项目里往往涉及到更多细节上的考量,像数据增强策略的选择、超参搜索空间的设计等都值得深入研究。 #### 发布API服务端口 最后一步就是让创建出来的AI应用能够被外界访问到。借助Web框架Flask/Django或者FastAPI可以帮助迅速搭建起RESTful API服务器,并开放相应HTTP接口供客户端请求交互之用。同时也可以考虑集成Swagger UI组件方便调试测试期间查看文档说明。 当一切就绪后可以通过如下指令检查当前监听状态是否正常: ```bash sudo apt-get install net-tools netstat -tunlp | grep ollama ``` 上述命令会显示出所有正在使用的TCP/UDP连接详情列表,其中应该能看到由ollama进程占用的相关端口号信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老大白菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值