首页 > 其他分享 >【#第三期实战营闯关作业 ## MindSearch在 Hugging FaceSpace的部署】

【#第三期实战营闯关作业 ## MindSearch在 Hugging FaceSpace的部署】

时间:2024-09-01 22:56:18浏览次数:14  
标签:FaceSpace planner return gr ## Hugging agent response history

把MindSearch 部署到Github Codespace后,下一步就是上传到 Hugging Face Space,以下是记录了实操的过程及截图:

  1. 打开 https://huggingface.co/spaces ,并点击 Create new Space,如下图所示:在这里插入图片描述
  2. 在输入 Space name 并选择 License 后,选择配置如下面截图所示:
    在这里插入图片描述
    3 进入 Settings,配置硅基流动的 API Key。如下面截图所示:
    在这里插入图片描述
    4 点击 New secrets,就会弹出一个界面:
    name 一栏输入 SILICON_API_KEY,value 一栏输入你的 API Key 的内容,然后点击“save”就ok了.
    在这里插入图片描述
    5 新建一个目录,以备存放提交到 HuggingFace Space 的全部文件:

创建新目录

mkdir -p /workspaces/mindsearch/mindsearch_deploy

准备复制文件

cd /workspaces/mindsearch
cp -r /workspaces/mindsearch/MindSearch/mindsearch /workspaces/mindsearch/mindsearch_deploy
cp /workspaces/mindsearch/MindSearch/requirements.txt /workspaces/mindsearch/mindsearch_deploy

创建 app.py 作为程序入口

touch /workspaces/mindsearch/mindsearch_deploy/app.py 下面是老师提供的代码:

import json
import os

import gradio as gr
import requests
from lagent.schema import AgentStatusCode

os.system("python -m mindsearch.app --lang cn --model_format internlm_silicon &")

PLANNER_HISTORY = []
SEARCHER_HISTORY = []


def rst_mem(history_planner: list, history_searcher: list):
    '''
    Reset the chatbot memory.
    '''
    history_planner = []
    history_searcher = []
    if PLANNER_HISTORY:
        PLANNER_HISTORY.clear()
    return history_planner, history_searcher


def format_response(gr_history, agent_return):
    if agent_return['state'] in [
            AgentStatusCode.STREAM_ING, AgentStatusCode.ANSWER_ING
    ]:
        gr_history[-1][1] = agent_return['response']
    elif agent_return['state'] == AgentStatusCode.PLUGIN_START:
        thought = gr_history[-1][1].split('```')[0]
        if agent_return['response'].startswith('```'):
            gr_history[-1][1] = thought + '\n' + agent_return['response']
    elif agent_return['state'] == AgentStatusCode.PLUGIN_END:
        thought = gr_history[-1][1].split('```')[0]
        if isinstance(agent_return['response'], dict):
            gr_history[-1][
                1] = thought + '\n' + f'```json\n{json.dumps(agent_return["response"], ensure_ascii=False, indent=4)}\n```'  # noqa: E501
    elif agent_return['state'] == AgentStatusCode.PLUGIN_RETURN:
        assert agent_return['inner_steps'][-1]['role'] == 'environment'
        item = agent_return['inner_steps'][-1]
        gr_history.append([
            None,
            f"```json\n{json.dumps(item['content'], ensure_ascii=False, indent=4)}\n```"
        ])
        gr_history.append([None, ''])
    return


def predict(history_planner, history_searcher):

    def streaming(raw_response):
        for chunk in raw_response.iter_lines(chunk_size=8192,
                                             decode_unicode=False,
                                             delimiter=b'\n'):
            if chunk:
                decoded = chunk.decode('utf-8')
                if decoded == '\r':
                    continue
                if decoded[:6] == 'data: ':
                    decoded = decoded[6:]
                elif decoded.startswith(': ping - '):
                    continue
                response = json.loads(decoded)
                yield (response['response'], response['current_node'])

    global PLANNER_HISTORY
    PLANNER_HISTORY.append(dict(role='user', content=history_planner[-1][0]))
    new_search_turn = True

    url = 'http://localhost:8002/solve'
    headers = {'Content-Type': 'application/json'}
    data = {'inputs': PLANNER_HISTORY}
    raw_response = requests.post(url,
                                 headers=headers,
                                 data=json.dumps(data),
                                 timeout=20,
                                 stream=True)

    for resp in streaming(raw_response):
        agent_return, node_name = resp
        if node_name:
            if node_name in ['root', 'response']:
                continue
            agent_return = agent_return['nodes'][node_name]['detail']
            if new_search_turn:
                history_searcher.append([agent_return['content'], ''])
                new_search_turn = False
            format_response(history_searcher, agent_return)
            if agent_return['state'] == AgentStatusCode.END:
                new_search_turn = True
            yield history_planner, history_searcher
        else:
            new_search_turn = True
            format_response(history_planner, agent_return)
            if agent_return['state'] == AgentStatusCode.END:
                PLANNER_HISTORY = agent_return['inner_steps']
            yield history_planner, history_searcher
    return history_planner, history_searcher


