大模型ReAct智能体开发实战

哆啦A梦是很多人都熟悉的角色,包括我自己。 在成长过程中,我常常对他口袋里的许多小玩意感到惊讶,而且他知道何时使用它们。 随着大型语言模型 (LLM) 的发展趋势,你也可以构建一个具有相同行为方式的模型!

我们将构建一个智能代理,其含义在这里得到了很好的定义。 我们将重点关注一种名为 ReAct 的常见代理类型,它使用 LLM 作为其主要引擎来分解任务、推理并适当地使用特定的工具集。 你可以在本文中阅读有关 ReAct 框架的更多信息。

在上一篇文章中,我提到过构建一个涉及食品评论的简单检索增强生成(RAG)工具。 现在,是时候更进一步,构建一个食品评论代理,它不仅能够检索相关的食品评论数据,还可以在必要时处理地理位置过滤。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包

0、实施计划

在定义要作为工具合并的功能和方法之前,我们将首先定义将用作我们代理的核心引擎的LLM。 此后,我们将它们添加到我们将初始化的代理中。 在此过程中将进行一些定制,以使结果更好。 该代理中包含的工具有:

  • 数据库检索器
  • 地理定位检索器
  • 具有地理位置过滤功能的数据库检索器

这篇精彩文章中的一些技术,例如元数据过滤和提示工程,将一路应用来改进检索过程的结果。 让我们开始!

1、定义我们的LLM

为了让事情变得简单、无忧,我们将使用 OpenAI GPT-3.5 Turbo 模型。 我将通过 Azure OpenAI 来利用它。 你还可以直接使用 OpenAI 甚至开源 LLM 的 API 服务。

import os
from langchain.chat_models import AzureChatOpenAI

# define env variables for AzureOpenAI model
os.environ["OPENAI_API_TYPE"] = "azure"
os.environ["OPENAI_API_BASE"] = "YOUR_ENDPOINT_HERE"
os.environ["OPENAI_API_KEY"] = "YOUR_API_KEY_HERE"
os.environ["OPENAI_API_VERSION"] = "2023-03-15-preview"

# Instatiate LLM
llm = AzureChatOpenAI(
    deployment_name='YOUR_DEPLOYMENT_NAME_HERE',
    temperature=0
)

2、创建工具

我们将首先创建一个包含食品评论及其嵌入的矢量存储。 嵌入对于代理检索搜索查询的相关结果非常重要。 由于 Deeplake 向量存储易于实现,因此将用于本实验。

使用与我上一篇文章中使用的类似的 CSV 数据源,我们可以创建矢量存储。 所需的一项定制是将美食场所位置的坐标添加到文档的元数据中。 这对于稍后使用地理位置过滤的工具很有用。

import pandas as pd
from langchain.vectorstores import DeepLake
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.document_loaders.csv_loader import CSVLoader

实例化 OpenAIEmbeddings 以用于从文档上下文创建嵌入:

# instantiate OpenAIEmbeddings to use to create embeddings from document context
embeddings = OpenAIEmbeddings(deployment="EMBEDDING_DEPLOYMENT_NAME", chunk_size=16)

实例化 CSV 加载器并加载食品评论,并将评论链接作为源:

# instantiate CSV loader and load food reviews with review link as source
loader = CSVLoader(file_path='final_data.csv', csv_args={
        "delimiter": ",",
}, encoding='utf-8', source_column='review_link')
data = loader.load()

使用纬度和经度值扩充数据的元数据,这是我们稍后的工具之一所需要的:

# augment data's metadata with lat and long values; this is needed for one of our tools later on
df = pd.read_csv("final_data.csv", index_col=False)

df_lat = df.lat.values.tolist()
df_long = df.long.values.tolist()

for lat, long, item in zip(df_lat, df_long, data):
    item.metadata["lat"] = lat
    item.metadata["long"] = long

创建deeplake数据库:

# create deeplake db
db = DeepLake(
    dataset_path="./my_deeplake/", embedding=embeddings, overwrite=True
)
db.add_documents(data)

2.1 数据库检索器

我们现在将创建我们的第一个工具:食品评论数据库检索器。 我将定义一个自定义检索器,以便过滤掉低于特定相似性阈值的文档,而不是简单地使用向量存储对象的 as_retriever() 方法。 Langchain 库中有一个 similarity_score_threshold 方法可用,但我已经尝试过,在撰写本文时它似乎有错误。

