教程需求

在本教程中,参考 2024年最新免费AI大模型API汇总及国内大模型使用教程 ,使用的是科大讯飞的Spark Lite模型(主要是因为OpenAI没手机号用不了-_-,这个API又是无限token滴,很适合一顿尝试)当然各位也可以参照上述链接选择其他的API。

  1. python 3.8+
  2. 科大讯飞Spark Lite API
  3. pycharm

准备工作

1.大模型API注册

前往讯飞开放平台,需要按照提示先注册+实名认证。后面操作在控制台中进行。
首先创建新应用,然后进入应用。
在这里插入图片描述
应用界面左边有模型选择,目前只有Spark Lite是无限次使用的,完全满足学习用途,点击 领取无限量 即可(请注意只能给一个应用领取)
在这里插入图片描述
下面操作可以自行查看对应的接口文档,也可以按照我的介绍。

2.本地环境配置

首先在Python环境中安装对应的库

pip install --upgrade spark_ai_python

对于生成界面的库,选择gradio (注意:最新版本的gradio可能会出现报错pydantic.errors.PydanticSchemaGenerationError: Unable to generate pydantic-core schema for <class 'starlette.requests.Request'>. Set arbitrary_types_allowed=True in the model_config to ignore this error or implement __get_pydantic_core_schema__ on your type to fully support it. If you got this error by calling handler(<some type>) within __get_pydantic_core_schema__ then you likely need to call handler.generate_schema(<some type>) since we do not call __get_pydantic_core_schema__ on <some type> otherwise to avoid infinite recursion.,我当时排查很久,尝试报错给的方案也没有解决,偶然看到一个帖子让降低版本,最后成功运行)。

pip install gradio==3.50.2

还有一些其他的基础库,后面可以自行安装。

3.测试连接

from sparkai.core.messages import ChatMessage
from sparkai.llm.llm import ChatSparkLLM, ChunkPrintHandler

# 星火认知大模型Spark Max的URL值,其他版本大模型URL值请前往文档(https://www.xfyun.cn/doc/spark/Web.html)查看
SPARKAI_URL = 'wss://spark-api.xf-yun.com/v1.1/chat'
# 星火认知大模型调用秘钥信息,请前往讯飞开放平台控制台(https://console.xfyun.cn/services/bm35)查看
SPARKAI_APP_ID = ''        #这里将前面应用中的信息填入
SPARKAI_API_SECRET = ''
SPARKAI_API_KEY = ''
# 星火认知大模型Spark Max的domain值,其他版本大模型domain值请前往文档(https://www.xfyun.cn/doc/spark/Web.html)查看
SPARKAI_DOMAIN = 'lite'

# 001 测试连接
if __name__ == '__main__':
    spark = ChatSparkLLM(
        spark_api_url=SPARKAI_URL,
        spark_app_id=SPARKAI_APP_ID,
        spark_api_key=SPARKAI_API_KEY,
        spark_api_secret=SPARKAI_API_SECRET,
        spark_llm_domain=SPARKAI_DOMAIN,
        streaming=False,
    )
    messages = [ChatMessage(
        role="user",
        content='你好,你叫什么名字'
    )]
    handler = ChunkPrintHandler()
    a = spark.generate([messages], callbacks=[handler])
    content = a.generations[0][0].message.content
    print(content)

然后我们运行,看到可以直接输出了大模型的回复,至此链接成功。
在这里插入图片描述

正式开始