with gr.Blocks() as demo:
    gr.HTML("""<h1 align="center">MindSearch Gradio Demo</h1>""")
    gr.HTML("""<p style="text-align: center; font-family: Arial, sans-serif;">MindSearch is an open-source AI Search Engine Framework with Perplexity.ai Pro performance. You can deploy your own Perplexity.ai-style search engine using either closed-source LLMs (GPT, Claude) or open-source LLMs (InternLM2.5-7b-chat).</p>""")
    gr.HTML("""
    <div style="text-align: center; font-size: 16px;">
        <a href="https://github.com/InternLM/MindSearch" style="margin-right: 15px; text-decoration: none; color: #4A90E2;">

标签:FaceSpace,planner,return,gr,##,Hugging,agent,response,history
From: https://blog.csdn.net/weixin_46643868/article/details/141779666

相关文章

  • 【机器学习】8. 逻辑斯蒂回归 Logistic function(sigmoid),cross-entropy error,Log-l
    Logisticfunction线性分类器Logisticfunction(sigmoid)极大似然估计Log-likelihoodloss线性分类器Logisticregression是一个线性分类器。如图,1为蓝色,0为红色。这条直线叫做直线边界Logisticfunction(sigmoid)......
  • 从Vue的Weex迁移到Rax Weex
    据说:rax几乎没啥使用文档,有问题直接查询react官方文档,屡试屡爽目前没有实践过,先存下一言生成的文档:从Vue的Weex迁移到RaxWeex涉及到从一种前端框架(Vue)到另一种框架(Rax)的转换,同时保持与Weex的兼容性。由于Weex本身是一个跨平台的移动开发框架,支持Vue和Rax等多种前端框架,迁移......
  • Redis
    Redis数据类型五种基本字符串String列表List集合Set有序集合SortedSet也叫ZSet哈希Hash五种高级消息队列Stream地理空间Geospatial…启动:输入redis-server启动redis客户端:redis-cli操作StringsetNamefyq:添加getName:获取delName:删......
  • Linux高级命令(扩展)
    Linux高级命令(扩展)一、find命令1、find命令作用在Linux操作系统中,find命令主要用于进行文件的搜索。2、基本语法#find搜索路径[选项选项的值]...选项说明:-name:根据文件的名称搜索文件,支持*通配符-type:f代表普通文件、d代表文件夹案例:搜索计算机中的所有文件,然后找......
  • 使用 Supabase 保护 Next.js 路由
    要使用Supabase保护Next.js路由,你可以按照以下步骤进行操作:1.安装所需的依赖:在你的Next.js项目中,安装`@supabase/supabase-js`和`next-auth`库。2.配置Supabase:在你的项目中创建一个`.env.local`文件,并添加你的Supabase项目的URL和API密钥。3.创建认证页......
  • 一天一章大学物理,请神请到麦克斯韦
    \[\newcommand{\Co}{\operatornameC}\newcommand{\Am}{\operatornameA}\newcommand{\Vo}{\operatornameV}\newcommand{\Me}{\operatornamem}\newcommand{\Se}{\operatornames}\newcommand{\Ne}{\operatornameN}\newcommand{\Fa}{\operatorn......
  • Java 反射获得构造方法
        ConstructorExercisepackageConstructorExercise20240831;importClassReflect20240831.Student;importjava.lang.reflect.Constructor;importjava.lang.reflect.InvocationTargetException;publicclassCreateInstance{publicstaticvoidmain......
  • Salt Function Flow:深度研发经验的沉淀,打造轻量级高效流程编排框架
    在开发者的世界里,业务流程编排是一个既复杂又关键的环节。如何高效地管理和编排这些流程,直接影响着系统的性能和可维护性。本次介绍一款基于大量研发实践经验而打造的流程编排框架——SaltFunctionFlow。它不仅轻量、强大,更是将多年实践中的最佳经验沉淀于其中,为开发者提......
  • 自我介绍
    这个作业属于哪个课程22级计科34班这个作业要求在哪里作业要求这个作业目标开通博客园,熟悉markdown编辑器,写一篇博客自我介绍姓名:罗祖文性别:男爱好:羽毛球、骑行、阅读、音乐软件工程课程中想解决的五个主要问题需求获取与管理:问题:如何准确地收集......
  • zdppy+vue3+onlyoffice文档管理系统实战 20240901 上课笔记 基于验证码登录功能基本完
    遗留的问题1、点击切换验证码2、1分钟后自动切换验证码点击切换验证码实现步骤:1、点击事件2、调用验证码接口3、更新验证码的值点击事件给图片添加点击事件:<img:src="'data:image/png;base64,'+captchaImg"style="width:100%;height:50px;margin-top:10......