From f938ed36f0a3041889095b6f1e1c80d9afa53e9e Mon Sep 17 00:00:00 2001 From: old-tom <892955278@msn.cn> Date: Mon, 17 Mar 2025 09:19:03 +0800 Subject: [PATCH] first commit --- .gitignore | 162 +++++++++++ Pipfile | 12 + llm_agent.py | 211 ++++++++++++++ llmtools/__init__.py | 7 + llmtools/basic_tool.py | 30 ++ main.py | 33 +++ vector_agent.py | 626 +++++++++++++++++++++++++++++++++++++++++ 7 files changed, 1081 insertions(+) create mode 100644 .gitignore create mode 100644 Pipfile create mode 100644 llm_agent.py create mode 100644 llmtools/__init__.py create mode 100644 llmtools/basic_tool.py create mode 100644 main.py create mode 100644 vector_agent.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..287a2f0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,162 @@ +### Python template +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..b86e2e5 --- /dev/null +++ b/Pipfile @@ -0,0 +1,12 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] + +[dev-packages] + +[requires] +python_version = "3.10" +python_full_version = "3.10.11" diff --git a/llm_agent.py b/llm_agent.py new file mode 100644 index 0000000..015be6a --- /dev/null +++ b/llm_agent.py @@ -0,0 +1,211 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# @Time : 2025/3/16 09:46 +# @Author : old-tom +# @File : llm_agent +# @Project : llmFunctionCallDemo +# @Desc : llm代理,负责初始化模型 + +from langchain_openai import ChatOpenAI +from langchain_core.prompts import ChatPromptTemplate +from langchain_core.output_parsers import StrOutputParser + +# 默认系统提示词 +DEFAULT_SYS_PROMPT = '' + +parser = StrOutputParser() + +# 模型初始化,注意替换成自己的模型和api_key +llm = ChatOpenAI( + model='deepseek-r1-250120', api_key='4eefc827-187f-4756-9637-7e0153c93d81', + base_url='https://ark.cn-beijing.volces.com/api/v3/', max_tokens=4096, temperature=0.5, streaming=True +) + +# 工具函数定义,deepseek 官方定义的格式(最多支持 128 个 function),参考 https://api-docs.deepseek.com/zh-cn/guides/function_calling +TOOLS = [ + { + "type": "function", + "function": { + "name": "get_current_weather", + "description": "Get weather of an location, the user shoud supply a location first", + "parameters": { + "type": "object", + "properties": { + "location": { + "type": "string", + "description": "The city and state, e.g. San Francisco, CA", + } + }, + "required": ["location"] + }, + } + }, + { + "type": "function", + "function": { + "name": "play_video", + "description": "播放、查看、打开实时视频", + "parameters": { + "type": "object", + "properties": { + "camera_name": { + "type": "string", + "description": "相机名称,例如:南卡口1号相机", + } + }, + "required": ["camera_name"] + }, + } + }, + { + "type": "function", + "function": { + "name": "split_screen", + "description": "切换分屏", + "parameters": { + "type": "object", + "properties": { + "split_n": { + "type": "int", + "description": "要切换的分屏数量,整数并且大于0,例如:1分屏、2分屏", + } + }, + "required": ["split_n"] + }, + } + }, + { + "type": "function", + "function": { + "name": "play_video_record", + "description": "播放、打开录像", + "parameters": { + "type": "object", + "properties": { + "camera_name": { + "type": "string", + "description": "相机名称,例如:南卡口1号相机", + }, + "start_time": { + "type": "string", + "description": "录像开始时间,格式为yyyy-MM-dd hh:mm:ss,例 2025-03-16 01:00:00", + }, + "end_time": { + "type": "string", + "description": "录像结束时间,格式为yyyy-MM-dd hh:mm:ss,例 2025-03-16 02:09:31", + } + }, + "required": ["camera_name", "start_time", "end_time"] + }, + } + }, + { + "type": "function", + "function": { + "name": "switch_page", + "description": "打开、跳转页面", + "parameters": { + "type": "object", + "properties": { + "page_name": { + "type": "string", + "description": "页面中文名称或者缩写,例:人员核查、系统日志、设备管理、首页", + } + }, + "required": ["page_name"] + }, + } + }, + { + "type": "function", + "function": { + "name": "zoom_in", + "description": "放大电子地图", + "parameters": { + "type": "object", + "properties": { + "level_n": { + "type": "int", + "description": "放大等级,整数并且大于0小于5,例如:放大1级、放大2级", + } + }, + "required": ["level_n"] + }, + } + }, + { + "type": "function", + "function": { + "name": "view_flight_details", + "description": "查询指定机场指定航班及时间的出入境人员明细", + "parameters": { + "type": "object", + "properties": { + "airport_name": { + "type": "string", + "description": "机场名称,简体中文,可以是缩写,例如:成都天府机场、天府机场、长水机场、上海浦东机场", + }, + "flight_code": { + "type": "string", + "description": "航班编号,由字母+数字组成的完整编号,若编号包含多余字符(如标点符号),需过滤后保留有效部分", + }, + "flight_date": { + "type": "string", + "description": "提取完整日期(年月日),自动补零至标准格式 yyyy-MM-dd, 例:2025-03-16", + }, + "ie_type": { + "type": "string", + "description": "出入境类型,仅识别'入境'或'出境'两种类型", + } + }, + "required": ["airport_name", "flight_code", "flight_date"] + }, + } + } +] + + +class DeepSeekR1Agent(object): + def __init__(self, system_prompt: str = DEFAULT_SYS_PROMPT): + """ + :param system_prompt: 系统提示词 + """ + self.prompt = ChatPromptTemplate( + [ + ("system", system_prompt), + ("human", "{user_input}") + ] + ) + + def invoke(self, user_input: str): + """ + 请求模型并一次性返回 + :param user_input: 用户输入 + :return: + """ + chain = self.prompt | llm + return chain.invoke({ + 'user_input': user_input + }).content + + def invoke_by_stream(self, user_input: str): + """ + 请求模型并流式返回(同步流) + :param user_input: 用户输入 + :return: + """ + chain = self.prompt | llm | parser + response = chain.stream({'user_input': user_input}) + for chunk in response: + print(chunk, flush=True, end='') + + @staticmethod + def invoke_with_tool(user_input: str): + """ + 工具链调用,function calling时system prompt不会生效 + :param user_input: + :return: 这里返回的是LLM推理出的tool信息,格式如下: + [{'name': 'get_current_weather', 'args': {'location': 'Beijing, China'}, 'id': 'call_xeeq4q52fw9x61lkrqwy9cr6', 'type': 'tool_call'}] + """ + llm_with_tools = llm.bind_tools(TOOLS) + return llm_with_tools.invoke(user_input).tool_calls diff --git a/llmtools/__init__.py b/llmtools/__init__.py new file mode 100644 index 0000000..dd8a46b --- /dev/null +++ b/llmtools/__init__.py @@ -0,0 +1,7 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# @Time : 2025/3/16 16:29 +# @Author : old-tom +# @File : __init__.py +# @Project : llmFunctionCallDemo +# @Desc : LLM function calling tools 定义 diff --git a/llmtools/basic_tool.py b/llmtools/basic_tool.py new file mode 100644 index 0000000..e0ceba7 --- /dev/null +++ b/llmtools/basic_tool.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# @Time : 2025/3/16 16:38 +# @Author : old-tom +# @File : basic_tool +# @Project : llmFunctionCallDemo +# @Desc : + +import json +from langchain_core.tools import tool + +@tool +def get_current_weather(location: str, unit: str = "celsius") -> str: + """Get the current weather in a given location + + Args: + location (str): location of the weather. + unit (str): unit of the tempuature. + + Returns: + str: weather in the given location. + """ + + weather_info = { + "location": location, + "temperature": "27", + "unit": unit, + "forecast": ["sunny", "windy"], + } + return json.dumps(weather_info) diff --git a/main.py b/main.py new file mode 100644 index 0000000..2de3621 --- /dev/null +++ b/main.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# @Time : 2025/3/16 09:46 +# @Author : old-tom +# @File : llm_agent +# @Project : llmFunctionCallDemo +# @Desc : llm代理,负责初始化模型 +# Press the green button in the gutter to run the script. +from llm_agent import DeepSeekR1Agent + +if __name__ == '__main__': + dsr = DeepSeekR1Agent() + # print(dsr.invoke_with_tool('今天北京天气怎么样')) + ########## 测试 模型function call ######### + # print(dsr.invoke_with_tool('播放北卡口1号道相机')) + ## [{'name': 'play_video', 'args': {'camera_name': '北卡口1号道相机'}, 'id': 'call_apnb8fiqdkaz313katcs3tjf', 'type': 'tool_call'}] + # print(dsr.invoke_with_tool('将大屏切换为2分屏')) + ## [{'name': 'split_screen', 'args': {'split_n': 2}, 'id': 'call_2o7c94f591xag8p6lcyice9q', 'type': 'tool_call'}] + # print(dsr.invoke_with_tool('播放北卡口入境1号道录像,从今天到2025-03-16 02:09:31')) + ## 由于大模型没有联网,所以无法判断‘今天’ + ## [{'name': 'play_video_record', 'args': {'camera_name': '北卡口入境1号道', 'start_time': '2023-10-25 00:00:00', 'end_time': '2025-03-16 02:09:31'}, 'id': 'call_6gllr9wofeaoomgiz13bgnk6', 'type': 'tool_call'}] + # print(dsr.invoke_with_tool('播放北卡口入境1号道录像,从25年3月1号到2号')) + ## [{'name': 'play_video_record', 'args': {'camera_name': '北卡口入境1号道', 'start_time': '2025-03-01 00:00:00', 'end_time': '2025-03-02 23:59:59'}, 'id': 'call_qj78jpep6k5wjwo90dkrz4qt', 'type': 'tool_call'}] + # print(dsr.invoke_with_tool('播放北卡口入境1号从25年3月1号到2号的录像')) + ## [{'name': 'play_video_record', 'args': {'camera_name': '北卡口入境1号相机', 'start_time': '2025-03-01 00:00:00', 'end_time': '2025-03-02 23:59:59'}, 'id': 'call_ixpyke880tdhopv27c6moci0', 'type': 'tool_call'}] + # print(dsr.invoke_with_tool('跳转到首页')) + ## [{'name': 'switch_page', 'args': {'page_name': '首页'}, 'id': 'call_3ev11bjkyrqyzxaman3402az', 'type': 'tool_call'}] + # print(dsr.invoke_with_tool('打开日志')) + ## [{'name': 'switch_page', 'args': {'page_name': '系统日志'}, 'id': 'call_acwy2yk7xz3bgpt28suujca2', 'type': 'tool_call'}] + # print(dsr.invoke_with_tool('放大地图到2级')) + ## [{'name': 'zoom_in', 'args': {'level_n': 2}, 'id': 'call_ip1kang0lbr63y8gya8nrpwc', 'type': 'tool_call'}] + # print(dsr.invoke_with_tool('查看成都天府k00航班2004年1月1日入境预报航班人员明细')) + ## [{'name': 'view_flight_details', 'args': {'airport_name': '成都天府机场', 'flight_code': 'K00', 'flight_date': '2004-01-01', 'ie_type': '入境'}, 'id': 'call_igummeorjq4r2pqjyr9tq6xq', 'type': 'tool_call'}] diff --git a/vector_agent.py b/vector_agent.py new file mode 100644 index 0000000..b5021c6 --- /dev/null +++ b/vector_agent.py @@ -0,0 +1,626 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# @Time : 2025/3/16 20:09 +# @Author : old-tom +# @File : vector_agent +# @Project : llmFunctionCallDemo +# @Desc : 向量数据库,解决相似度查询,例如 相机名称 +import marqo + +# 索引名称 +INDEX_NAME = 'test_index' +# 初始化marqo +mq = marqo.Client(url='http://localhost:8882') + + +# mq.delete_index(INDEX_NAME) + + +def create_and_set_index(): + """ + 全局只能调用一次 + :return: + """ + mq.create_index(INDEX_NAME, model="hf/e5-base-v2") + # 添加文档(测试用) + mq.index(INDEX_NAME).add_documents([ + { + "carme_name": "中方国门AI算法", + "ip": "192.168.10.80", + "location": "国门顶部" + }, + { + "carme_name": "中方国门AI算法0102", + "ip": "192.168.10.80", + "location": "国门顶部" + }, + { + "carme_name": "中方国门入境1", + "ip": "192.168.10.77", + "location": "国门通道" + }, + { + "carme_name": "中方国门入境2", + "ip": "192.168.10.79", + "location": "国门通道" + }, + { + "carme_name": "中方国门入境摄像头中", + "ip": "192.168.10.72", + "location": "登临检验" + }, + { + "carme_name": "中方国门入境摄像头右", + "ip": "192.168.10.74", + "location": "登临检验" + }, + { + "carme_name": "中方国门入境摄像头左", + "ip": "192.168.10.75", + "location": "登临检验" + }, + { + "carme_name": "中方国门出境1", + "ip": "192.168.10.76", + "location": "国门通道" + }, + { + "carme_name": "中方国门出境2", + "ip": "192.168.10.78", + "location": "国门通道" + }, + { + "carme_name": "中方国门出境摄像头右", + "ip": "192.168.10.71", + "location": "登临检验" + }, + { + "carme_name": "中方国门出境摄像头左", + "ip": "192.168.10.73", + "location": "登临检验" + }, + { + "carme_name": "中方国门-面向国门球机", + "ip": "192.168.10.215", + "location": "国门通道拐角" + }, + { + "carme_name": "中方国门高点1", + "ip": "192.168.10.70", + "location": "国门顶部" + }, + { + "carme_name": "北卡口AI摄像头全景", + "ip": "192.168.10.30", + "location": "北卡口对面" + }, + { + "carme_name": "北卡口AI摄像头细节", + "ip": "192.168.10.30", + "location": "北卡口对面" + }, + { + "carme_name": "北卡口入境摄像头入场4号通道", + "ip": "192.168.10.112", + "location": "入场通道" + }, + { + "carme_name": "北卡口入境摄像头入场5号通道", + "ip": "192.168.10.114", + "location": "入场通道" + }, + { + "carme_name": "北卡口入境摄像头入场6号通道", + "ip": "192.168.10.117", + "location": "入场通道" + }, + { + "carme_name": "北卡口入境摄像头出场1号通道", + "ip": "192.168.10.115", + "location": "出场通道" + }, + { + "carme_name": "北卡口入境摄像头出场2号通道", + "ip": "192.168.10.116", + "location": "出场通道" + }, + { + "carme_name": "北卡口入境摄像头出场3号通道", + "ip": "192.168.10.113", + "location": "出场通道" + }, + { + "carme_name": "北卡口出口道路监控", + "ip": "192.168.10.153", + "location": "路口" + }, + { + "carme_name": "能投大厦高点1", + "ip": "192.168.10.89", + "location": "能投楼顶" + }, + { + "carme_name": "南卡口AI算法2", + "ip": "192.168.10.210", + "location": "南卡口顶部" + }, + { + "carme_name": "南卡口AI算法20102", + "ip": "192.168.10.210", + "location": "南卡口顶部" + }, + { + "carme_name": "南卡口AI算法识别摄像机", + "ip": "192.168.10.91", + "location": "南卡口顶部" + }, + { + "carme_name": "南卡口AI算法识别摄像机0102", + "ip": "192.168.10.91", + "location": "南卡口顶部" + }, + { + "carme_name": "南卡口出境摄像头1号通道", + "ip": "192.168.10.100", + "location": "出境通道" + }, + { + "carme_name": "南卡口出境摄像头2号通道", + "ip": "192.168.10.103", + "location": "出境通道" + }, + { + "carme_name": "南卡口出境摄像头3号通道", + "ip": "192.168.10.104", + "location": "出境通道" + }, + { + "carme_name": "南卡口出境摄像头4号通道", + "ip": "192.168.10.102", + "location": "出境通道" + }, + { + "carme_name": "南卡口出境摄像头5号通道", + "ip": "192.168.10.99", + "location": "出境通道" + }, + { + "carme_name": "南卡口出境摄像头6号通道", + "ip": "192.168.10.101", + "location": "出境通道" + }, + { + "carme_name": "南卡口入境摄像头7号通道", + "ip": "192.168.10.98", + "location": "入境通道" + }, + { + "carme_name": "南卡口入境摄像头8号通道", + "ip": "192.168.10.93", + "location": "入境通道" + }, + { + "carme_name": "南卡口入境摄像头9号通道", + "ip": "192.168.10.97", + "location": "入境通道" + }, + { + "carme_name": "南卡口入境摄像头10号通道", + "ip": "192.168.10.96", + "location": "入境通道" + }, + { + "carme_name": "南卡口入境摄像头11号通道", + "ip": "192.168.10.94", + "location": "入境通道" + }, + { + "carme_name": "南卡口入境摄像头12号通道", + "ip": "192.168.10.95", + "location": "入境通道" + }, + { + "carme_name": "南卡口高点-1", + "ip": "192.168.10.90", + "location": "南卡口顶部" + }, + { + "carme_name": "南卡口高点-2", + "ip": "192.168.10.92", + "location": "南卡口顶部" + }, + { + "carme_name": "南卡口高点-3", + "ip": "192.168.3.12", + "location": "南卡口顶部" + }, + { + "carme_name": "1.3公里封闭道路入境出场1", + "ip": "192.168.10.82", + "location": "南卡口顶部" + }, + { + "carme_name": "1.3公里封闭道路入境出场2", + "ip": "192.168.10.88", + "location": "南卡口顶部" + }, + { + "carme_name": "1.3公里封闭道路入境出场20102", + "ip": "192.168.10.88", + "location": "南卡口顶部" + }, + { + "carme_name": "1.3公里封闭道路入境摄像头入场2", + "ip": "192.168.10.87", + "location": "南卡口顶部" + }, + { + "carme_name": "1.3公里封闭道路入境摄像头入场20102", + "ip": "192.168.10.87", + "location": "南卡口顶部" + }, + { + "carme_name": "1.3公里封闭道路入境入场1", + "ip": "192.168.10.81", + "location": "南卡口顶部" + }, + { + "carme_name": "H9861号口摄像头入场", + "ip": "192.168.10.107", + "location": "H986停车场出入口" + }, + { + "carme_name": "H9862号口摄像头出场", + "ip": "192.168.10.109", + "location": "H987停车场出入口" + }, + { + "carme_name": "H9862号口摄像头入场", + "ip": "192.168.10.190", + "location": "H988停车场出入口" + }, + { + "carme_name": "车辆定位AI摄像头", + "ip": "192.168.10.29", + "location": "H988停车场山上" + }, + { + "carme_name": "车辆定位AI摄像头0102", + "ip": "192.168.10.29", + "location": "H989停车场山上" + }, + { + "carme_name": "北山货场森林公园制高点", + "ip": "192.168.10.191", + "location": "H990停车场山上" + }, + { + "carme_name": "边民互市入境摄像头出场", + "ip": "192.168.10.119", + "location": "边民互市" + }, + { + "carme_name": "边民互市入境摄像头入场", + "ip": "192.168.10.118", + "location": "出入口" + }, + { + "carme_name": "车辆缓冲区1号门入口", + "ip": "192.168.10.193", + "location": "出入口" + }, + { + "carme_name": "车辆缓冲区2号门入口", + "ip": "192.168.10.195", + "location": "出入口" + }, + { + "carme_name": "车辆缓冲区2号门出口", + "ip": "192.168.10.194", + "location": "出入口" + }, + { + "carme_name": "车辆缓冲区1号门出口", + "ip": "192.168.10.192", + "location": "出入口" + }, + { + "carme_name": "大贸查验场进口入境摄像头入场东口", + "ip": "192.168.10.181", + "location": "出入口" + }, + { + "carme_name": "大贸查验场进口入境摄像头出场东口", + "ip": "192.168.10.180", + "location": "出入口" + }, + { + "carme_name": "大贸查验场(进口)入境摄像头入场(西口)", + "ip": "192.168.10.106", + "location": "出入口" + }, + { + "carme_name": "大贸查验场(进口)高点1", + "ip": "192.168.10.156", + "location": "高点" + }, + { + "carme_name": "大贸查验场出口出境摄像头出场2", + "ip": "192.168.10.110", + "location": "出入口" + }, + { + "carme_name": "大贸查验场出口出境摄像头入场左", + "ip": "192.168.10.184", + "location": "出入口" + }, + { + "carme_name": "大贸查验场出口出境摄像头出场1", + "ip": "192.168.10.111", + "location": "出入口" + }, + { + "carme_name": "北山高速收费站入境摄像头入场出方向", + "ip": "192.168.10.170", + "location": "道路" + }, + { + "carme_name": "北山高速收费站入境摄像头入场入方向", + "ip": "192.168.10.169", + "location": "道路" + }, + { + "carme_name": "坝洒高点", + "ip": "192.168.10.164", + "location": "" + }, + { + "carme_name": "停车场卡口(坝洒)入境摄像头入场", + "ip": "192.168.10.165", + "location": "出入口" + }, + { + "carme_name": "停车场卡口(坝洒)入境摄像头出场", + "ip": "192.168.10.166", + "location": "出入口" + }, + { + "carme_name": "东西干道卡口入境摄像头入场", + "ip": "192.168.10.136", + "location": "出入口" + }, + { + "carme_name": "东西干道卡口入境摄像头出场", + "ip": "192.168.10.135", + "location": "出入口" + }, + { + "carme_name": "主卡口(临时)货场大门-高点", + "ip": "192.168.10.146", + "location": "" + }, + { + "carme_name": "利丰酒店往边民互市高点", + "ip": "192.168.10.211", + "location": "利丰酒店楼顶" + }, + { + "carme_name": "利丰货场近御峰货场入境摄像头出场2", + "ip": "192.168.10.132", + "location": "出入口" + }, + { + "carme_name": "利丰酒店往边民互市高点2", + "ip": "192.168.10.212", + "location": "利丰酒店楼顶" + }, + { + "carme_name": "利丰货场近御峰货场入境摄像头入场2", + "ip": "192.168.10.139", + "location": "出入口" + }, + { + "carme_name": "利丰货场入境摄像头出场左", + "ip": "192.168.10.127", + "location": "出入口" + }, + { + "carme_name": "利丰货场入境摄像头入场左", + "ip": "192.168.10.128", + "location": "出入口" + }, + { + "carme_name": "利丰货场入境摄像头出场右", + "ip": "192.168.10.126", + "location": "出入口" + }, + { + "carme_name": "利丰货场-高点", + "ip": "192.168.10.125", + "location": "" + }, + { + "carme_name": "利丰货场近御峰货场入境摄像头出场1", + "ip": "192.168.10.131", + "location": "出入口" + }, + { + "carme_name": "利丰货场入境摄像头入场右", + "ip": "192.168.10.129", + "location": "出入口" + }, + { + "carme_name": "利丰货场近御峰货场入境摄像头入场1", + "ip": "192.168.10.130", + "location": "出入口" + }, + { + "carme_name": "南屏高速收费站入境摄像头出场", + "ip": "192.168.10.168", + "location": "道路" + }, + { + "carme_name": "南屏高速收费站入境摄像头入场", + "ip": "192.168.10.167", + "location": "道路" + }, + { + "carme_name": "停车场卡口老表入境摄像头入场", + "ip": "192.168.10.160", + "location": "出入口" + }, + { + "carme_name": "停车场卡口老表右入境摄像头入场", + "ip": "192.168.10.162", + "location": "出入口" + }, + { + "carme_name": "停车场卡口老表入境摄像头出场", + "ip": "192.168.10.161", + "location": "出入口" + }, + { + "carme_name": "停车场卡口老表右入境摄像头出场", + "ip": "192.168.10.163", + "location": "出入口" + }, + { + "carme_name": "槟榔寨站入境摄像头入场", + "ip": "192.168.10.173", + "location": "道路" + }, + { + "carme_name": "槟榔寨站入境摄像头出场", + "ip": "192.168.10.174", + "location": "道路" + }, + { + "carme_name": "外围冷链停车区入境摄像头出场", + "ip": "192.168.10.158", + "location": "出入口" + }, + { + "carme_name": "外围冷链停车区入境摄像头入场", + "ip": "192.168.10.157", + "location": "出入口" + }, + { + "carme_name": "清水河隧道出", + "ip": "192.168.10.175", + "location": "道路" + }, + { + "carme_name": "清水河隧道入", + "ip": "192.168.10.186", + "location": "道路" + }, + { + "carme_name": "商阜路闭环区道路监控-高点", + "ip": "192.168.10.154", + "location": "道路" + }, + { + "carme_name": "商阜路闭环区道路监控道路监控高点2", + "ip": "192.168.10.155", + "location": "道路" + }, + { + "carme_name": "商阜路闭环区道路监控道路监控-后", + "ip": "192.168.10.152", + "location": "道路" + }, + { + "carme_name": "越南城十字路口-东西干道入境摄像头出场", + "ip": "192.168.10.172", + "location": "道路" + }, + { + "carme_name": "越南城十字路口-东西干道入境摄像头入场", + "ip": "192.168.10.171", + "location": "道路" + }, + { + "carme_name": "停车场卡口能投入境摄像头出场", + "ip": "192.168.10.124", + "location": "出入口" + }, + { + "carme_name": "停车场卡口能投入境摄像头入场2", + "ip": "192.168.10.123", + "location": "出入口" + }, + { + "carme_name": "停车场卡口能投入境摄像头入场1", + "ip": "192.168.10.122", + "location": "出入口" + }, + { + "carme_name": "御峰货场冷链入境摄像头出场出口", + "ip": "192.168.10.145", + "location": "出入口" + }, + { + "carme_name": "御峰货场(冷链)-高点", + "ip": "192.168.10.137", + "location": "" + }, + { + "carme_name": "御峰货场冷链入境摄像头入场进口", + "ip": "192.168.10.133", + "location": "出入口" + }, + { + "carme_name": "御峰货场冷链入境摄像头入场出口", + "ip": "192.168.10.138", + "location": "出入口" + }, + { + "carme_name": "御峰货场冷链入境摄像头出场进口", + "ip": "192.168.10.141", + "location": "出入口" + }, + { + "carme_name": "御峰货场干货入境摄像头入场", + "ip": "192.168.10.140", + "location": "出入口" + }, + { + "carme_name": "御峰货场干货入境摄像头入场2", + "ip": "192.168.10.148", + "location": "出入口" + }, + { + "carme_name": "御峰货场干货入境摄像头出场", + "ip": "192.168.10.144", + "location": "出入口" + }, + { + "carme_name": "御峰货场(干货)-高点1", + "ip": "192.168.10.142", + "location": "" + }, + { + "carme_name": "御峰货场(干货)-高点2", + "ip": "192.168.10.143", + "location": "" + }, + { + "carme_name": "御峰货场干货入境摄像头出场2", + "ip": "192.168.10.147", + "location": "出入口" + }], + tensor_fields=["carme_name"] + ) + + +def query_vector_db(query): + return mq.index(INDEX_NAME).search(q=query) + + +if __name__ == '__main__': + # create_and_set_index() + rt = query_vector_db('H9861号口摄像头') + # TODO 根据 _score字段 取出相似度最高的结果 + if rt: + for ele in rt['hits']: + print(ele)