(PS:下面是我课程学习的一些记录,如果你只是想获得多轮自由对话的可视化配置,可以直接转跳到3 自由对话

1.1 文章摘要任务

# 002 文章摘要
if __name__ == '__main__':
    spark = ChatSparkLLM(
        spark_api_url=SPARKAI_URL,
        spark_app_id=SPARKAI_APP_ID,
        spark_api_key=SPARKAI_API_KEY,
        spark_api_secret=SPARKAI_API_SECRET,
        spark_llm_domain=SPARKAI_DOMAIN,
        streaming=False,
    )

    prompt = "你现在是一名专业的语文老师,根据的我给出的文章,帮我写一个文章摘要"
    article = '''我在好几篇小说中都提到过一座废弃的古园,实际就是地坛。许多年前旅游业还没有开展,园子荒芜冷落得如同一片野地,很少被人记起。地坛离我家很近。或者说我家离地坛很近。总之,只好认为这是缘分。地坛在我出生前四百多年就座落在那儿了,而自从我的祖母年轻时带着我父亲来到北京,就一直住在离它不远的地方——五十多年间搬过几次家,可搬来搬去总是在它周围,而且是越撤离它越近了。我常觉得这中间有着宿命的味道:仿佛这古园就是为了等我,而历尽沧桑在那儿等待了四百多年。它等待我出生,然后又等待我活到最狂妄的年龄上忽地残废了双腿。四百多年里,它一面剥蚀了古殿檐头浮夸的琉璃,淡褪了门壁上炫耀的朱红,坍记了一段段高墙又散落了玉砌雕栏,祭坛四周的老柏树愈见苍幽,到处的野草荒藤也都茂盛得自在坦荡。这时候想必我是该来了。十五年前的一个下午,我摇着轮椅进入园中,它为一个失魂落魄的人把一切都准备好了。那时,太阳循着亘古不变的路途正越来越大,也越红。在满园弥漫的沉静光芒中,一个人更容易看到时间,并看见自己的身影。自从那个下午我无意中进了这园子,就再没长久地离开过它。我一下子就理解了它的意图。正如我在一篇小说中所说的:“在人口密聚的城市里,有这样一个宁静的去处,像是上帝的苦心安排。”
                两条腿残废后的最初几年,我找不到工作,找不到去路,忽然间几乎什么都找不到了,我就摇了轮椅总是到它那儿去,仅为着那儿是可以逃避一个世界的另一个世界。我在那篇小说中写道:“没处可去我便一天到晚耗在这园子里。跟上班下班一样,别人去上班我就摇了轮椅到这儿来。园子无人看管,上下班时间有些抄近路的人们从园中穿过,园子里活跃一阵,过后便沉寂下来。”
                “园墙在金晃晃的空气中斜切下—溜荫凉,我把轮椅开进去,把椅背放倒,坐着或是躺着,看书或者想事,撅一杈树枝左右拍打,驱赶那些和我一样不明白为什么要来这世上的小昆虫。”“蜂儿如一朵小雾稳稳地停在半空;蚂蚁摇头晃脑捋着触须,猛然间想透了什么,转身疾行而去;瓢虫爬得不耐烦了,累了祈祷一回便支开翅膀,忽悠一下升空了;树干上留着一只蝉蜕,寂寞如一间空屋;露水在草叶上滚动,聚集,压弯了草叶轰然坠地摔开万道金光。”
                “满园子都是草木竟相生长弄出的响动,悉悉碎碎片刻不息。”这都是真实的记录,园子荒芜但并不衰败。
                除去几座殿堂我无法进去,除去那座祭坛我不能上去而只能从各个角度张望它,地坛的每一棵树下我都去过,差不多它的每一米草地上都有过我的车轮印。无论是什么季节,什么天气,什么时间,我都在这园子里呆过。有时候呆一会儿就回家,有时候就呆到满地上都亮起月光。记不清都是在它的哪些角落里了。我一连几小时专心致志地想关于死的事,也以同样的耐心和方式想过我为什么要出生。这样想了好几年,最后事情终于弄明白了:一个人,出生了,这就不再是一个可以辩论的问题,而只是上帝交给他的一个事实;上帝在交给我们这件事实的时候,已经顺便保证了它的结果,所以死是一件不必急于求成的事,死是一个必然会降临的节日。这样想过之看我安心多了,眼前的一切不再那么可怕。比如你起早熬夜准备考试的时候,忽然想起有一个长长的假期在前面等待你,你会不会觉得轻松一点?并且庆幸并且感激这样的安排?
                剩下的就是怎样活的问题了,这却不是在某一个瞬间就能完全想透的、不是一次性能够解决的事,怕是活多久就要想它多久了,就像是伴你终生的魔鬼或恋人。所以,十五年了,我还是总得到那古园里去、去它的老树下或荒草边或颓墙旁,去默坐,去呆想、去推开耳边的嘈杂理一理纷乱的思绪,去窥看自己的心魂。
                十五年中,这古园的形体被不能理解它的人肆意雕琢,幸好有些东西的任谁也不能改变它的。譬如祭坛石门中的落日,寂静的光辉平铺的—刻,地上的每一个坎坷都被映照得灿烂;譬如在园中最为落寞的时间,—群雨燕便出来高歌,把天地都叫喊得苍凉;譬如冬天雪地上孩子的脚印,总让人猜想他们是谁,曾在哪儿做过些什么、然后又都到哪儿去了;譬如那些苍黑的古柏,你忧郁的时候它们镇静地站在那儿,你欣喜的时候它们依然镇静地站在那儿,它们没日没夜地站在那儿从你没有出生一直站到这个世界上又没了你的时候;譬如暴雨骤临园中,激起一阵阵灼烈而清纯的草木和泥土的气味,让人想起无数个夏天的事件;譬如秋风忽至,再有——场早霜,落叶或飘摇歌舞或坦然安卧,满园中播散着熨帖而微苦的味道。味道是最说不清楚的。味道不能写只能闻,要你身临其境去闻才能明了。味道甚至是难于记忆的,只有你又闻到它你才能记起它的全部情感和意蕴。所以我常常要到那园子里去。'''

    input_text = f"{prompt}\n{article}"

    messages = [ChatMessage(
        role="user",
        content=input_text
    )]
    handler = ChunkPrintHandler()
    a = spark.generate([messages], callbacks=[handler])
    content = a.generations[0][0].message.content
    # print(type(a), a)
    print(content)

上面的配置不变,可以测试一下文章摘要任务的实现。
在这里插入图片描述

1.2 文章摘要任务+可视化界面

# 003 文章摘要  配备 Gradio 界面,pip install gradio==3.50.2  解决持续报错问题
prompt_for_summarization = "你现在是一名专业的语文老师,根据的我给出的文章,帮我写一个文章摘要"


# 重置对话的函数
def reset() -> List:
    return []


# 调用模型生成摘要的函数
def interact_summarization(prompt: str, article: str, temp=1.0) -> List[Tuple[str, str]]:
    """
    * 参数:
      - prompt: 我们在此部分中使用的提示词
      - article: 需要摘要的文章
      - temp: 模型的温度参数。温度用于控制聊天机器人的输出。温度越高,响应越具创造性。
    """

    input = f"{prompt}\n{article}"

    spark = ChatSparkLLM(
        spark_api_url=SPARKAI_URL,
        spark_app_id=SPARKAI_APP_ID,
        spark_api_key=SPARKAI_API_KEY,
        spark_api_secret=SPARKAI_API_SECRET,
        spark_llm_domain=SPARKAI_DOMAIN,
        temperature=temp,
        streaming=False,
    )
    messages = [ChatMessage(
        role="user",
        content=input
    )]
    handler = ChunkPrintHandler()
    a = spark.generate([messages], callbacks=[handler])
    content = a.generations[0][0].message.content
    # print(type(a), a)
    # print(content)

    return [(input, content)]


# 生成 Gradio 的UI界面
with gr.Blocks() as demo:
    gr.Markdown("# 第1部分:摘要\n填写任何你喜欢的文章,让聊天机器人为你总结!")
    chatbot = gr.Chatbot()
    prompt_textbox = gr.Textbox(label="提示词", value=prompt_for_summarization, visible=False)
    article_textbox = gr.Textbox(label="文章", interactive=True, value="填充")

    with gr.Column():
        gr.Markdown("# 温度调节\n温度用于控制聊天机器人的输出。温度越高,响应越具创造性。")
        temperature_slider = gr.Slider(0.0, 1.0, 1.0, step=0.1, label="温度")

    with gr.Row():
        sent_button = gr.Button(value="发送")
        reset_button = gr.Button(value="重置")

    # 连接按钮与函数
    sent_button.click(interact_summarization, inputs=[prompt_textbox, article_textbox, temperature_slider],
                      outputs=[chatbot])
    reset_button.click(reset, outputs=[chatbot])

# 启动 Gradio 界面
demo.launch(share=True, debug=True)

运行上述代码之后,点击终端显示的链接进入可视化web。【注意这里使用的temp对应的是模型的temperature参数,可以从文档中查看对应的解释。在理解上比较简单,就是把每次询问的问题和回答保存下来,传到显示的界面。】
在这里插入图片描述
输入文章后,点击发送,等待片刻会返回模型的信息。

2.1 角色扮演任务

# 004 角色扮演(多轮对话)
prompt_for_roleplay = "你现在扮演一个经验丰富的医生,熟练掌握各种疾病的诊断,我需要你的帮助。"

spark = ChatSparkLLM(
    spark_api_url=SPARKAI_URL,
    spark_app_id=SPARKAI_APP_ID,
    spark_api_key=SPARKAI_API_KEY,
    spark_api_secret=SPARKAI_API_SECRET,
    spark_llm_domain=SPARKAI_DOMAIN,
    streaming=False,
)

messages = [ChatMessage(
    role="user",
    content=prompt_for_roleplay
)]
handler = ChunkPrintHandler()
a = spark.generate([messages], callbacks=[handler])
response_text = a.generations[0][0].message.content

# 将第一次的预设和回复进行保存
messages = [{'role': 'user', 'content': prompt_for_roleplay}, {'role': 'assistant', 'content': response_text}]
print(messages)

# 开始对话
for i in range(3):
    user_input = input("请输入:")
    messages.append({'role': 'user', 'content': user_input})

    messages = [ChatMessage(
        role="user",
        content=user_input
    )]
    handler = ChunkPrintHandler()
    a = spark.generate([messages], callbacks=[handler])
    assistant_output = a.generations[0][0].message.content

    messages.append({'role': 'assistant', 'content': assistant_output})
    print(f'用户输入:{user_input}')
    print(f'模型输出:{assistant_output}')
    print('\n')

上面设置了三轮的对话,可以自行进行测试。
在这里插入图片描述

2.2 角色扮演任务+可视化界面

# 005 角色扮演(多轮对话)  配备 Gradio 界面
character_for_chatbot = "医生"
prompt_for_roleplay = "你现在扮演一个经验丰富的医生,熟练掌握各种疾病的诊断,我需要你的帮助。"


# 清除对话的函数
def reset() -> List:
    return []


# 调用模型生成对话的函数
def interact_roleplay(chatbot: List[Tuple[str, str]], user_input: str, temp=1.0) -> List[Tuple[str, str]]:
    """
    * 参数:
      - user_input: 每轮对话中的用户输入
      - temp: 模型的温度参数。温度用于控制聊天机器人的输出。温度越高,响应越具创造性。
    """
    try:
        spark = ChatSparkLLM(
            spark_api_url=SPARKAI_URL,
            spark_app_id=SPARKAI_APP_ID,
            spark_api_key=SPARKAI_API_KEY,
            spark_api_secret=SPARKAI_API_SECRET,
            spark_llm_domain=SPARKAI_DOMAIN,
            streaming=False,
            temperature=temp
        )
        messages = []
        for input_text, response_text in chatbot:
            messages.append({'role': 'user', 'content': input_text})
            messages.append({'role': 'assistant', 'content': response_text})

        messages.append({'role': 'user', 'content': user_input})

        messages = [ChatMessage(
            role="user",
            content=user_input
        )]
        handler = ChunkPrintHandler()
        a = spark.generate([messages], callbacks=[handler])
        assistant_output = a.generations[0][0].message.content

        chatbot.append((user_input, assistant_output))

    except Exception as e:
        print(f"发生错误:{e}")
        chatbot.append((user_input, f"抱歉,发生了错误:{e}"))
    return chatbot


# 进行第一次对话
first_dialogue = interact_roleplay([], prompt_for_roleplay)

# 生成 Gradio 的UI界面
with gr.Blocks() as demo:
    gr.Markdown(f"# 第2部分:角色扮演\n聊天机器人想和你玩一个角色扮演游戏,试着与它互动吧!")
    chatbot = gr.Chatbot(value=first_dialogue)
    description_textbox = gr.Textbox(label="机器人扮演的角色", interactive=False, value=f"{character_for_chatbot}")
    input_textbox = gr.Textbox(label="输入", value="")

    with gr.Column():
        gr.Markdown("# 温度调节\n温度用于控制聊天机器人的输出。温度越高,响应越具创造性。")
        temperature_slider = gr.Slider(0.0, 1.0, 1.0, step=0.1, label="温度")

    with gr.Row():
        sent_button = gr.Button(value="发送")
        reset_button = gr.Button(value="重置")

    # 连接按钮与函数
    sent_button.click(interact_roleplay, inputs=[chatbot, input_textbox, temperature_slider], outputs=[chatbot])
    reset_button.click(reset, outputs=[chatbot])

# 启动 Gradio 界面
demo.launch(debug=True)

3 自由对话

# 006 多轮对话,API+界面
# 清除对话的函数
def reset() -> List:
    return []


# 调用模型生成对话的函数
def interact_customize(chatbot: List[Tuple[str, str]],  user_input: str, temp=1.0) -> List[Tuple[str, str]]:
    """
    * 参数:

      - chatbot: 模型本身,存储在元组列表中的对话记录
      - prompt: 用于指定任务的提示词
      - user_input: 每轮对话中的用户输入
      - temp: 模型的温度参数。温度用于控制聊天机器人的输出。温度越高,响应越具创造性。

    """
    try:
        messages = []

        # 构建历史对话记录
        for input_text, response_text in chatbot:
            messages.append({'role': 'user', 'content': input_text})
            messages.append({'role': 'assistant', 'content': response_text})

        # 添加当前用户输入
        messages.append({'role': 'user', 'content': user_input})

        spark = ChatSparkLLM(
            spark_api_url=SPARKAI_URL,
            spark_app_id=SPARKAI_APP_ID,
            spark_api_key=SPARKAI_API_KEY,
            spark_api_secret=SPARKAI_API_SECRET,
            spark_llm_domain=SPARKAI_DOMAIN,
            streaming=False,
            temperature=temp
        )
        for input_text, response_text in chatbot:
            messages.append({'role': 'user', 'content': input_text})
            messages.append({'role': 'assistant', 'content': response_text})

        messages.append({'role': 'user', 'content': user_input})
        # print(messages)
        messages = [ChatMessage(
            role="user",
            content=user_input
        )]
        handler = ChunkPrintHandler()
        a = spark.generate([messages], callbacks=[handler])
        assistant_output = a.generations[0][0].message.content

        chatbot.append((user_input, assistant_output))
        print(chatbot)

    except Exception as e:
        print(f"发生错误:{e}")
        chatbot.append((user_input, f"抱歉,发生了错误:{e}"))

    return chatbot


# 生成 Gradio 的UI界面
with gr.Blocks() as demo:
    gr.Markdown("# 自由对话\n这是一个自由对话的窗口,试着与它互动吧!")
    chatbot = gr.Chatbot()
    input_textbox = gr.Textbox(label="输入", value="")

    with gr.Column():
        gr.Markdown("# 温度调节\n温度用于控制聊天机器人的输出。温度越高,响应越具创造性。")
        temperature_slider = gr.Slider(0.0, 1.0, 0.5, step=0.1, label="温度")

    with gr.Row():
        sent_button = gr.Button(value="发送")
        reset_button = gr.Button(value="重置")

    # 连接按钮与函数
    sent_button.click(interact_customize, inputs=[chatbot, input_textbox, temperature_slider],
                      outputs=[chatbot])
    reset_button.click(reset, outputs=[chatbot])

# 启动 Gradio 界面
demo.launch(debug=True)

在这里插入图片描述

完整代码

下面贴上完整代码,欢迎各位讨论交流(我还挺好奇大家都白嫖的哪个厂商的API),后续也会持续更新相关的学习记录,欢迎关注!

import json
import os
from typing import List, Dict, Tuple

import gradio as gr
import openai
import starlette
from sparkai.core.messages import ChatMessage
from sparkai.llm.llm import ChatSparkLLM, ChunkPrintHandler

# 星火认知大模型Spark Max的URL值,其他版本大模型URL值请前往文档(https://www.xfyun.cn/doc/spark/Web.html)查看
SPARKAI_URL = 'wss://spark-api.xf-yun.com/v1.1/chat'
# 星火认知大模型调用秘钥信息,请前往讯飞开放平台控制台(https://console.xfyun.cn/services/bm35)查看
SPARKAI_APP_ID = ''
SPARKAI_API_SECRET = ''
SPARKAI_API_KEY = ''
# 星火认知大模型Spark Max的domain值,其他版本大模型domain值请前往文档(https://www.xfyun.cn/doc/spark/Web.html)查看
SPARKAI_DOMAIN = 'lite'

# 001 测试连接
# if __name__ == '__main__':
#     spark = ChatSparkLLM(
#         spark_api_url=SPARKAI_URL,
#         spark_app_id=SPARKAI_APP_ID,
#         spark_api_key=SPARKAI_API_KEY,
#         spark_api_secret=SPARKAI_API_SECRET,
#         spark_llm_domain=SPARKAI_DOMAIN,
#         streaming=False,
#     )
#     messages = [ChatMessage(
#         role="user",
#         content='你好,你叫什么名字'
#     )]
#     handler = ChunkPrintHandler()
#     a = spark.generate([messages], callbacks=[handler])
#     content = a.generations[0][0].message.content
#     print(content)


# # 002 文章摘要
# if __name__ == '__main__':
#     spark = ChatSparkLLM(
#         spark_api_url=SPARKAI_URL,
#         spark_app_id=SPARKAI_APP_ID,
#         spark_api_key=SPARKAI_API_KEY,
#         spark_api_secret=SPARKAI_API_SECRET,
#         spark_llm_domain=SPARKAI_DOMAIN,
#         streaming=False,
#     )
#
#     prompt = "你现在是一名专业的语文老师,根据的我给出的文章,帮我写一个文章摘要"
#     article = '''我在好几篇小说中都提到过一座废弃的古园,实际就是地坛。许多年前旅游业还没有开展,园子荒芜冷落得如同一片野地,很少被人记起。地坛离我家很近。或者说我家离地坛很近。总之,只好认为这是缘分。地坛在我出生前四百多年就座落在那儿了,而自从我的祖母年轻时带着我父亲来到北京,就一直住在离它不远的地方——五十多年间搬过几次家,可搬来搬去总是在它周围,而且是越撤离它越近了。我常觉得这中间有着宿命的味道:仿佛这古园就是为了等我,而历尽沧桑在那儿等待了四百多年。它等待我出生,然后又等待我活到最狂妄的年龄上忽地残废了双腿。四百多年里,它一面剥蚀了古殿檐头浮夸的琉璃,淡褪了门壁上炫耀的朱红,坍记了一段段高墙又散落了玉砌雕栏,祭坛四周的老柏树愈见苍幽,到处的野草荒藤也都茂盛得自在坦荡。这时候想必我是该来了。十五年前的一个下午,我摇着轮椅进入园中,它为一个失魂落魄的人把一切都准备好了。那时,太阳循着亘古不变的路途正越来越大,也越红。在满园弥漫的沉静光芒中,一个人更容易看到时间,并看见自己的身影。自从那个下午我无意中进了这园子,就再没长久地离开过它。我一下子就理解了它的意图。正如我在一篇小说中所说的:“在人口密聚的城市里,有这样一个宁静的去处,像是上帝的苦心安排。”
#                 两条腿残废后的最初几年,我找不到工作,找不到去路,忽然间几乎什么都找不到了,我就摇了轮椅总是到它那儿去,仅为着那儿是可以逃避一个世界的另一个世界。我在那篇小说中写道:“没处可去我便一天到晚耗在这园子里。跟上班下班一样,别人去上班我就摇了轮椅到这儿来。园子无人看管,上下班时间有些抄近路的人们从园中穿过,园子里活跃一阵,过后便沉寂下来。”
#                 “园墙在金晃晃的空气中斜切下—溜荫凉,我把轮椅开进去,把椅背放倒,坐着或是躺着,看书或者想事,撅一杈树枝左右拍打,驱赶那些和我一样不明白为什么要来这世上的小昆虫。”“蜂儿如一朵小雾稳稳地停在半空;蚂蚁摇头晃脑捋着触须,猛然间想透了什么,转身疾行而去;瓢虫爬得不耐烦了,累了祈祷一回便支开翅膀,忽悠一下升空了;树干上留着一只蝉蜕,寂寞如一间空屋;露水在草叶上滚动,聚集,压弯了草叶轰然坠地摔开万道金光。”
#                 “满园子都是草木竟相生长弄出的响动,悉悉碎碎片刻不息。”这都是真实的记录,园子荒芜但并不衰败。
#                 除去几座殿堂我无法进去,除去那座祭坛我不能上去而只能从各个角度张望它,地坛的每一棵树下我都去过,差不多它的每一米草地上都有过我的车轮印。无论是什么季节,什么天气,什么时间,我都在这园子里呆过。有时候呆一会儿就回家,有时候就呆到满地上都亮起月光。记不清都是在它的哪些角落里了。我一连几小时专心致志地想关于死的事,也以同样的耐心和方式想过我为什么要出生。这样想了好几年,最后事情终于弄明白了:一个人,出生了,这就不再是一个可以辩论的问题,而只是上帝交给他的一个事实;上帝在交给我们这件事实的时候,已经顺便保证了它的结果,所以死是一件不必急于求成的事,死是一个必然会降临的节日。这样想过之看我安心多了,眼前的一切不再那么可怕。比如你起早熬夜准备考试的时候,忽然想起有一个长长的假期在前面等待你,你会不会觉得轻松一点?并且庆幸并且感激这样的安排?
#                 剩下的就是怎样活的问题了,这却不是在某一个瞬间就能完全想透的、不是一次性能够解决的事,怕是活多久就要想它多久了,就像是伴你终生的魔鬼或恋人。所以,十五年了,我还是总得到那古园里去、去它的老树下或荒草边或颓墙旁,去默坐,去呆想、去推开耳边的嘈杂理一理纷乱的思绪,去窥看自己的心魂。
#                 十五年中,这古园的形体被不能理解它的人肆意雕琢,幸好有些东西的任谁也不能改变它的。譬如祭坛石门中的落日,寂静的光辉平铺的—刻,地上的每一个坎坷都被映照得灿烂;譬如在园中最为落寞的时间,—群雨燕便出来高歌,把天地都叫喊得苍凉;譬如冬天雪地上孩子的脚印,总让人猜想他们是谁,曾在哪儿做过些什么、然后又都到哪儿去了;譬如那些苍黑的古柏,你忧郁的时候它们镇静地站在那儿,你欣喜的时候它们依然镇静地站在那儿,它们没日没夜地站在那儿从你没有出生一直站到这个世界上又没了你的时候;譬如暴雨骤临园中,激起一阵阵灼烈而清纯的草木和泥土的气味,让人想起无数个夏天的事件;譬如秋风忽至,再有——场早霜,落叶或飘摇歌舞或坦然安卧,满园中播散着熨帖而微苦的味道。味道是最说不清楚的。味道不能写只能闻,要你身临其境去闻才能明了。味道甚至是难于记忆的,只有你又闻到它你才能记起它的全部情感和意蕴。所以我常常要到那园子里去。'''
#
#     input_text = f"{prompt}\n{article}"
#
#     messages = [ChatMessage(
#         role="user",
#         content=input_text
#     )]
#     handler = ChunkPrintHandler()
#     a = spark.generate([messages], callbacks=[handler])
#     content = a.generations[0][0].message.content
#     # print(type(a), a)
#     print(content)
#
#
# # 003 文章摘要  配备 Gradio 界面,pip install gradio==3.50.2  解决持续报错问题
# prompt_for_summarization = "你现在是一名专业的语文老师,根据的我给出的文章,帮我写一个文章摘要"
#
#
# # 重置对话的函数
# def reset() -> List:
#     return []
#
#
# # 调用模型生成摘要的函数
# def interact_summarization(prompt: str, article: str, temp=1.0) -> List[Tuple[str, str]]:
#     """
#     * 参数:
#       - prompt: 我们在此部分中使用的提示词
#       - article: 需要摘要的文章
#       - temp: 模型的温度参数。温度用于控制聊天机器人的输出。温度越高,响应越具创造性。
#     """
#
#     input = f"{prompt}\n{article}"
#
#     spark = ChatSparkLLM(
#         spark_api_url=SPARKAI_URL,
#         spark_app_id=SPARKAI_APP_ID,
#         spark_api_key=SPARKAI_API_KEY,
#         spark_api_secret=SPARKAI_API_SECRET,
#         spark_llm_domain=SPARKAI_DOMAIN,
#         temperature=temp,
#         streaming=False,
#     )
#     messages = [ChatMessage(
#         role="user",
#         content=input
#     )]
#     handler = ChunkPrintHandler()
#     a = spark.generate([messages], callbacks=[handler])
#     content = a.generations[0][0].message.content
#     # print(type(a), a)
#     # print(content)
#
#     return [(input, content)]
#
#
# # 生成 Gradio 的UI界面
# with gr.Blocks() as demo:
#     gr.Markdown("# 第1部分:摘要\n填写任何你喜欢的文章,让聊天机器人为你总结!")
#     chatbot = gr.Chatbot()
#     prompt_textbox = gr.Textbox(label="提示词", value=prompt_for_summarization, visible=False)
#     article_textbox = gr.Textbox(label="文章", interactive=True, value="填充")
#
#     with gr.Column():
#         gr.Markdown("# 温度调节\n温度用于控制聊天机器人的输出。温度越高,响应越具创造性。")
#         temperature_slider = gr.Slider(0.0, 1.0, 1.0, step=0.1, label="温度")
#
#     with gr.Row():
#         sent_button = gr.Button(value="发送")
#         reset_button = gr.Button(value="重置")
#
#     # 连接按钮与函数
#     sent_button.click(interact_summarization, inputs=[prompt_textbox, article_textbox, temperature_slider],
#                       outputs=[chatbot])
#     reset_button.click(reset, outputs=[chatbot])
#
# # 启动 Gradio 界面
# demo.launch(share=True, debug=True)
#
#
# # 004 角色扮演(多轮对话)
# prompt_for_roleplay = "你现在扮演一个经验丰富的医生,熟练掌握各种疾病的诊断,我需要你的帮助。"
#
# spark = ChatSparkLLM(
#     spark_api_url=SPARKAI_URL,
#     spark_app_id=SPARKAI_APP_ID,
#     spark_api_key=SPARKAI_API_KEY,
#     spark_api_secret=SPARKAI_API_SECRET,
#     spark_llm_domain=SPARKAI_DOMAIN,
#     streaming=False,
# )
#
# messages = [ChatMessage(
#     role="user",
#     content=prompt_for_roleplay
# )]
# handler = ChunkPrintHandler()
# a = spark.generate([messages], callbacks=[handler])
# response_text = a.generations[0][0].message.content
#
# # 将第一次的预设和回复进行保存
# messages = [{'role': 'user', 'content': prompt_for_roleplay}, {'role': 'assistant', 'content': response_text}]
# print(messages)
#
# # 开始对话
# for i in range(3):
#     user_input = input("请输入:")
#     messages.append({'role': 'user', 'content': user_input})
#
#     messages = [ChatMessage(
#         role="user",
#         content=user_input
#     )]
#     handler = ChunkPrintHandler()
#     a = spark.generate([messages], callbacks=[handler])
#     assistant_output = a.generations[0][0].message.content
#
#     messages.append({'role': 'assistant', 'content': assistant_output})
#     print(f'用户输入:{user_input}')
#     print(f'模型输出:{assistant_output}')
#     print('\n')
#
#
# # 005 角色扮演(多轮对话)  配备 Gradio 界面
# character_for_chatbot = "医生"
# prompt_for_roleplay = "你现在扮演一个经验丰富的医生,熟练掌握各种疾病的诊断,我需要你的帮助。"
#
#
# # 清除对话的函数
# def reset() -> List:
#     return []
#
#
# # 调用模型生成对话的函数
# def interact_roleplay(chatbot: List[Tuple[str, str]], user_input: str, temp=1.0) -> List[Tuple[str, str]]:
#     """
#     * 参数:
#       - user_input: 每轮对话中的用户输入
#       - temp: 模型的温度参数。温度用于控制聊天机器人的输出。温度越高,响应越具创造性。
#     """
#     try:
#         spark = ChatSparkLLM(
#             spark_api_url=SPARKAI_URL,
#             spark_app_id=SPARKAI_APP_ID,
#             spark_api_key=SPARKAI_API_KEY,
#             spark_api_secret=SPARKAI_API_SECRET,
#             spark_llm_domain=SPARKAI_DOMAIN,
#             streaming=False,
#             temperature=temp
#         )
#         messages = []
#         for input_text, response_text in chatbot:
#             messages.append({'role': 'user', 'content': input_text})
#             messages.append({'role': 'assistant', 'content': response_text})
#
#         messages.append({'role': 'user', 'content': user_input})
#
#         messages = [ChatMessage(
#             role="user",
#             content=user_input
#         )]
#         handler = ChunkPrintHandler()
#         a = spark.generate([messages], callbacks=[handler])
#         assistant_output = a.generations[0][0].message.content
#
#         chatbot.append((user_input, assistant_output))
#
#     except Exception as e:
#         print(f"发生错误:{e}")
#         chatbot.append((user_input, f"抱歉,发生了错误:{e}"))
#     return chatbot
#
#
# # 进行第一次对话
# first_dialogue = interact_roleplay([], prompt_for_roleplay)
#
# # 生成 Gradio 的UI界面
# with gr.Blocks() as demo:
#     gr.Markdown(f"# 第2部分:角色扮演\n聊天机器人想和你玩一个角色扮演游戏,试着与它互动吧!")
#     chatbot = gr.Chatbot(value=first_dialogue)
#     description_textbox = gr.Textbox(label="机器人扮演的角色", interactive=False, value=f"{character_for_chatbot}")
#     input_textbox = gr.Textbox(label="输入", value="")
#
#     with gr.Column():
#         gr.Markdown("# 温度调节\n温度用于控制聊天机器人的输出。温度越高,响应越具创造性。")
#         temperature_slider = gr.Slider(0.0, 1.0, 1.0, step=0.1, label="温度")
#
#     with gr.Row():
#         sent_button = gr.Button(value="发送")
#         reset_button = gr.Button(value="重置")
#
#     # 连接按钮与函数
#     sent_button.click(interact_roleplay, inputs=[chatbot, input_textbox, temperature_slider], outputs=[chatbot])
#     reset_button.click(reset, outputs=[chatbot])
#
# # 启动 Gradio 界面
# demo.launch(debug=True)


# 006 多轮对话,API+界面
# 清除对话的函数
def reset() -> List:
    return []


# 调用模型生成对话的函数
def interact_customize(chatbot: List[Tuple[str, str]],  user_input: str, temp=1.0) -> List[Tuple[str, str]]:
    """
    * 参数:

      - chatbot: 模型本身,存储在元组列表中的对话记录
      - prompt: 用于指定任务的提示词
      - user_input: 每轮对话中的用户输入
      - temp: 模型的温度参数。温度用于控制聊天机器人的输出。温度越高,响应越具创造性。

    """
    try:
        messages = []

        # 构建历史对话记录
        for input_text, response_text in chatbot:
            messages.append({'role': 'user', 'content': input_text})
            messages.append({'role': 'assistant', 'content': response_text})

        # 添加当前用户输入
        messages.append({'role': 'user', 'content': user_input})

        spark = ChatSparkLLM(
            spark_api_url=SPARKAI_URL,
            spark_app_id=SPARKAI_APP_ID,
            spark_api_key=SPARKAI_API_KEY,
            spark_api_secret=SPARKAI_API_SECRET,
            spark_llm_domain=SPARKAI_DOMAIN,
            streaming=False,
            temperature=temp
        )
        for input_text, response_text in chatbot:
            messages.append({'role': 'user', 'content': input_text})
            messages.append({'role': 'assistant', 'content': response_text})

        messages.append({'role': 'user', 'content': user_input})
        # print(messages)
        messages = [ChatMessage(
            role="user",
            content=user_input
        )]
        handler = ChunkPrintHandler()
        a = spark.generate([messages], callbacks=[handler])
        assistant_output = a.generations[0][0].message.content

        chatbot.append((user_input, assistant_output))
        print(chatbot)

    except Exception as e:
        print(f"发生错误:{e}")
        chatbot.append((user_input, f"抱歉,发生了错误:{e}"))

    return chatbot


# 生成 Gradio 的UI界面
with gr.Blocks() as demo:
    gr.Markdown("# 自由对话\n这是一个自由对话的窗口,试着与它互动吧!")
    chatbot = gr.Chatbot()
    input_textbox = gr.Textbox(label="输入", value="")

    with gr.Column():
        gr.Markdown("# 温度调节\n温度用于控制聊天机器人的输出。温度越高,响应越具创造性。")
        temperature_slider = gr.Slider(0.0, 1.0, 0.5, step=0.1, label="温度")

    with gr.Row():
        sent_button = gr.Button(value="发送")
        reset_button = gr.Button(value="重置")

    # 连接按钮与函数
    sent_button.click(interact_customize, inputs=[chatbot, input_textbox, temperature_slider],
                      outputs=[chatbot])
    reset_button.click(reset, outputs=[chatbot])

# 启动 Gradio 界面
demo.launch(debug=True)

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