如何用comate快速生成一个剩菜好帮手

news2024/9/21 18:43:02

想法

上班后不想吃饭店的饭菜,时长想自己做一些饭菜,买完菜后却经常放到冰箱中,剩下的菜有无法一下子处理,单纯扔掉有些可惜,但是基于冰箱中的剩菜如何能做出一顿像样的饭菜一致困扰着我,查市面上的程序有时候会多出几种菜来,这时候又懒得下去买,为此基于想做一个剩菜能生成菜谱的程序

设计思路

该程序需要一个网页显示,用户输入剩下的饭菜,然后生成菜谱,并附上必要的步骤。用户点击清除后,可以重新输入,生成新的菜谱,直到满意为止。

服务端调用星火大模型的免费api,使用的为Spark Lite,下面称为LLM,提供了自定义的prompt。

实际的代码中需要注册星火大模型获取真实的api_password

架构

架构图

在这里插入图片描述

为了快速生成原型,本程序使用python,并且基于文心快码(Baidu Comate)来快速生成代码框架,完成该程序大约只用了2个小时。

函数设计

基于上述的架构,我们需要生成如下几个程序:

  1. 服务端:可以接受http请求
  2. 请求解析函数,分解出给LLM需要参数
  3. prompt配置:后期可以自定义多条
  4. LLM请求生成函数
  5. LLM客户端:星火大模型的官网提供有python示例
  6. LLM响应解析函数
  7. 用户响应组装函数
  8. 前端页面
  9. 前端页面的一些简单调试

详细步骤:

  1. 在pycharm中安装好文心快码(Baidu Comate)
  2. 新建一个项目
  3. 然后唤起comate对话框
    在这里插入图片描述
    接下来开始写python函数,代码整体放到了:https://inscode.csdn.net/@lifanqq/Python
    打开服务端后,浏览器打开:
127.0.0.1:6001/cook

在对话框中输入:

写一个http客户端,发送post请求给服务端,服务端的地址可以指定。请求的body先中只有{type:"user", "msg":"xxx"} ,发送完成后打印成功,并解析响应

获得一个http客户端:

import requests
import json


def send_post_request(server_url, msg_content="xxx"):
    # 构造请求体
    data = {"type": "user", "msg": msg_content}
    headers = {'Content-Type': 'application/json'}

    try:
        # 发送POST请求
        response = requests.post(server_url, headers=headers, data=json.dumps(data))

        # 检查响应状态码
        if response.status_code == 200:
            print("请求发送成功!")

            # 解析响应内容
            response_data = response.json()
            print("服务器响应:", response_data)
            print(response_data["result"])
        else:
            print(f"请求失败,状态码:{response.status_code}")
    except Exception as e:
        print(f"发送请求时出错:{e}")


# 示例:发送POST请求到指定的服务端地址
server_address = "http://127.0.0.1:6001/api/endpoint"  # 请替换为实际的服务端地址
send_post_request(server_address, "西红柿,鸡蛋")
# send_post_request(server_address)

写服务端:

以下是一个使用Python编写的简单HTTP客户端,用于发送POST请求到指定的服务端地址。这个客户端会发送一个包含{type: "user", "msg": "xxx"}的请求体,并在发送完成后打印成功信息,同时解析服务器的响应。
写一个服务端,接受客户端的请求,并回复处理函数的结果,处理逻辑可以空出来

得到服务端代码:

from flask import Flask, request, jsonify, render_template

import core

app = Flask(__name__)

@app.route('/api/endpoint', methods=['POST'])
def handle_request():
    try:
        # 解析请求体中的数据
        data = request.json
        # 加日志表面收到的信息
        print("收到请求,数据为:", data)
        type_ = data.get('type')
        msg = data.get('msg')

        # 在这里添加你的处理逻辑
        resp = core.send_chat_request(msg)
        # 例如,你可以根据type_和msg的值来进行不同的处理
        result = resp

        #加一行日志,表面发送成功的信息,以及发送的结果
        print("发送成功,结果为:", result)


        # 假设处理函数返回了一个字符串作为结果
        return jsonify({"result": result}), 200

    except Exception as e:
        # 如果在处理过程中出现异常,返回错误信息
        return jsonify({"error": str(e)}), 500