# defining a normal retriever
def search(query):
    search_results = db.similarity_search_with_score(k = 5,
                                            query = query,
                                            distance_metric = 'cos'
                                        )
    
    filtered_res = list(filter(lambda x: x[1] >= 0.8, search_results))
    filtered_res = [t[0] for t in filtered_res]

    return filtered_res

如果用户想根据文本查询检索相关的食品评论,这个简单的搜索功能现在可以充当我们的工具。

2.2 地理定位检索器

我们现在将继续创建我们的地理位置检索工具。 它需要接受一个地点的名称并返回其纬度和经度坐标。 由于 Foursquare API 是免费的 API 服务,我将使用它来搜索并返回坐标。 你可以通过上面的链接轻松免费获取 API 密钥。

import requests

API 调用的标头,其中包括 FQ API 密钥:

# headers for API call which includes FQ API key
headers = {
    "Accept": "application/json",
    "Authorization": "YOUR_API_KEY"
}

根据 foursquares 平台上最相关的搜索检索坐标的函数:

# function to retrieve coordinates based on most relevant search on foursquares platform
def get_coordinates(address):
    url = f'https://api.foursquare.com/v3/places/search?query={address.lower().strip().replace(" ", "%20")}&near=singapore'

    req = requests.request("GET", url, headers=headers)
    results_dict = eval(req.text)

    result_name = results_dict['results'][0]['name']
    result_geo = results_dict['results'][0]['geocodes']['main']
    
    return (result_geo['latitude'], result_geo['longitude']), result_name

2.3 具有地理位置过滤功能的数据库检索器

最后,我们可以创建具有地理位置过滤功能的数据库检索器。 用户有时希望根据某个位置找到相关的美食地点。 这意味着需要对数据库进行地理位置过滤。 根据该位置的坐标与数据库中所有地点的坐标之间的半正矢距离的计算,我们可以创建一个过滤器来删除那些超出设定距离的坐标。

from haversine import haversine as hs
import deeplake

创建一个过滤函数供deeplake使用。具有多个参数的过滤函数需要 deeplake.compute 装饰器:

# create a filter function for deeplake to use
# deeplake.compute decorator is needed for filter function with multiple arguments
@deeplake.compute
def filter_fn(x, coor):
    venue_lat = float(x['metadata'].data()['value']['lat'])
    venue_long = float(x['metadata'].data()['value']['long'])

    dist = hs(coor, (venue_lat, venue_long))
    return dist <= 0.8 # listings that are >800m away from target location is filtered out

创建一个函数来使用 deeplake.search 进行过滤的相似性搜索:

# create a function to do similarity search with filtering using deeplake.search
def search_with_filter(prompt_coor_string):

    # seperate search query and coordinates string input and create coordinate float tuple
    params_ls = prompt_coor_string.split(" | ")
    prompt = params_ls[0].replace('"', '')
    coor_ls = params_ls[1].split(", ")
    coor = (float(coor_ls[0]), float(coor_ls[1]))
    
    search_results = db.similarity_search_with_score(k = 5,
                                                query = prompt,
                                                filter = filter_fn(coor),
                                                distance_metric = 'cos'
                                            )
    
    # only keep reviews that have a similarity score of 0.8 and above
    filtered_res = list(filter(lambda x: x[1] >= 0.8, search_results))
    filtered_res = [t[0] for t in filtered_res]
    
    return filtered_res

根据下面的示例,你可以看到仅返回了Tanjong Pagar地铁站附近的相关 omakase 餐厅。

