当前位置: 首页 > news >正文

调用ragflow api实现俩个模型根据知识库的内容来进行对话 简易版

调用ragflow接口实现俩个模型对话 简易版

    • 用到的库
    • 流程
    • 代码
    • 参考文献

用到的库

  1. requests 调用api 发送请求
  2. streamlit 做一个简单的页面
  3. json 解析接口返回的内容

流程

根据ragflow官方api文档中的内容,我们需要先将api键需要放到请求头中,然后再调用new_conversation来创建会话,最后再调用completion来获取答案

代码

import requests
import streamlit as st
import json# 设置API的基础URL
base_url = "http://192.168.1.115/v1/api"
api_key_model_1 = "ragflow-Y4MDVkMWM4NTlkZjExZWZhOWMzMDI0Mm"  # 模型1的api键
api_key_model_2 = "ragflow-c3MTZkNTQyNjAyYzExZWY4NzdkMDI0Mm"  # 模型2的api键# 设置请求头
headers_model_1 = {"Content-Type": "application/json","Authorization": f"Bearer {api_key_model_1}"
}headers_model_2 = {"Content-Type": "application/json","Authorization": f"Bearer {api_key_model_2}"
}# 调用 /api/new_conversation 创建会话
def create_new_conversation(headers):url = f"{base_url}/new_conversation"response = requests.get(url, headers=headers)if response.status_code == 200:conversation_data = response.json()conversation_id = conversation_data.get("data", {}).get("id")if conversation_id:print(f"New conversation ID: {conversation_id}")  # 控制台输出会话IDreturn conversation_idelse:st.error("API响应不包含有效的会话ID。")return Noneelse:st.error(f"请求失败,状态码: {response.status_code}")st.error(f"响应内容: {response.text}")return None# 调用 /api/completion 获取答案
def get_completion(conversation_id, message, headers, model_name):url_completion = f"{base_url}/completion"data = {"conversation_id": conversation_id,"messages": [{"role": "user","content": message}],"model": model_name  # 替换为实际的模型名称}response = requests.post(url_completion, json=data, headers=headers)# 打印原始响应内容以调试print("Raw response status code:", response.status_code)  # 控制台打印状态码print("Raw response content:", response.text)  # 控制台打印完整响应内容if response.status_code == 200:try:# 处理最后一次返回的数据last_answer = ""for line in response.text.splitlines():print("Processing line:", line)  # 控制台打印当前处理的行if line.startswith("data:"):line_content = line[len("data:"):]try:json_data = json.loads(line_content)print("Parsed JSON data:", json_data)  # 控制台打印解析后的JSON数据if "data" in json_data and isinstance(json_data["data"], dict):last_answer = json_data["data"].get("answer", "")print("Current last answer:", last_answer)  # 控制台打印当前的最后答案elif json_data["data"] is True:print("Received end signal, processing complete.")  # 控制台打印结束信号breakexcept json.JSONDecodeError as e:st.error(f"无法解析JSON: {e}")continueif last_answer:# 使用repr以保留所有特殊字符在返回内容中的显示print("Final last answer:", repr(last_answer))  # 控制台打印最终的最后答案return last_answerelse:st.error("没有接收到有效的答案。")return Noneexcept ValueError as e:st.error(f"JSON解析失败: {e}")return Noneelse:st.error(f"请求失败,状态码: {response.status_code}")st.error(f"响应内容: {response.text}")return None# Streamlit 主程序
def main():st.title("模型对话系统")user_question = st.text_input("输入你的问题:")if st.button("提交"):# Step 1: 为每个模型创建新会话st.write("正在为第一个模型创建新会话...")conversation_id_model_1 = create_new_conversation(headers_model_1)st.write("正在为第二个模型创建新会话...")conversation_id_model_2 = create_new_conversation(headers_model_2)if not conversation_id_model_1 or not conversation_id_model_2:st.error("无法创建新的会话,终止操作。")return# Step 2: 获取第一个模型的回答st.write("第一个模型正在生成答案...")model_1_answer = get_completion(conversation_id_model_1, user_question, headers_model_1, "your_model_name_1")if model_1_answer:st.write("第一个模型的回答:")st.markdown(model_1_answer)  # 使用 st.markdown 解析并显示 Markdown 内容else:st.error("第一个模型无法生成答案,终止操作。")return# Step 3: 使用第二个模型对第一个模型的回答进行评估st.write("第二个模型正在评估第一个模型的回答...")evaluation_message = f"请评估以下回答的准确性和完整性:\n\n{model_1_answer}"model_2_evaluation = get_completion(conversation_id_model_2, evaluation_message, headers_model_2,"your_model_name_2")if model_2_evaluation:st.write("第二个模型的评估结果:")st.markdown(model_2_evaluation)  # 使用 st.markdown 解析并显示 Markdown 内容else:st.error("第二个模型无法进行评估,终止操作。")if __name__ == "__main__":main()

参考文献

  • ragflow官方api文档 https://github.com/infiniflow/ragflow/blob/main/docs/references/api.md

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 算法的学习笔记—数字序列中的某一位数字(牛客JZ44)
  • 从零开始:全面掌握C++ Qt开发框架基础
  • k8s POD控制器
  • 【DSP+FPGA】基于Virtex-7 FPGA + C6678 DSP的高性能实时信号处理平台
  • Golang学习总结
  • LeetCode49题的反思
  • IO进程day05(线程、同步、互斥、条件变量、进程间通信IPC)
  • sqlite3数据库
  • 第九届中国大学生程序设计竞赛(秦皇岛)-(CCPC2023-Qinhuangdao F - 质数之谜(DP)
  • 谈谈nvm、nrm、pnpm的理解
  • FPGA速度优化
  • 新手该如何选择与小程序定位相关的关键词
  • Yolo环境搭建(深度学习基础环境)
  • 利用优先级队列的堆排序练习
  • visual studio 2005 ( vs2005 , vc2005 ) 编译的应用程序无法运行的解决方案
  • [ JavaScript ] 数据结构与算法 —— 链表
  • AWS实战 - 利用IAM对S3做访问控制
  • go append函数以及写入
  • Java|序列化异常StreamCorruptedException的解决方法
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Python3爬取英雄联盟英雄皮肤大图
  • 给第三方使用接口的 URL 签名实现
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 来,膜拜下android roadmap,强大的执行力
  • 使用Gradle第一次构建Java程序
  • 我的面试准备过程--容器(更新中)
  • 物联网链路协议
  • 消息队列系列二(IOT中消息队列的应用)
  • 新书推荐|Windows黑客编程技术详解
  • 学习Vue.js的五个小例子
  • 怎样选择前端框架
  • hi-nginx-1.3.4编译安装
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​flutter 代码混淆
  • # 透过事物看本质的能力怎么培养?
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #php的pecl工具#
  • #stm32整理(一)flash读写
  • (2)STL算法之元素计数
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (C)一些题4
  • (C++20) consteval立即函数
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • @Async注解的坑,小心
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [04] Android逐帧动画(一)
  • [04]Web前端进阶—JS伪数组
  • [AutoSar]BSW_OS 02 Autosar OS_STACK
  • [BJDCTF2020]EzPHP1