├── README.md ├── chatMemoryTest ├── fromApiTest.py ├── fromJsonTest.py ├── prompt_template_system.txt └── prompt_template_user.txt ├── chatTest ├── fromApiTest.py ├── fromJsonTest.py ├── prompt_template_system.txt └── prompt_template_user.txt ├── ragTest ├── fromApiTest.py ├── fromJsonTest.py ├── prompt_template.txt └── 健康档案.pdf └── requirements.txt /README.md: -------------------------------------------------------------------------------- 1 | # 0、项目简介 2 | 实现使用开源的LangFlow框架,零代码实现大模型相关应用如流量包推荐智能客服、RAG应用等,并使用两种方式将创建的工作流集成到自己的项目中 3 | 相关教程视频链接: 4 | (1)【LangFlow+零代码快速搭建AI工作流】并将创建的工作流快速集成到自己的项目中,同时支持GPT大模型、国产大模型等 5 | https://www.bilibili.com/video/BV1qMp8ebE7x/?vd_source=30acb5331e4f5739ebbad50f7cc6b949 6 | https://youtu.be/vn03FLqQz4A 7 | 8 | (2)【零代码快速搭建带记忆功能的对话应用】LangFlow创建工作流并提供两种方式快速集成到自己的项目中,同时支持GPT大模型、国产大模型等 9 | https://www.bilibili.com/video/BV1HYpqexEDm/?vd_source=30acb5331e4f5739ebbad50f7cc6b949 10 | https://youtu.be/2W_WwciiSf0 11 | 12 | (3)【零代码快速搭建RAG应用】LangFlow+Ollama本地开源大模型创建工作流实现本地知识库RAG应用并提供两种方式快速集成到自己的项目中 13 | https://www.bilibili.com/video/BV1FPpne3Ekz/?vd_source=30acb5331e4f5739ebbad50f7cc6b949 14 | https://youtu.be/GUEx5g-Nu6k 15 | 16 | 17 | # 1、基础概念 18 | ## 1.1 LangFlow简介 19 | 官方介绍:一种用于构建多智能体和RAG应用的可视化框架 20 | GitHub地址:https://github.com/langflow-ai/langflow 21 | 开源协议:MIT协议 22 | 23 | 24 | # 2、前期准备工作 25 | ## 2.1 anaconda、pycharm 安装 26 | anaconda:提供python虚拟环境,官网下载对应系统版本的安装包安装即可 27 | pycharm:提供集成开发环境,官网下载社区版本安装包安装即可 28 | 可参考如下视频进行安装: 29 | https://www.bilibili.com/video/BV1q9HxeEEtT/?vd_source=30acb5331e4f5739ebbad50f7cc6b949 30 | https://youtu.be/myVgyitFzrA 31 | 32 | ## 2.2 非GPT大模型(国产大模型)使用方案,OneAPI安装、部署、创建渠道和令牌 33 | ### (1)OneAPI是什么 34 | 官方介绍:是OpenAI接口的管理、分发系统 35 | 支持 Azure、Anthropic Claude、Google PaLM 2 & Gemini、智谱 ChatGLM、百度文心一言、讯飞星火认知、阿里通义千问、360 智脑以及腾讯混元 36 | ### (2)安装、部署、创建渠道和令牌 37 | 创建渠道:大模型类型(通义千问)、APIKey(通义千问申请的真实有效的APIKey) 38 | 创建令牌:创建OneAPI的APIKey,后续代码中直接调用此APIKey 39 | ### (3)详细介绍可以观看这期视频 40 | 【GraphRAG+阿里通义千问大模型】构建+检索全流程实操,打造基于知识图谱的本地知识库,本地搜索、全局搜索二合一 41 | https://www.bilibili.com/video/BV1yzHxeZEG5/?vd_source=30acb5331e4f5739ebbad50f7cc6b949 42 | https://youtu.be/w9CRDbafhPI 43 | 44 | ## 2.3 GPT大模型使用方案 45 | 可以使用代理的方式,具体代理方案自己选择 46 | 可以参考视频《GraphRAG最新版本0.3.0对比实战评测-使用gpt-4o-mini和qwen-plus分别构建近2万字文本知识索引+本地/全局检索对比测试》中推荐的方式: 47 | https://www.bilibili.com/video/BV1maHxeYEB1/?vd_source=30acb5331e4f5739ebbad50f7cc6b949 48 | https://youtu.be/iXfsJrXCEwA 49 | 50 | 51 | # 3、项目初始化 52 | ## 3.1 下载源码 53 | GitHub中下载工程文件到本地,下载地址如下: 54 | https://github.com/NanGePlus/LangFlowTest 55 | https://gitee.com/NanGePlus/LangFlowTest 56 | 57 | ## 3.2 构建项目 58 | 使用pycharm构建一个项目,为项目配置虚拟python环境 59 | 项目名称:LangFlowTest 60 | 61 | ## 3.3 将相关代码拷贝到项目工程中 62 | 直接将下载的文件夹中的文件拷贝到新建的项目目录中 63 | 64 | ## 3.4 安装项目依赖 65 | pip install -r requirements.txt 66 | 每个软件包后面都指定了本次视频测试中固定的版本号 67 | 68 | # 4、项目测试 69 | ## 4.1 基础案例:推荐流量包的智能客服测试 70 | ### (1)使用LangFlow搭建推荐流量包的智能客服工作流 71 | 首先,在终端命令行中启动LangFlow服务,执行 langflow run 命令启动 72 | 启动成功后,登陆http://127.0.0.1:7860,在服务页面进入store菜单中创建API Key 73 | 最后进入My Collectio菜单中新建工程进行工作流编排,测试没问题后,导出工作流json文件 74 | ### (2)通过调用API接口方式使用创建的工作流 75 | 进入chatTest文件夹下,在使用python fromApiTest.py命令启动脚本前,需根据自己的实际情况调整代码中的如下参数: 76 | **模型相关配置 根据自己的实际情况进行调整** 77 | ### (3)通过调用工作流的json文件使用工作流 78 | 进入chatTest文件夹下,在使用python fromJsonTest.py命令启动脚本前,需根据自己的实际情况调整代码中的如下参数: 79 | **模型相关配置 根据自己的实际情况进行调整** 80 | **引入LangFlow的json文件** 81 | 82 | ## 4.2 进阶案例:推荐流量包的智能客服测试(带有记忆功能) 83 | ### (1)使用LangFlow搭建推荐流量包的智能客服工作流 84 | 首先,在终端命令行中启动LangFlow服务,执行 langflow run 命令启动 85 | 启动成功后,登陆http://127.0.0.1:7860,在服务页面进入store菜单中创建API Key 86 | 最后进入My Collectio菜单中新建工程进行工作流编排,测试没问题后,导出工作流json文件 87 | ### (2)通过调用API接口方式使用创建的工作流 88 | 进入chatMemoryTest文件夹下,在使用python fromApiTest.py命令启动脚本前,需根据自己的实际情况调整代码中的如下参数: 89 | **模型相关配置 根据自己的实际情况进行调整** 90 | ### (3)通过调用工作流的json文件使用工作流 91 | 进入chatMemoryTest文件夹下,在使用python fromJsonTest.py命令启动脚本前,需根据自己的实际情况调整代码中的如下参数: 92 | **模型相关配置 根据自己的实际情况进行调整** 93 | **引入LangFlow的json文件** 94 | 95 | ## 4.3 进阶案例:健康档案私有知识库 96 | 在本进阶案例零代码实现健康档案私有知识库构建并使用本地开源大模型进行检索全流程。功能: 97 | 离线步骤:文档加载->文档切分->向量化->灌入向量数据库 98 | 在线步骤:获取用户问题->用户问题向量化->检索向量数据库->将检索结果和用户问题填入prompt模版->用最终的prompt调用LLM->由LLM生成回复 99 | **本案例通过代码实现,请查看这期视频:** 100 | 【流程实操】RAG+LangChain+FastAPI+OpenAI+通义千问打造私有领域知识库,构建和检索全流程源码分享,一份代码搞定多类型大模型集成 101 | https://www.bilibili.com/video/BV1ryHxesEHs/?vd_source=30acb5331e4f5739ebbad50f7cc6b949 102 | https://youtu.be/xAEi5CWEIl0 103 | ### (1)Chroma数据库 104 | 向量数据库,专门为向量检索设计的中间件 105 | 使用本地持久化存储方案 持久化一个本地文件夹 106 | ### (2)本地开源大模型,Ollama方案 107 | Ollama是一个轻量级、跨平台的工具和库,专门为本地大语言模型(LLM)的部署和运行提供支持 108 | 它旨在简化在本地环境中运行大模型的过程,不需要依赖云服务或外部API,使用户能够更好地掌控和使用大型模型 109 | 安装Ollama,进入官网https://ollama.com/下载对应系统版本直接安装即可 110 | 启动Ollama,安装所需要使用的本地模型,执行指令进行安装即可: 111 | ollama pull qwen2:latest 112 | ollama pull llama3.1:latest 113 | ollama pull nomic-embed-text:latest 114 | 本次使用的模型如下: 115 | chat模型:qwen2:latest(7b),对应版本有0.5b、1.5b、7b、72b;llama3.1:latest(8b),对应版本有8b、70b、405b等 116 | embedding模型:nomic-embed-text:latest(也就是1.5版本) 117 | 具体安装相关的细节,可以参考这期视频: 118 | 【GraphRAG+Ollama】本地开源大模型llama3.1与qwen2构建+检索全流程实操对比评测,打造基于知识图谱的本地知识库,本地搜索、全局搜索二合一 119 | https://www.bilibili.com/video/BV1mpH9eVES1/?vd_source=30acb5331e4f5739ebbad50f7cc6b949 120 | https://youtu.be/thNMan45lWA 121 | ### (3)启动LangFlow服务 122 | 首先,在终端命令行中启动LangFlow服务,执行 langflow run 命令启动 123 | 启动成功后,登陆http://127.0.0.1:7860,在服务页面进入store菜单中创建API Key 124 | 最后进入My Collection菜单中新建工程进行工作流编排 125 | ### (4)使用LangFlow搭建灌库工作流 126 | 离线步骤:文档加载->文档切分->向量化->灌入向量数据库 127 | ### (5)使用LangFlow搭建知识库检索工作流 128 | 在线步骤:获取用户问题->用户问题向量化->检索向量数据库->将检索结果和用户问题填入prompt模版->用最终的prompt调用LLM->由LLM生成回复 129 | ### (6)通过调用API接口方式使用创建的工作流 130 | 进入ragTest文件夹下,在使用python fromApiTest.py命令启动脚本前,需根据自己的实际情况调整代码中的如下参数: 131 | **模型相关配置 根据自己的实际情况进行调整** 132 | ### (7)通过调用工作流的json文件使用工作流 133 | 进入ragTest文件夹下,在使用python fromJsonTest.py命令启动脚本前,需根据自己的实际情况调整代码中的如下参数: 134 | **模型相关配置 根据自己的实际情况进行调整** 135 | **引入LangFlow的json文件** 136 | -------------------------------------------------------------------------------- /chatMemoryTest/fromApiTest.py: -------------------------------------------------------------------------------- 1 | # 使用API接口进行调用 2 | import requests 3 | import json 4 | import logging 5 | 6 | # 设置日志模版 7 | logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') 8 | logger = logging.getLogger(__name__) 9 | 10 | # 1、模型相关配置 11 | # # openai模型相关配置 根据自己的实际情况进行调整 12 | MODEL_API_BASE = "https://api.wlai.vip/v1" 13 | MODEL_CHAT_API_KEY = "sk-8B451N7cQ7r2QiXh60Df56714bC64678A42597789e53213a" 14 | MODEL_CHAT_MODEL = "gpt-4o-mini" 15 | 16 | # oneapi相关配置(通义千问为例) 根据自己的实际情况进行调整 17 | # MODEL_API_BASE = "http://139.224.72.218:3000/v1" 18 | # MODEL_CHAT_API_KEY = "sk-DoU00d1PaOMCFrSh68196328E08e443a8886E95761D7F4Bf" 19 | # MODEL_CHAT_MODEL = "qwen-max" 20 | 21 | 22 | # 2、prompt相关配置 引入外部的文件内容 23 | sys_file_path = "prompt_template_system.txt" 24 | user_file_path = "prompt_template_user.txt" 25 | with open(sys_file_path, 'r', encoding='utf-8') as file: 26 | PROMPT_TEMPLATE_TXT_SYS = file.read() 27 | with open(user_file_path, 'r', encoding='utf-8') as file: 28 | PROMPT_TEMPLATE_TXT_USER = file.read() 29 | 30 | # 3、API请求相关配置 根据自己的实际情况进行调整 31 | url = "http://127.0.0.1:7860/api/v1/run/chatMemory" 32 | headers = {"Content-Type": "application/json"} 33 | 34 | 35 | # 4、构造测试消息体 36 | input_text = "有低于200元的套餐吗" 37 | # input_text = "那给我详细介绍下经济套餐吧" 38 | # input_text = "这个套餐是多少钱" 39 | # input_text = "流量是多少" 40 | 41 | data = { 42 | "input_value": input_text, 43 | "output_type": "chat", 44 | "input_type": "chat", 45 | "tweaks": { 46 | "OpenAIModel-HXl0Q": { 47 | "api_key": MODEL_CHAT_API_KEY, 48 | # "input_value": "", 49 | "json_mode": False, 50 | "max_tokens": None, 51 | "model_kwargs": {}, 52 | "model_name": MODEL_CHAT_MODEL, 53 | "openai_api_base": MODEL_API_BASE, 54 | "output_schema": {}, 55 | "seed": 1, 56 | "stream": False, 57 | "system_message": "", 58 | "temperature": 0.1 59 | }, 60 | "Prompt-jwobs": { 61 | # "template": "你是一个推荐手机流量套餐的客服代表,你叫NanGe。\n你可以帮助用户选择最合适的流量套餐产品。可以选择的套餐包括:\n经济套餐,月费50元,10G流量;\n畅游套餐,月费180元,100G流量;\n无限套餐,月费300元,1000G流量;\n校园套餐,月费150元,200G流量,仅限在校生。\n\n下面是给你参考的多轮对话的例子:\n例子1:\n客服:有什么可以帮您\n用户:100G套餐有什么\n客服:我们现在有无限套餐,1000G流量,月费300元\n用户:这个套餐是多少钱\n客服:这个套餐是300元\n\n例子2:\n客服:有什么可以帮您\n用户:便宜的套餐有什么\n客服:我们现在有经济套餐,每月50元,10G流量\n用户:100G以上的有什么\n\n例子3:\n客服:有什么可以帮您\n用户:100G以上的套餐有什么\n客服:我们现在有畅游套餐,流量100G,月费180元\n用户:流量最多的呢\n\n例子4:\n客服:有什么可以帮您\n用户:1000元月费的套餐有吗\n客服:没有找到满足1000元价位的产品,是否选择其他套餐\n\n记住:回复时要求你使用口语,亲切一些。不用说“抱歉”。直接给出回答,不用在前面加“NanGe说:”。NO COMMENTS. NO ACKNOWLEDGEMENTS.\n\n" 62 | "template": PROMPT_TEMPLATE_TXT_SYS 63 | }, 64 | "Prompt-pzIoo": { 65 | # "template": "用户问:\n{query}\n\n历史对话内容:\n{content}", 66 | "template": PROMPT_TEMPLATE_TXT_USER, 67 | "query": "", 68 | "content": "" 69 | }, 70 | "ChatInput-0GC39": { 71 | "files": "", 72 | # "input_value": "多大的流量", 73 | "sender": "User", 74 | "sender_name": "User", 75 | "session_id": "", 76 | "should_store_message": True 77 | }, 78 | "ChatOutput-VQ5Nb": { 79 | "data_template": "{text}", 80 | # "input_value": "", 81 | "sender": "Machine", 82 | "sender_name": "AI", 83 | "session_id": "", 84 | "should_store_message": True 85 | }, 86 | "Memory-eI9M7": { 87 | "n_messages": 100, 88 | "order": "Ascending", 89 | "sender": "Machine and User", 90 | "sender_name": "", 91 | "session_id": "", 92 | "template": "{sender_name}: {text}" 93 | } 94 | } 95 | } 96 | 97 | 98 | # 5、发送post请求进行测试 99 | response = requests.post(url, headers=headers, data=json.dumps(data)) 100 | # 检查响应状态码 101 | if response.status_code == 200: 102 | try: 103 | logger.info(f"输出响应内容是: {response.status_code}\n") 104 | logger.info(f"输出响应内容是: {response.json()}\n") 105 | # 解析具体回复的内容 106 | content = response.json()['outputs'][0]['outputs'][0]['results']['message']['data']['text'] 107 | logger.info(f"输出响应内容是: {content}\n") 108 | except requests.exceptions.JSONDecodeError: 109 | # 响应不是JSON格式 110 | logger.info("Response content is not valid JSON") 111 | else: 112 | logger.info(f"Request failed with status code {response.status_code}") 113 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /chatMemoryTest/fromJsonTest.py: -------------------------------------------------------------------------------- 1 | # 使用JSON文件进行调用 2 | from langflow.load import run_flow_from_json 3 | import json 4 | import logging 5 | 6 | 7 | # 设置日志模版 8 | logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') 9 | logger = logging.getLogger(__name__) 10 | 11 | 12 | # 1、模型相关配置 13 | # # openai模型相关配置 根据自己的实际情况进行调整 14 | # MODEL_API_BASE = "https://api.wlai.vip/v1" 15 | # MODEL_CHAT_API_KEY = "sk-8B451N7cQ7r2QiXh60Df56714bC64678A42597789e53213a" 16 | # MODEL_CHAT_MODEL = "gpt-4o-mini" 17 | 18 | # oneapi相关配置(通义千问为例) 根据自己的实际情况进行调整 19 | # MODEL_API_BASE = "http://139.224.72.218:3000/v1" 20 | # MODEL_CHAT_API_KEY = "sk-DoU00d1PaOMCFrSh68196328E08e443a8886E95761D7F4Bf" 21 | # MODEL_CHAT_MODEL = "qwen-max" 22 | 23 | 24 | # 2、prompt相关配置 引入外部的文件内容 25 | sys_file_path = "prompt_template_system.txt" 26 | user_file_path = "prompt_template_user.txt" 27 | with open(sys_file_path, 'r', encoding='utf-8') as file: 28 | PROMPT_TEMPLATE_TXT_SYS = file.read() 29 | with open(user_file_path, 'r', encoding='utf-8') as file: 30 | PROMPT_TEMPLATE_TXT_USER = file.read() 31 | 32 | # 3、引入LangFlow的json文件 33 | TASKFLOW = 'chatMemory.json' 34 | 35 | # 4、构造测试消息体 36 | input_text = "有低于200元的套餐吗" 37 | # input_text = "那给我详细介绍下经济套餐吧" 38 | # input_text = "这个套餐是多少钱" 39 | # input_text = "流量是多少" 40 | 41 | TWEAKS = { 42 | "OpenAIModel-HXl0Q": { 43 | "api_key": MODEL_CHAT_API_KEY, 44 | # "input_value": "", 45 | "json_mode": False, 46 | "max_tokens": None, 47 | "model_kwargs": {}, 48 | "model_name": MODEL_CHAT_MODEL, 49 | "openai_api_base": MODEL_API_BASE, 50 | "output_schema": {}, 51 | "seed": 1, 52 | "stream": False, 53 | "system_message": "", 54 | "temperature": 0.1 55 | }, 56 | "Prompt-jwobs": { 57 | # "template": "你是一个推荐手机流量套餐的客服代表,你叫NanGe。\n你可以帮助用户选择最合适的流量套餐产品。可以选择的套餐包括:\n经济套餐,月费50元,10G流量;\n畅游套餐,月费180元,100G流量;\n无限套餐,月费300元,1000G流量;\n校园套餐,月费150元,200G流量,仅限在校生。\n\n下面是给你参考的多轮对话的例子:\n例子1:\n客服:有什么可以帮您\n用户:100G套餐有什么\n客服:我们现在有无限套餐,1000G流量,月费300元\n用户:这个套餐是多少钱\n客服:这个套餐是300元\n\n例子2:\n客服:有什么可以帮您\n用户:便宜的套餐有什么\n客服:我们现在有经济套餐,每月50元,10G流量\n用户:100G以上的有什么\n\n例子3:\n客服:有什么可以帮您\n用户:100G以上的套餐有什么\n客服:我们现在有畅游套餐,流量100G,月费180元\n用户:流量最多的呢\n\n例子4:\n客服:有什么可以帮您\n用户:1000元月费的套餐有吗\n客服:没有找到满足1000元价位的产品,是否选择其他套餐\n\n记住:回复时要求你使用口语,亲切一些。不用说“抱歉”。直接给出回答,不用在前面加“NanGe说:”。NO COMMENTS. NO ACKNOWLEDGEMENTS.\n\n" 58 | "template": PROMPT_TEMPLATE_TXT_SYS 59 | }, 60 | "Prompt-pzIoo": { 61 | # "template": "用户问:\n{query}\n\n历史对话内容:\n{content}", 62 | "template": PROMPT_TEMPLATE_TXT_USER, 63 | "query": "", 64 | "content": "" 65 | }, 66 | "ChatInput-0GC39": { 67 | "files": "", 68 | # "input_value": "多大的流量", 69 | "sender": "User", 70 | "sender_name": "User", 71 | "session_id": "", 72 | "should_store_message": True 73 | }, 74 | "ChatOutput-VQ5Nb": { 75 | "data_template": "{text}", 76 | # "input_value": "", 77 | "sender": "Machine", 78 | "sender_name": "AI", 79 | "session_id": "", 80 | "should_store_message": True 81 | }, 82 | "Memory-eI9M7": { 83 | "n_messages": 100, 84 | "order": "Ascending", 85 | "sender": "Machine and User", 86 | "sender_name": "", 87 | "session_id": "", 88 | "template": "{sender_name}: {text}" 89 | } 90 | } 91 | 92 | result = run_flow_from_json(flow=TASKFLOW, 93 | input_value=input_text, 94 | fallback_to_env_vars=True, # False by default 95 | tweaks=TWEAKS) 96 | 97 | 98 | # # 解析具体回复的内容 99 | logger.info(f"输出响应内容是: {result}\n") 100 | content = result[0].outputs[0].results['message'].text 101 | logger.info(f"输出响应内容是: {content}\n") 102 | -------------------------------------------------------------------------------- /chatMemoryTest/prompt_template_system.txt: -------------------------------------------------------------------------------- 1 | 你是一个推荐手机流量套餐的客服代表,你叫NanGe。 2 | 你可以帮助用户选择最合适的流量套餐产品。可以选择的套餐包括: 3 | 经济套餐,月费50元,10G流量; 4 | 畅游套餐,月费180元,100G流量; 5 | 无限套餐,月费300元,1000G流量; 6 | 校园套餐,月费150元,200G流量,仅限在校生。 7 | 8 | 记住:回复时要求你使用口语,亲切一些。不用说“抱歉”。直接给出回答,不用在前面加“NanGe说:”。NO COMMENTS. NO ACKNOWLEDGEMENTS. 9 | 10 | -------------------------------------------------------------------------------- /chatMemoryTest/prompt_template_user.txt: -------------------------------------------------------------------------------- 1 | 用户问: 2 | {query} 3 | 4 | 历史对话内容: 5 | {content} 6 | -------------------------------------------------------------------------------- /chatTest/fromApiTest.py: -------------------------------------------------------------------------------- 1 | # 使用API接口进行调用 2 | import requests 3 | import json 4 | import logging 5 | 6 | # 设置日志模版 7 | logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') 8 | logger = logging.getLogger(__name__) 9 | 10 | # 1、模型相关配置 11 | # # openai模型相关配置 根据自己的实际情况进行调整 12 | # MODEL_API_BASE = "https://api.wlai.vip/v1" 13 | # MODEL_CHAT_API_KEY = "sk-EhxvNWXkjzZJADfHA1Ac24Dd0f0b42B2B97f3725D3BcA378" 14 | # MODEL_CHAT_MODEL = "gpt-4o-mini" 15 | 16 | # oneapi相关配置(通义千问为例) 根据自己的实际情况进行调整 17 | MODEL_API_BASE = "http://139.224.72.218:3000/v1" 18 | MODEL_CHAT_API_KEY = "sk-DoU00d1PaOMCFrSh68196328E08e443a8886E95761D7F4Bf" 19 | MODEL_CHAT_MODEL = "qwen-max" 20 | 21 | 22 | # 2、prompt相关配置 引入外部的文件内容 23 | sys_file_path = "prompt_template_system.txt" 24 | user_file_path = "prompt_template_user.txt" 25 | with open(sys_file_path, 'r', encoding='utf-8') as file: 26 | PROMPT_TEMPLATE_TXT_SYS = file.read() 27 | with open(user_file_path, 'r', encoding='utf-8') as file: 28 | PROMPT_TEMPLATE_TXT_USER = file.read() 29 | 30 | # 3、API请求相关配置 31 | url = "http://127.0.0.1:7860/api/v1/run/test" 32 | headers = {"Content-Type": "application/json"} 33 | 34 | 35 | # 4、构造测试消息体 36 | input_text = "有没有土豪套餐" 37 | input_text = "办个200G的套餐" 38 | # input_text = "有没有流量大的套餐" 39 | # input_text = "200元以下,流量大的套餐有啥" 40 | # input_text = "你说那个10G的套餐,叫啥名字" 41 | # input_text = "你说那个100000000G的套餐,叫啥名字" 42 | 43 | data = { 44 | "input_value": input_text, 45 | "output_type": "chat", 46 | "input_type": "chat", 47 | "tweaks": { 48 | "ChatInput-I1FjN": { 49 | "files": "", 50 | # "input_value": "", 51 | "sender": "User", 52 | "sender_name": "User", 53 | "session_id": "", 54 | "should_store_message": True 55 | }, 56 | "OpenAIModel-0XDe1": { 57 | "api_key": MODEL_CHAT_API_KEY, 58 | # "input_value": "", 59 | "json_mode": False, 60 | "max_tokens": None, 61 | "model_kwargs": {}, 62 | "model_name": MODEL_CHAT_MODEL, 63 | "openai_api_base": MODEL_API_BASE, 64 | "output_schema": {}, 65 | "seed": 1, 66 | "stream": False, 67 | "system_message": "", 68 | "temperature": 0.2 69 | }, 70 | "ChatOutput-cPe9N": { 71 | "data_template": "{text}", 72 | # "input_value": "", 73 | "sender": "Machine", 74 | "sender_name": "AI", 75 | "session_id": "", 76 | "should_store_message": True 77 | }, 78 | "Prompt-DmUDu": { 79 | # "template": "用户问:\n{query}\n", 80 | "template": PROMPT_TEMPLATE_TXT_USER, 81 | "query": "" 82 | }, 83 | "Prompt-W8qcy": { 84 | # "template": "你是一个推荐手机流量套餐的客服代表,你叫NanGe。\n你可以帮助用户选择最合适的流量套餐产品。可以选择的套餐包括:\n经济套餐,月费50元,10G流量;\n畅游套餐,月费180元,100G流量;\n无限套餐,月费300元,1000G流量;\n校园套餐,月费150元,200G流量,仅限在校生。\n\n下面是给你参考的多轮对话的例子:\n例子1:\n客服:有什么可以帮您\n用户:100G套餐有什么\n客服:我们现在有无限套餐,1000G流量,月费300元\n用户:这个套餐是多少钱\n客服:这个套餐是300元\n\n例子2:\n客服:有什么可以帮您\n用户:便宜的套餐有什么\n客服:我们现在有经济套餐,每月50元,10G流量\n用户:100G以上的有什么\n\n例子3:\n客服:有什么可以帮您\n用户:100G以上的套餐有什么\n客服:我们现在有畅游套餐,流量100G,月费180元\n用户:流量最多的呢\n\n例子4:\n客服:有什么可以帮您\n用户:1000元月费的套餐有吗\n客服:没有找到满足1000元价位的产品,是否选择其他套餐\n\n记住:回复时要求你使用口语,亲切一些。不用说“抱歉”。直接给出回答,不用在前面加“NanGe说:”。NO COMMENTS. NO ACKNOWLEDGEMENTS.\n\n" 85 | "template":PROMPT_TEMPLATE_TXT_SYS 86 | } 87 | } 88 | } 89 | 90 | 91 | # 5、发送post请求进行测试 92 | response = requests.post(url, headers=headers, data=json.dumps(data)) 93 | # 检查响应状态码 94 | if response.status_code == 200: 95 | try: 96 | logger.info(f"输出响应内容是: {response.status_code}\n") 97 | logger.info(f"输出响应内容是: {response.json()}\n") 98 | # 解析具体回复的内容 99 | content = response.json()['outputs'][0]['outputs'][0]['results']['message']['data']['text'] 100 | logger.info(f"输出响应内容是: {content}\n") 101 | except requests.exceptions.JSONDecodeError: 102 | # 响应不是JSON格式 103 | logger.info("Response content is not valid JSON") 104 | else: 105 | logger.info(f"Request failed with status code {response.status_code}") 106 | 107 | 108 | 109 | -------------------------------------------------------------------------------- /chatTest/fromJsonTest.py: -------------------------------------------------------------------------------- 1 | # 使用JSON文件进行调用 2 | from langflow.load import run_flow_from_json 3 | import json 4 | import logging 5 | 6 | 7 | # 设置日志模版 8 | logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') 9 | logger = logging.getLogger(__name__) 10 | 11 | 12 | # 1、模型相关配置 13 | # # openai模型相关配置 根据自己的实际情况进行调整 14 | # MODEL_API_BASE = "https://api.wlai.vip/v1" 15 | # MODEL_CHAT_API_KEY = "sk-EhxvNWXkjzZJADfHA1Ac24Dd0f0b42B2B97f3725D3BcA378" 16 | # MODEL_CHAT_MODEL = "gpt-4o-mini" 17 | 18 | # oneapi相关配置(通义千问为例) 根据自己的实际情况进行调整 19 | MODEL_API_BASE = "http://139.224.72.218:3000/v1" 20 | MODEL_CHAT_API_KEY = "sk-DoU00d1PaOMCFrSh68196328E08e443a8886E95761D7F4Bf" 21 | MODEL_CHAT_MODEL = "qwen-max" 22 | 23 | 24 | # 2、prompt相关配置 引入外部的文件内容 25 | sys_file_path = "prompt_template_system.txt" 26 | user_file_path = "prompt_template_user.txt" 27 | with open(sys_file_path, 'r', encoding='utf-8') as file: 28 | PROMPT_TEMPLATE_TXT_SYS = file.read() 29 | with open(user_file_path, 'r', encoding='utf-8') as file: 30 | PROMPT_TEMPLATE_TXT_USER = file.read() 31 | 32 | # 3、引入LangFlow的json文件 33 | TASKFLOW = 'test.json' 34 | 35 | # 4、构造测试消息体 36 | input_text = "有没有土豪套餐" 37 | input_text = "办个200G的套餐" 38 | # input_text = "有没有流量大的套餐" 39 | # input_text = "200元以下,流量大的套餐有啥" 40 | # input_text = "你说那个10G的套餐,叫啥名字" 41 | # input_text = "你说那个100000000G的套餐,叫啥名字" 42 | 43 | TWEAKS = { 44 | "ChatInput-I1FjN": { 45 | "files": "", 46 | # "input_value": "", 47 | "sender": "User", 48 | "sender_name": "User", 49 | "session_id": "", 50 | "should_store_message": True 51 | }, 52 | "OpenAIModel-0XDe1": { 53 | "api_key": MODEL_CHAT_API_KEY, 54 | # "input_value": "", 55 | "json_mode": False, 56 | "max_tokens": None, 57 | "model_kwargs": {}, 58 | "model_name": MODEL_CHAT_MODEL, 59 | "openai_api_base": MODEL_API_BASE, 60 | "output_schema": {}, 61 | "seed": 1, 62 | "stream": False, 63 | "system_message": "", 64 | "temperature": 0.2 65 | }, 66 | "ChatOutput-cPe9N": { 67 | "data_template": "{text}", 68 | # "input_value": "", 69 | "sender": "Machine", 70 | "sender_name": "AI", 71 | "session_id": "", 72 | "should_store_message": True 73 | }, 74 | "Prompt-DmUDu": { 75 | # "template": "用户问:\n{query}\n", 76 | "template": PROMPT_TEMPLATE_TXT_USER, 77 | "query": "" 78 | }, 79 | "Prompt-W8qcy": { 80 | # "template": "你是一个推荐手机流量套餐的客服代表,你叫NanGe。\n你可以帮助用户选择最合适的流量套餐产品。可以选择的套餐包括:\n经济套餐,月费50元,10G流量;\n畅游套餐,月费180元,100G流量;\n无限套餐,月费300元,1000G流量;\n校园套餐,月费150元,200G流量,仅限在校生。\n\n下面是给你参考的多轮对话的例子:\n例子1:\n客服:有什么可以帮您\n用户:100G套餐有什么\n客服:我们现在有无限套餐,1000G流量,月费300元\n用户:这个套餐是多少钱\n客服:这个套餐是300元\n\n例子2:\n客服:有什么可以帮您\n用户:便宜的套餐有什么\n客服:我们现在有经济套餐,每月50元,10G流量\n用户:100G以上的有什么\n\n例子3:\n客服:有什么可以帮您\n用户:100G以上的套餐有什么\n客服:我们现在有畅游套餐,流量100G,月费180元\n用户:流量最多的呢\n\n例子4:\n客服:有什么可以帮您\n用户:1000元月费的套餐有吗\n客服:没有找到满足1000元价位的产品,是否选择其他套餐\n\n记住:回复时要求你使用口语,亲切一些。不用说“抱歉”。直接给出回答,不用在前面加“NanGe说:”。NO COMMENTS. NO ACKNOWLEDGEMENTS.\n\n" 81 | "template": PROMPT_TEMPLATE_TXT_SYS 82 | } 83 | } 84 | 85 | result = run_flow_from_json(flow=TASKFLOW, 86 | input_value=input_text, 87 | fallback_to_env_vars=True, # False by default 88 | tweaks=TWEAKS) 89 | 90 | 91 | # # 解析具体回复的内容 92 | logger.info(f"输出响应内容是: {result}\n") 93 | content = result[0].outputs[0].results['message'].text 94 | logger.info(f"输出响应内容是: {content}\n") 95 | -------------------------------------------------------------------------------- /chatTest/prompt_template_system.txt: -------------------------------------------------------------------------------- 1 | 你是一个推荐手机流量套餐的客服代表,你叫NanGe。 2 | 你可以帮助用户选择最合适的流量套餐产品。可以选择的套餐包括: 3 | 经济套餐,月费50元,10G流量; 4 | 畅游套餐,月费180元,100G流量; 5 | 无限套餐,月费300元,1000G流量; 6 | 校园套餐,月费150元,200G流量,仅限在校生。 7 | 8 | 下面是给你参考的多轮对话的例子: 9 | 例子1: 10 | 客服:有什么可以帮您 11 | 用户:100G套餐有什么 12 | 客服:我们现在有无限套餐,1000G流量,月费300元 13 | 用户:这个套餐是多少钱 14 | 客服:这个套餐是300元 15 | 16 | 例子2: 17 | 客服:有什么可以帮您 18 | 用户:便宜的套餐有什么 19 | 客服:我们现在有经济套餐,每月50元,10G流量 20 | 用户:100G以上的有什么 21 | 22 | 例子3: 23 | 客服:有什么可以帮您 24 | 用户:100G以上的套餐有什么 25 | 客服:我们现在有畅游套餐,流量100G,月费180元 26 | 用户:流量最多的呢 27 | 28 | 例子4: 29 | 客服:有什么可以帮您 30 | 用户:1000元月费的套餐有吗 31 | 客服:没有找到满足1000元价位的产品,是否选择其他套餐 32 | 33 | 记住:回复时要求你使用口语,亲切一些。不用说“抱歉”。直接给出回答,不用在前面加“NanGe说:”。NO COMMENTS. NO ACKNOWLEDGEMENTS. 34 | 35 | -------------------------------------------------------------------------------- /chatTest/prompt_template_user.txt: -------------------------------------------------------------------------------- 1 | 用户问: 2 | {query} 3 | 4 | -------------------------------------------------------------------------------- /ragTest/fromApiTest.py: -------------------------------------------------------------------------------- 1 | # 使用API接口进行调用 2 | import requests 3 | import json 4 | import logging 5 | 6 | from langchain_experimental.llms.anthropic_functions import prompt 7 | 8 | # 设置日志模版 9 | logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') 10 | logger = logging.getLogger(__name__) 11 | 12 | # 1、模型相关配置 13 | # # 本地模型模型相关配置 根据自己的实际情况进行调整 14 | # MODEL_API_BASE = "http://192.168.2.9:11434" 15 | # # qwen2:latest llama3.1:latest gemma2:latest 16 | # MODEL_CHAT_MODEL = "qwen2:latest" 17 | # MODEL_Embedding_MODEL = "nomic-embed-text:latest" 18 | 19 | # # 2、prompt相关配置 引入外部的文件内容 20 | # prompt_file_path = "prompt_template.txt" 21 | # with open(prompt_file_path, 'r', encoding='utf-8') as file: 22 | # PROMPT_TEMPLATE_TXT = file.read() 23 | 24 | # 3、API请求相关配置 根据自己的实际情况进行调整 25 | url = "http://127.0.0.1:7860/api/v1/run/ragtest" 26 | headers = {"Content-Type": "application/json"} 27 | 28 | 29 | # 4、构造测试消息体 30 | input_text = "张三九有哪些生活方式和习惯" 31 | # input_text = "张三九的工作是什么以及工作场所是在哪里" 32 | # input_text = "张三九的配偶是谁以及其联系方式" 33 | # input_text = "给李四六的健康建议是什么" 34 | # input_text = "LangChain是什么,详细介绍下?" 35 | 36 | data = { 37 | "input_value": input_text, 38 | "output_type": "chat", 39 | "input_type": "chat", 40 | "tweaks": { 41 | "ChatInput-3pLIH": { 42 | "files": "", 43 | # "input_value": "张三九的配偶是谁以及其联系方式", 44 | "sender": "User", 45 | "sender_name": "User", 46 | "session_id": "", 47 | "should_store_message": True 48 | }, 49 | "ParseData-NEXx5": { 50 | "sep": "\n", 51 | "template": "{text}" 52 | }, 53 | "Prompt-6wckX": { 54 | "context": "", 55 | "template": "你是一个针对健康档案进行问答的机器人。\n你的任务是根据下述给定的已知信息回答用户问题。\n\n已知信息:\n{context}\n\n用户问:\n{query}\n\n如果已知信息不包含用户问题的答案,或者已知信息不足以回答用户的问题,请直接回复\"我无法回答您的问题\"。\n请不要输出已知信息中不包含的信息或答案。\n请不要输出已知信息中不包含的信息或答案。\n请不要输出已知信息中不包含的信息或答案。\n请用中文回答用户问题。", 56 | "query": "" 57 | }, 58 | "ChatOutput-xlwjc": { 59 | "data_template": "{text}", 60 | # "input_value": "", 61 | "sender": "Machine", 62 | "sender_name": "AI", 63 | "session_id": "", 64 | "should_store_message": True 65 | }, 66 | "OpenAIModel-vYDNH": { 67 | "api_key": "sk-XmrIEFplNArLlYa0E8C5A7C5F82041FdBd923e9d115746D0", 68 | # "input_value": "", 69 | "json_mode": False, 70 | "max_tokens": None, 71 | "model_kwargs": {}, 72 | "model_name": "gpt-4o-mini", 73 | "openai_api_base": "https://api.wlai.vip/v1", 74 | "output_schema": {}, 75 | "seed": 1, 76 | "stream": False, 77 | "system_message": "", 78 | "temperature": 0.1 79 | }, 80 | "Chroma-cRb29": { 81 | "allow_duplicates": False, 82 | "chroma_server_cors_allow_origins": "", 83 | "chroma_server_grpc_port": None, 84 | "chroma_server_host": "", 85 | "chroma_server_http_port": None, 86 | "chroma_server_ssl_enabled": False, 87 | "collection_name": "langflow02", 88 | "limit": None, 89 | "number_of_results": 10, 90 | "persist_directory": "ChromaDB02", 91 | "search_query": "", 92 | "search_type": "Similarity" 93 | }, 94 | "OpenAIEmbeddings-YEiqb": { 95 | "chunk_size": 1000, 96 | "client": "", 97 | "default_headers": {}, 98 | "default_query": {}, 99 | "deployment": "", 100 | "dimensions": None, 101 | "embedding_ctx_length": 1536, 102 | "max_retries": 3, 103 | "model": "text-embedding-3-small", 104 | "model_kwargs": {}, 105 | "openai_api_base": "https://api.wlai.vip/v1", 106 | "openai_api_key": "sk-XmrIEFplNArLlYa0E8C5A7C5F82041FdBd923e9d115746D0", 107 | "openai_api_type": "", 108 | "openai_api_version": "", 109 | "openai_organization": "", 110 | "openai_proxy": "", 111 | "request_timeout": None, 112 | "show_progress_bar": False, 113 | "skip_empty": False, 114 | "tiktoken_enable": True, 115 | "tiktoken_model_name": "" 116 | } 117 | } 118 | } 119 | 120 | 121 | # 5、发送post请求进行测试 122 | response = requests.post(url, headers=headers, data=json.dumps(data)) 123 | # 检查响应状态码 124 | if response.status_code == 200: 125 | try: 126 | logger.info(f"输出响应内容是: {response.status_code}\n") 127 | logger.info(f"输出响应内容是: {response.json()}\n") 128 | # 解析具体回复的内容 129 | content = response.json()['outputs'][0]['outputs'][0]['results']['message']['data']['text'] 130 | logger.info(f"输出响应内容是: {content}\n") 131 | except requests.exceptions.JSONDecodeError: 132 | # 响应不是JSON格式 133 | logger.info("Response content is not valid JSON") 134 | else: 135 | logger.info(f"Request failed with status code {response.status_code}") 136 | 137 | 138 | 139 | -------------------------------------------------------------------------------- /ragTest/fromJsonTest.py: -------------------------------------------------------------------------------- 1 | # 使用JSON文件进行调用 2 | from langflow.load import run_flow_from_json 3 | import json 4 | import logging 5 | 6 | 7 | # 设置日志模版 8 | logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') 9 | logger = logging.getLogger(__name__) 10 | 11 | 12 | # 1、模型相关配置 13 | # # 本地模型模型相关配置 根据自己的实际情况进行调整 14 | # MODEL_API_BASE = "http://192.168.2.9:11434" 15 | # # qwen2:latest llama3.1:latest gemma2:latest 16 | # MODEL_CHAT_MODEL = "qwen2:latest" 17 | # MODEL_Embedding_MODEL = "nomic-embed-text:latest" 18 | 19 | # # 2、prompt相关配置 引入外部的文件内容 20 | # prompt_file_path = "prompt_template.txt" 21 | # with open(prompt_file_path, 'r', encoding='utf-8') as file: 22 | # PROMPT_TEMPLATE_TXT = file.read() 23 | 24 | 25 | # 3、引入LangFlow的json文件 26 | TASKFLOW = 'ragtest.json' 27 | 28 | # 4、构造测试消息体 29 | input_text = "张三九有哪些生活方式和习惯" 30 | # input_text = "张三九的工作是什么以及工作场所是在哪里" 31 | # input_text = "张三九的配偶是谁以及其联系方式" 32 | # input_text = "给李四六的健康建议是什么" 33 | # input_text = "LangChain是什么,详细介绍下?" 34 | 35 | TWEAKS = { 36 | "ChatInput-3pLIH": { 37 | "files": "", 38 | # "input_value": "张三九的配偶是谁以及其联系方式", 39 | "sender": "User", 40 | "sender_name": "User", 41 | "session_id": "", 42 | "should_store_message": True 43 | }, 44 | "ParseData-NEXx5": { 45 | "sep": "\n", 46 | "template": "{text}" 47 | }, 48 | "Prompt-6wckX": { 49 | "context": "", 50 | "template": "你是一个针对健康档案进行问答的机器人。\n你的任务是根据下述给定的已知信息回答用户问题。\n\n已知信息:\n{context}\n\n用户问:\n{query}\n\n如果已知信息不包含用户问题的答案,或者已知信息不足以回答用户的问题,请直接回复\"我无法回答您的问题\"。\n请不要输出已知信息中不包含的信息或答案。\n请不要输出已知信息中不包含的信息或答案。\n请不要输出已知信息中不包含的信息或答案。\n请用中文回答用户问题。", 51 | "query": "" 52 | }, 53 | "ChatOutput-xlwjc": { 54 | "data_template": "{text}", 55 | # "input_value": "", 56 | "sender": "Machine", 57 | "sender_name": "AI", 58 | "session_id": "", 59 | "should_store_message": True 60 | }, 61 | "OpenAIModel-vYDNH": { 62 | "api_key": "sk-XmrIEFplNArLlYa0E8C5A7C5F82041FdBd923e9d115746D0", 63 | # "input_value": "", 64 | "json_mode": False, 65 | "max_tokens": None, 66 | "model_kwargs": {}, 67 | "model_name": "gpt-4o-mini", 68 | "openai_api_base": "https://api.wlai.vip/v1", 69 | "output_schema": {}, 70 | "seed": 1, 71 | "stream": False, 72 | "system_message": "", 73 | "temperature": 0.1 74 | }, 75 | "Chroma-cRb29": { 76 | "allow_duplicates": False, 77 | "chroma_server_cors_allow_origins": "", 78 | "chroma_server_grpc_port": None, 79 | "chroma_server_host": "", 80 | "chroma_server_http_port": None, 81 | "chroma_server_ssl_enabled": False, 82 | "collection_name": "langflow02", 83 | "limit": None, 84 | "number_of_results": 10, 85 | "persist_directory": "ChromaDB02", 86 | "search_query": "", 87 | "search_type": "Similarity" 88 | }, 89 | "OpenAIEmbeddings-YEiqb": { 90 | "chunk_size": 1000, 91 | "client": "", 92 | "default_headers": {}, 93 | "default_query": {}, 94 | "deployment": "", 95 | "dimensions": None, 96 | "embedding_ctx_length": 1536, 97 | "max_retries": 3, 98 | "model": "text-embedding-3-small", 99 | "model_kwargs": {}, 100 | "openai_api_base": "https://api.wlai.vip/v1", 101 | "openai_api_key": "sk-XmrIEFplNArLlYa0E8C5A7C5F82041FdBd923e9d115746D0", 102 | "openai_api_type": "", 103 | "openai_api_version": "", 104 | "openai_organization": "", 105 | "openai_proxy": "", 106 | "request_timeout": None, 107 | "show_progress_bar": False, 108 | "skip_empty": False, 109 | "tiktoken_enable": True, 110 | "tiktoken_model_name": "" 111 | } 112 | } 113 | 114 | result = run_flow_from_json(flow=TASKFLOW, 115 | input_value=input_text, 116 | fallback_to_env_vars=True, # False by default 117 | tweaks=TWEAKS) 118 | 119 | 120 | # # 解析具体回复的内容 121 | logger.info(f"输出响应内容是: {result}\n") 122 | content = result[0].outputs[0].results['message'].text 123 | logger.info(f"输出响应内容是: {content}\n") -------------------------------------------------------------------------------- /ragTest/prompt_template.txt: -------------------------------------------------------------------------------- 1 | 你是一个针对健康档案进行问答的机器人。 2 | 你的任务是根据下述给定的已知信息回答用户问题。 3 | 4 | 已知信息: 5 | {context} 6 | 7 | 用户问: 8 | {query} 9 | 10 | 如果已知信息不包含用户问题的答案,或者已知信息不足以回答用户的问题,请直接回复"我无法回答您的问题"。 11 | 请不要输出已知信息中不包含的信息或答案。 12 | 请不要输出已知信息中不包含的信息或答案。 13 | 请不要输出已知信息中不包含的信息或答案。 14 | 请用中文回答用户问题。 15 | 16 | 17 | -------------------------------------------------------------------------------- /ragTest/健康档案.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NanGePlus/LangFlowTest/2cb9b152a6d31d47ac4f089541912d5da774d3fe/ragTest/健康档案.pdf -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | langflow==1.0.17 --------------------------------------------------------------------------------