# an example on how the function will be used
# coordinates for Tanjong Pagar MRT Station is used
search_with_filter('"omakase courses" | 1.276525, 103.845725')
[Document(page_content="place_title: Kei Hachi\nplace_url: https://www.burpple.com/kei-hachi?bp_ref=%2Ff%2FWr8X_PCG\nfood_desc_title: Best Meal I've Had So Far\nfood_desc_body: Just some random photos of dishes served during their Kei Hachi Lunch Omakase ($128) because its too hard to choose specific favourites from their beautiful course meal. All of their food in the course are right on point and so darn delicious. Each food item is presented like a form of art and paired with the beautiful ambience, this is one hell of a treat. You get a huge variety of different food preparation styles and definitely a filling meal by the end of the course. Loved the hospitality of the chefs and the servers. Highly recommended if you love Japanese food and would like a good treat! Indeed the best meal I have ever had so far 😍😍\nreview_link: https://www.burpple.com/f/R6qr9qKk\npos_prob: 0.9908563\nnum_stars: 5\nvenue_price: ~$130/pax\nvenue_tag: Date Night\nFine Dining\nJapanese\nvenue_loc: https://www.google.com/maps/search/?api=1&query=1.279512,103.8415799\nlat: 1.279512\nlong: 103.8415799\nnearest_stations: Maxwell, Outram Park, Chinatown, Tanjong Pagar", metadata={'source': 'https://www.burpple.com/f/R6qr9qKk', 'row': 401, 'lat': 1.279512, 'long': 103.8415799}),
 Document(page_content="place_title: KYUU By Shunsui\nplace_url: https://www.burpple.com/kyuu-by-shunsui?bp_ref=%2Ff%2F9TUCRyhw\nfood_desc_title: Do come here if you love your ikura!\nfood_desc_body: Have heard about their unique omakase where you get enormous quantities of ikura and we were pretty impressed!\nThe standard omakase ($128) comprises of 9 courses and there is indeed a huge variety. From sashimi to tempera to grilled dishes, they have them all. These are just some of the dishes we had during the course and I must say I was very surprised by the beauty of the plating of their dishes!\nAs for the food quality, all dishes were of decent quality definitely. The sashimi pieces were decently fresh and the Wagyu Beef was pretty tender but not melt in the mouth though. Though I must admit I was not expecting much when I was served corn, but that is probably the sweetest, juiciest and most delicious corn I've had.\nIf you love your ikura, this is definitely a place to check out. To make it less painful on your wallet, you can get some discounts via @chopesg vouchers! Definitely a place to bring your loved ones for a celebration!\nreview_link: https://www.burpple.com/f/bAd77B8k\npos_prob: 0.8500501\nnum_stars: 4\nvenue_price: ~$130/pax\nvenue_tag: Late Night\nJapanese\nDinner With Drinks\nvenue_loc: https://www.google.com/maps/search/?api=1&query=1.2799799,103.841516\nlat: 1.2799799\nlong: 103.841516\nnearest_stations: Maxwell, Outram Park, Chinatown, Tanjong Pagar", metadata={'source': 'https://www.burpple.com/f/bAd77B8k', 'row': 207, 'lat': 1.2799799, 'long': 103.841516}),
 Document(page_content="place_title: Teppei Japanese Restaurant (Orchid Hotel)\nplace_url: https://www.burpple.com/teppei-japanese-restaurant?bp_ref=%2Ff%2FSjq7Uauy\nfood_desc_title: Very Good Omakase, Worth The Price\nfood_desc_body: One will find a gastronomical experience here definitely, as you will experience so many different flavour profiles from their dinner omakase ($100). We realised that we really cannot pick a favourite among the dishes served as most were so darn good. All seafood ingredients served are really fresh, and you really don't need the soya sauce because they are all so flavourful! There is a total of about 15-17 courses, and although most were small bites, they were more than enough to make us full. In fact many in the restaurant were saying that they were already filled towards the end of the course! Really felt like it's worth the price 😊\nreview_link: https://www.burpple.com/f/PWJbmM5Z\npos_prob: 0.95687157\nnum_stars: 5\nvenue_price: ~$100/pax\nvenue_tag: Sushi\nChirashi\nSeafood\nDate Night\nJapanese\nvenue_loc: https://www.google.com/maps/search/?api=1&query=1.276993,103.843891\nlat: 1.276993\nlong: 103.843891\nnearest_stations: Tanjong Pagar, Maxwell, Shenton Way, Outram Park, Chinatown", metadata={'source': 'https://www.burpple.com/f/PWJbmM5Z', 'row': 413, 'lat': 1.276993, 'long': 103.843891})]

3、创建代理

现在我们已经定义了用作代理中工具的函数和方法,我们可以将它们放在一起。 为了初始化代理可以使用的工具集,需要进一步为每个工具定义名称和描述。 两者对于 ReAct 代理都极其重要,因为 LLM 严重依赖它们来了解每个工具的用途以及何时使用。 正确地构建它是一个迭代过程,需要使用不同的测试用例来改进它们。