if __name__ == '__main__':
    app.run(debug=True)

下面开始写core的核心逻辑,主要是调用LLM,也就是星火模型的api
从官网找到的例子,下面的your_api_passwd需要自己注册星火模型后,从页面获取,并将下面例子中的替换


        ],
        "stream": False
    }

header = {
    "Authorization": "Bearer your_api_passwd", # 注意此处把your_api_passwd替换自己的APIPassword
    "Content-Type": "application/json"
}
response = requests.post(url, headers=header, json=data)
print(response.text)     将这个封装为一个函数,入参是content,替换data中的content,返回值是response.txt

基于这里例子,封装为一个函数

def send_chat_request(content):
    content_with_prompt = get_prompt() + "[" + content + "]"
    url = "https://spark-api-open.xf-yun.com/v1/chat/completions"
    data = {
        "model": "generalv3.5",  # 指定请求的模型
        "messages": [
            {
                "role": "user",
                "content": content_with_prompt  # 使用函数参数替换content
            }
        ],
        "stream": False
    }

    header = {
        "Authorization": "Bearer your_api_password",  # 注意此处替换自己的APIPassword
        "Content-Type": "application/json"
    }

    response = requests.post(url, headers=header, json=data)
    content = parse_content(response.text)
    return content  # 返回响应的文本内容

大模型返回的结果内容较多,我们用comate写一个解析函数,只获取其中的某些必要字段,在comate输入

写一个函数解析下面json中的content字段:{ "code": 0, "message": "Success", "sid": "cha000b7045@dx1915dab7328b8f2532", "choices": [{ "message": { "role": "assistant", "content": "你好!有什么我可以帮忙的吗?" }, "index": 0 }], "usage": { "prompt_tokens": 1, "completion_tokens": 7, "total_tokens": 8 } }

得到函数:

def parse_content(json_data):
    # 解析JSON字符串为Python字典
    data = json.loads(json_data)

    # 检查'choices'键是否存在,并且其值是否是一个列表
    if 'choices' in data and isinstance(data['choices'], list):
        # 遍历choices列表中的每个元素
        for choice in data['choices']:
            # 检查当前元素是否包含'message'键,并且'message'是一个字典
            if 'message' in choice and isinstance(choice['message'], dict):
                # 检查'message'字典中是否包含'content'键
                if 'content' in choice['message']:
                    # 返回找到的第一个'content'字段的值
                    return choice['message']['content']
    # 如果没有找到'content'字段,则返回None
    return None

prompt管理器较为简单:

def get_prompt():
    prompt = "假设你是一个五星大厨,掌握了很多做饭做菜的技巧,尤其擅长家常菜,请你根据提供的蔬菜、主食,提供一道比较合适的家常菜," \
             "蔬菜、主食会用[]符号包裹起来,要求只能使用提供的菜,要求提供做的菜的名字以及做菜步骤,可以用1.xx,2.xx,3.xx的格式来提供"
    return prompt

至此,服务端的函数基本已经完成。
服务的启动命令为:

python3  -m gunicorn -w 1 -b 0.0.0.0:6001  server:app

下面写前端页面:
前端不太了解,只能完全依靠comate了。这里的提示词没有记录太全,只能做大致的记录:

你需要生成一个前段页面,页面题目是:剩菜好帮手,需要包括一个对话框,用户可以输入文字,包括一个发送按钮,点击后可以发送请求个上面的服务端。

之后comate生成一个index.html,并提示出应该放置的位置。经过多次提示,又添加了清除答复的按钮,以及将答复框做成了自适应宽度,并调整了最大宽度等。

为了访问页面,服务端代码中需要插入下面的代码,这个comate也会提示

@app.route('/cook')
def index():
    return render_template('index.html')  # 这将从templates文件夹中提供index.html文件

效果:

在这里插入图片描述

感受

comate 能快速生成代码,大部分只要提示词准确,生成的代码不用修改或者少量修改就可以使用。在AI时代,阻碍人前进的不再是复杂的编程语言语法细节,而是人的创意想法,只要有idea,大模型、comate都可以快速低成本的完成实践