请注意,我为需要超过 1 个参数的函数定义了输入格式。 如果我定义 STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION 代理类型,则没有必要这样做,因为它允许多个输入,但在撰写本文时似乎存在错误。 如果它适合你,请随意尝试!

# initialise the 3 tools to be added to the agent.
# Note: that the name and description of the tool are very important for a reAct agent type, as it relies on them heavily to decide on when to use the tools
tools = [
    Tool(
        name="Database Search",
        func=search,
        description="Useful for querying food review data. Input should be the user text query to find relevant food review articles."
    ),
    Tool(
        name="Database Search with Distance Filter",
        func=search_with_filter,
        description="Useful for searching food places near specific locations. This function is to be used after Geolocation Search. The input string should be a text search query and a set of latitude and longitude coordinates seperated by |."  
    ),
    Tool(
        name="Geolocation Search",
        func=get_coordinates,
        description="Useful to retrieve latitude and longitude coordinates and name of place from a defined location. This is used before Database Search with Distance Filter. Input should be the place location given by the user. Output should be a tuple containing latitude and longitude coordinates and name of place."
    )
]

我意识到默认代理存在某些问题,它有时可能会使用自己的知识来回答一些问题,并且需要将输出格式标准化为我上一篇文章中讨论的格式。 这些提示可以通过编辑代理的提示模板来解决。 你可以通过编辑其提示符前缀来完成此操作。

# Define prefix of LLM agent
# Note: this is where you can prompt engineer the template for the agent, so that the agent understands clearly on what tasks it aims to do and how it should format its answers.
PREFIX = """
Answer the following questions as best you can. You have access to the following tools below that can help to find food reviews. Only answer questions that are related to the use of the tools given.
If the question is unrelated, reject the question. If answer is not found, just say that you do not have any relevant results. Return the final answer if you think you are ready. In your final answer, you MUST list the reviews in the following format:

Here are my recommendations:
🏠 [Name of place]
<i>[venue tags]</i>
✨ Avg Rating: [Rating of venue]
💸 Price: [Estimated price of dining at venue] (this is optional. If not found or not clear, use a dash instead.)
📍 <a href=[Location of venue] ></a>
📝 Reviews:
[list of review_link, seperated by linespace] (Use this format: 1. <a href=[review_link] >[food_desc_title text]</a>)

If you cannot find any reviews to respond to the user, just say that you don't know.
"""

现在剩下要做的就是使用正确的参数初始化代理并对其进行测试:

# Construct the agent
# Note: sometimes the agent will hallucinate and not format its answer properly. Setting handle_parsing_error to True will allow the agent to check its own formatting.
agent = initialize_agent(
    tools,
    llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True,
    handle_parsing_errors=True,
    agent_kwargs={
        'prefix': PREFIX
    }
)
示例:你知道Tanjong Pagar地铁站附近有哪些提供 omakase 课程的餐厅吗?

使用上面的具体示例详细运行代理,你可以看到 LLM 尝试找出所提供的任务所需的步骤,并尝试识别每个步骤所需的工具。

在得出最终答案之前LLM的思考过程。

输出正如预期的那样,丹戎巴葛地铁站附近的餐厅提供我以前去过的 omakase 课程。 输出格式在我在前缀模板中指定的 HTML 格式中也是正确的。

Here are my recommendations:
🏠 Kei Hachi
<i>Date Night, Fine Dining, Japanese</i>
✨ Avg Rating: 5
💸 Price: ~$130/pax
📍 <a href=https://www.google.com/maps/search/?api=1&query=1.279512,103.8415799 ></a>
📝 Reviews:
1. <a href=https://www.burpple.com/f/R6qr9qKk >Best Meal I've Had So Far</a>

🏠 KYUU By Shunsui
<i>Late Night, Japanese, Dinner With Drinks</i>
✨ Avg Rating: 4
💸 Price: ~$130/pax
📍 <a href=https://www.google.com/maps/search/?api=1&query=1.2799799,103.841516 ></a>
📝 Reviews:
1. <a href=https://www.burpple.com/f/bAd77B8k >Do come here if you love your ikura!</a>

🏠 Teppei Japanese Restaurant (Orchid Hotel)
<i>Sushi, Chirashi, Seafood, Date Night, Japanese</i>
✨ Avg Rating: 5
💸 Price: ~$100/pax
📍 <a href=https://www.google.com/maps/search/?api=1&query=1.276993,103.843891 ></a>
📝 Reviews:
1. <a href=https://www.burpple.com/f/PWJbmM5Z >Very Good Omakase, Worth The Price</a>