参考

  1. https://www.xfyun.cn/doc/spark/HTTP%E8%B0%83%E7%94%A8%E6%96%87%E6%A1%A3.html#_3-%E8%AF%B7%E6%B1%82%E8%AF%B4%E6%98%8E
  2. https://xinghuo.xfyun.cn/sparkapi
  3. https://comate.baidu.com/zh/download?track=0343360598caa7208b468223a18b07ca3b4c17e659133e3d

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2070031.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在不修改应用数据源的情况下,如何确保应用程序能够正常访问adg切换后的主库?

在不修改应用数据源的情况下,如何确保应用程序能够正常访问adg切换后的主库? oracle12c rac测试通过: 1.修改原主库的scanip为某个临时ip,新主库的scanip修改为原生产 2.修改新主库的service_names:dgorcl为原生产的…

学习2d直线拟合

直线拟合算法(续:加权最小二乘)_加权拟合直线法-CSDN博客 直线拟合算法_相位拟合直线-CSDN博客 特别感谢博主无私分享 博文中提到的参考资料《机器视觉算法与应用(双语版)》[德] 斯蒂格(Steger C&#x…

GPT-4o语音功能潜在风险分析与技术挑战

引言 近年来,随着大语言模型(LLM)技术的飞速发展,人工智能的能力在语音处理领域也取得了显著进展。OpenAI推出的GPT系列模型正成为人工智能领域的标杆。然而,在最新的GPT-4o版本中,尽管语音功能具备广阔的…

vue3 多文件下载zip压缩包

vue3多文件下载zip文件包 效果图 代码块 在这里插入代码片 <template><div><el-button type"primary" click"downLoadClick">下载文件zip</el-button></div> </template><script setup lang"ts"> i…

Springsecurity 自定义AuthenticationManager

一、认证流程 1、当用户提交了一个他的凭证(用户名、密码) AbstractAuthenticationProcessingFilter 将会创建一个凭证信息&#xff0c;最终&#xff0c;该请求会被UsernamePasswordAuthenticationFilter 拦截将请求中用户名和密码&#xff0c;封装为 Authentication 对象&…

4个学生党必备好用 AI 学术论文写作工具

随着人工智能技术的不断进步&#xff0c;AI论文写作工具已成为研究人员和学生的得力助手。学姐今天将介绍4个市面上广受好评的免费AI论文写作工具&#xff0c;它们能帮助用户高效地完成从论文大纲到最终校对的各个阶段。 一、梅子AI论文 梅子AI提供快速论文撰写功能&#xff…

Datawhale X 李宏毅苹果书 AI夏令营 学习笔记(二)

自适应学习率 我们梯度下降在参数更新上&#xff0c;公式是 W t W t − 1 − η g t &#xff0c; η 是学习率&#xff0c; g t 是梯度 W_tW_{t-1}-\eta g_t&#xff0c;\eta是学习率&#xff0c;g_t是梯度 Wt​Wt−1​−ηgt​&#xff0c;η是学习率&#xff0c;gt​是梯度…

2024软件测试必问的常见面试题1000问!

01、您所熟悉的测试用例设计方法都有哪些&#xff1f;请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。 答&#xff1a;有黑盒和白盒两种测试种类&#xff0c;黑盒有等价类划分法&#xff0c;边界分析法&#xff0c;因果图法和错误猜测法。白盒有逻辑覆盖法&…

数据结构——链式二叉树的实现与分治编程思维(c语言实现)

目录 前言&#xff1a; 1.前置说明 2.链式二叉树的遍历 2.1 前序&#xff0c;中序及后续遍历 2.2 前序遍历实现 2.3 中序遍历实现 2.4 后续遍历实现 3.结点个数以及高度等 3.1 结点个数 3.2 结点高度 3.3 叶子结点的个数 前言&#xff1a; 在之前的学习中&…

从“云、边、端”的统一管理,为传统工厂数字化转型赋能的智慧地产开源了

智慧地产视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。 AI是新形势下数…

这些软件测试面试题一定要会,自动化测试面试题(含答案)

1、你会封装自动化测试框架吗&#xff1f; 自动化框架主要的核心框架就是分层PO模式&#xff1a;分别为&#xff1a;基础封装层BasePage&#xff0c;PO页面对象层&#xff0c;TestCase测试用例层。然后再加上日志处理模块&#xff0c;ini配置文件读取模块&#xff0c;unittest…

多模态大模型技术详解(图像分块、特征对齐)

多模态 多模态发展图像预处理自适应图像切割弥补语义损失 视觉编码器视觉文本特征对齐线性映射或MLPCross AttentionPerceiver ResamplerQ-Former&#xff08;Querying Transformer&#xff09;模型结构表示学习 大语言模型 这篇文档主要讲解目前比较流行的缝合式的多模态大模型…

设计模式—装饰者模式

一、什么是装饰者模式 装饰者模式是一种结构型设计模式&#xff0c;它允许你动态地向对象添加新的行为而不影响其原有的行为。它在运行时给对象动态地添加一些额外的职责&#xff0c;通常是在原有的行为基础上&#xff0c;通过装饰器进行一些修饰&#xff0c;实现了更加灵活的代…

【软考】流水线

目录 一、指令控制方式1.1 说明1.2 顺序方式1.3 重叠方式1.4 流水方式 二、流水线的种类三、流水的相关处理3.1 说明3.2 RISC 中采用的流水技术3.2.1 超流水线(Super Pipe Line)技术3.2.2 超标量(Super Scalar)技术3.2.3 超长指令字(Very Long Instruction Word&#xff0c;VLI…

阿一网络安全之log4j2漏洞CVE-2021-44228复现

漏洞简介 Apache Log4j 2 是对 Log4j 的升级&#xff0c;它⽐其前身 Log4j 1.x 提供了显 着改进&#xff0c;并提供了 Logback 中可⽤的许多改进&#xff0c;同时修复了 Logback 架构中的⼀些固有问题。 2021 年 12 ⽉&#xff0c;在 Apache Log4j2 中发现了⼀个 0-day 漏洞。 …

倒计时7天!MoonBit 游戏挑战赛即将开启!

基于 Wasm4 框架的 MoonBit 游戏开发指南 MoonBit 即将面向全国举办“编程创新挑战赛”&#xff0c;并包含游戏赛道。本教程将介绍本次比赛中使用的框架 Wasm4&#xff0c;以及如何使用 MoonBit 在 Wasm4 框架中编写游戏。相关赛事详情见文末。 如果你曾访问过 mooncakes 或我们…

这本大模型书太香了!全方位解析LLM-Agent 第一本给程序员看的AI Agent图书!

AI Agent火爆到什么程度&#xff1f; OpenAI创始人奥特曼预测&#xff0c;未来各行各业&#xff0c;每一个人都可以拥有一个AI Agent&#xff1b;比尔盖茨在2023年层预言&#xff1a;AI Agent将彻底改变人机交互方式&#xff0c;并颠覆整个软件行业&#xff1b;吴恩达教授在AI…

从0-1开发一个Vue3前端系统页面-10.博客页面优化及子菜单设计

注意&#xff1a; 本项目已将前端源码同步上传至Gitee&#xff0c;项目已开源&#xff0c; 仅供参考&#xff0c;不涉及商用&#xff0c;不得用其牟利&#xff0c;著作权归本人所有。 本系列后期只会对重要部分代码进行注释&#xff0c;难点会同步更新至专栏 开发遇到的问题_不…

linux df -h时没有查到root盘,root文件夹带着锁或者叉号的解决办法

文章目录 一、前言二、来龙去脉1、2、给root文件赋予权限3 、这个时候df -h 查看就可以看到root文件了 总结 一、前言 当时装的双系统&#xff0c;自认为会学习很多linux相关课程&#xff0c;买了个1T的固态&#xff0c;ubuntu上分了很多&#xff0c;结果显而易见&#xff0c;…

UE5学习笔记16-游戏模式中的一些事件,如何改变网格体和摄像头的碰撞

一、OnPostLogIn&#xff1a;此事件在玩家成功登录游戏后被调用 二、HandleStartingNuwplayer&#xff1a;在OnPostLogIn事件后被调用&#xff0c;可以用来定义新进入的玩家会发生什么 三、Spawn Default PawnAtTransform&#xff1a;这个事件触发游戏中实际的Pawn生成 四、…