4、结束语

从上面的演练中,你可以看到LLM如何分解任务并适当地使用其武器库中的工具,就像《哆啦A梦》在动画系列中所做的那样。 我相信代理可以在很多方面提供帮助,例如将多工具和多模式平台压缩为对话机器人,用户可以简单地上传数据,代理可以根据数据类型和数据来决定使用哪些工具。 它对用户提供的任务的理解。

ReAct 类型的代理只是我们可以创建和探索的多种代理类型之一。 我见过能够在游戏中学习并茁壮成长的代理,以及具有不同角色的多个代理在模拟公司中一起工作。 有很多东西值得探索,我希望我能启发你。 快乐编码!


原文链接:ReAct智能体开发实战 - BimAnt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/368800.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高中数学立体几何练习题3

用到的基础知识&#xff1a; 1. 2.

MATLAB计算多边形质心/矩心

前言&#xff1a;不规则四边形的中心 不规则四边形的出心有多种定义&#xff0c;以下是最常见的三种&#xff1a; 1.重心&#xff1a;重心是四边形内部所有顶点连线交点的平均位置。可以通过求解四个顶点坐标的平均值来找到重心。 2.质心&#xff1a;质心是四边形内部所有质点…

Python机器学习库(numpy库)

文章目录 Python机器学习库&#xff08;numpy库&#xff09;1. 数据的维度2. numpy基础知识2.1 numpy概述2.1 numpy概述2.1 numpy概述2.2 numpy库的引用 3. ndarray数组的创建3.1 N维数组对象ndarray3.2 创建ndarray数组3.2.1 使用Python列表、元组创建ndarray数组3.2.2 使用nu…

029 命令行传递参数

1.循环输出args字符串数组 public class D001 {public static void main(String[] args) {for (String arg : args) {System.out.println(arg);}} } 2.找打这个类的路径&#xff0c;打开cmd cmd C:\Users\Admin\IdeaProjects\JavaSE学习之路\scanner\src\com\yxm\demo 3. 编译…

Servlet+Ajax实现对数据的列表展示(极简入门)

目录 1.准备工作 1.数据库源&#xff08;这里以Mysql为例&#xff09; 2.映射实体类 3.模拟三层架构&#xff08;Dao、Service、Controller&#xff09; Dao接口 Dao实现 Service实现&#xff08;这里省略Service接口&#xff09; Controller层&#xff08;或叫Servlet层…

2024济南生物发酵展:会议日程安排和技术装备亮点预告

2024济南发酵展/2024生物发酵展/2024山东发酵展/2024济南生物制药展/2024生物技术展/2024食品设备展/2024食品加工展/2024济南细胞工程展 由中国生物发酵产业协会主办&#xff0c;上海信世展览服务有限公司承办的2024第12届国际生物发酵产品与技术装备展览会&#xff08;济南&a…

深入理解Istio服务网格数据平面Envoy

一、服务网格概述(service mesh) 在传统的微服务架构中&#xff0c;服务间的调用&#xff0c;业务代码需要考虑认证、熔断、服务发现等非业务能力&#xff0c;在某种程度上&#xff0c;表现出了一定的耦合性 服务网格追求高级别的服务流量治理能力&#xff0c;认证、熔断、服…

2023.12 淘天-数科 已offer

文章目录 岗位信息1面ld 12.17 1H2面 VP 12.18 40min3面 HR 12.2012.21offer薪资方案沟通 岗位信息 1面ld 12.17 1H &#xff08;是一个从业估计很长时间前辈&#xff0c;很平和&#xff0c;感觉能学到很多东西&#xff09; 自我介绍项目深究1.说下自己工作里最有成就感的事和…

图论练习3

内容&#xff1a;过程中视条件改变边权&#xff0c;利用树状数组区间加处理 卯酉东海道 题目链接 题目大意 个点&#xff0c;条有向边&#xff0c;每条边有颜色和费用总共有种颜色若当前颜色与要走的边颜色相同&#xff0c;则花费为若当前颜色与要走的边颜色不同&#xff0c;…

MYSQL——MySQL8.3无法启动

在新电脑上装了个MySQL&#xff0c;但是无法使用net start mysql启动&#xff0c;很是纳闷&#xff0c;使用mysqld --console去查看报错&#xff0c;也是没报错的&#xff0c;但是奇怪的是&#xff0c;我输入完这个mysqld --console之后&#xff0c;就等于启动了mysql了&#x…

第十一篇【传奇开心果系列】Python的OpenCV技术点案例示例:三维重建

传奇开心果短博文系列 系列短博文目录Python的OpenCV技术点案例示例系列短博文目录一、前言二、OpenCV三维重建介绍三、基于区域的SGBM示例代码四、BM(Block Matching)算法介绍和示例代码五、基于能量最小化的GC(Graph Cut)算法介绍和示例代码六、相机标定介绍和示例代码七…

【数据结构与算法】之排序系列-20240203

这里写目录标题 一、628. 三个数的最大乘积二、645. 错误的集合三、747. 至少是其他数字两倍的最大数四、905. 按奇偶排序数组五、922. 按奇偶排序数组 II六、976. 三角形的最大周长 一、628. 三个数的最大乘积 简单 给你一个整型数组 nums &#xff0c;在数组中找出由三个数组…

Leetcode刷题笔记题解(C++):36. 有效的数独

思路一&#xff1a;暴力破解&#xff0c;两个二维数组记录行、列对应的数字出现的次数&#xff0c;比如rows[i][index]表示的数字index在i行出现的次数&#xff0c;三维数组记录每个块中对应数字出现的次数&#xff0c;比如boxes[i/3][j/3][index]表示的数字index在[i/3][j/3]个…

Hugging Face推出自定义AI聊天Assistants;谷歌推出图像生成工具 ImageFX

&#x1f989; AI新闻 &#x1f680; 谷歌推出图像生成工具 ImageFX 摘要&#xff1a;谷歌在 Imagen 2 的基础上推出新的图像生成工具 ImageFX&#xff0c;通过简单的文字提示可以生成高质量图像。该工具包含了提示界面&#xff0c;让用户可以快速尝试创作和想法的相邻维度。…

数据结构—基础知识:哈夫曼树

文章目录 数据结构—基础知识&#xff1a;哈夫曼树哈夫曼树的基本概念哈夫曼树的构造算法哈夫曼树的构造过程哈夫曼算法的实现算法&#xff1a;构造哈夫曼树 数据结构—基础知识&#xff1a;哈夫曼树 哈夫曼树的基本概念 哈夫曼&#xff08;Huffman&#xff09;树又称最优树&…

通过 ChatGPT 的 Function Call 查询数据库

用 Function Calling 的方式实现手机流量包智能客服的例子。 def get_sql_completion(messages, model"gpt-3.5-turbo"):response client.chat.completions.create(modelmodel,messagesmessages,temperature0,tools[{ # 摘自 OpenAI 官方示例 https://github.com/…

ASP.NET Core 自定义解压缩提供程序

写在前面 在了解ASP.NET Core 自定义请求解压缩中间件的应用时&#xff0c;依据官方文档操作下来碰到了几个问题&#xff0c;这边做个记录。 关键点就是配置 Content-Encoding&#xff0c;参数需要和代码中添加的提供程序的Key保持一致&#xff1b; builder.Services.AddRequ…

问题:媒体查询语法中, 可用设备名参数表示“文档打印或预览“的是 #媒体#媒体#其他

问题&#xff1a;媒体查询语法中, 可用设备名参数表示"文档打印或预览"的是 A、C.?screen B.?projection C、A.?print D.?speech 参考答案如图所示

Unity DOTS中的baking(三)过滤baking的输出

Unity DOTS中的baking&#xff08;三&#xff09;过滤baking的输出 默认情况下&#xff0c;在conversation world&#xff08;baker和baking system运行的环境&#xff09;下产生的所有entities和components&#xff0c;都会作为baking环节的输出。在baking结束时&#xff0c;U…

使用Arcgis对欧洲雷达高分辨率降水数据重投影

当前需要使用欧洲高分辨雷达降水数据&#xff0c;但是这个数据的投影问题非常头疼。实际的投影应该长这样&#xff08;https://gist.github.com/kmuehlbauer/645e42a53b30752230c08c20a9c964f9?permalink_comment_id2954366https://gist.github.com/kmuehlbauer/645e42a53b307…