智能Agent場景實戰指南 Day 18:Agent決策樹與規劃能力

【智能Agent場景實戰指南 Day 18】Agent決策樹與規劃能力

開篇

歡迎來到"智能Agent場景實戰指南"系列的第18天!今天我們將深入探討智能Agent的核心能力之一:決策樹與規劃能力。在現代業務場景中,Agent需要具備類似人類的決策能力,能夠根據環境變化和任務目標,自主選擇最優行動路徑。這種能力對于構建真正智能的Agent系統至關重要。

本文將系統講解如何為Agent實現高效的決策樹和規劃能力,包括技術原理、架構設計、完整代碼實現和業務應用案例。通過今天的學習,您將掌握:

  1. 決策樹在Agent系統中的應用原理
  2. 規劃算法的選擇與實現技巧
  3. 如何將決策能力集成到現有Agent框架中
  4. 實際業務場景中的決策優化策略

場景概述

業務價值

決策與規劃能力是智能Agent區別于簡單自動應答系統的關鍵特征。在復雜業務場景中,Agent需要:

  • 評估多種可能的行動方案
  • 預測不同決策的后果
  • 選擇最優執行路徑
  • 動態調整計劃以應對變化

這種能力在以下場景中尤為重要:

業務場景決策需求技術挑戰
智能客服選擇最佳解決方案路徑實時性要求高
供應鏈優化多因素動態規劃復雜約束條件
金融投資風險評估與策略選擇不確定性管理
醫療診斷分診與治療方案選擇知識復雜性

技術挑戰

實現高效的Agent決策與規劃面臨以下技術挑戰:

  1. 狀態空間爆炸:隨著決策點增加,可能的狀態呈指數級增長
  2. 不確定性與風險:現實環境中存在大量不可預測因素
  3. 實時性要求:許多業務場景需要快速響應
  4. 多目標優化:需要平衡多個可能沖突的目標

技術原理

決策樹基礎

決策樹是一種樹形結構,其中:

  • 內部節點代表決策判斷
  • 分支代表可能的判斷結果
  • 葉節點代表最終決策或行動

在Agent系統中,決策樹可以表示為:

class DecisionNode:
def __init__(self, name, condition=None, true_branch=None, false_branch=None, action=None):
self.name = name  # 節點名稱
self.condition = condition  # 判斷條件函數
self.true_branch = true_branch  # 條件為真時進入的分支
self.false_branch = false_branch  # 條件為假時進入的分支
self.action = action  # 葉節點對應的行動

規劃算法

Agent常用的規劃算法包括:

  1. 經典規劃:基于狀態空間搜索
  • 前向搜索
  • 后向搜索
  • 啟發式搜索
  1. 分層規劃
  • HTN(層次任務網絡)
  • 抽象層次分解
  1. 概率規劃
  • MDP(馬爾可夫決策過程)
  • POMDP(部分可觀察馬爾可夫決策過程)

決策與規劃集成

現代Agent系統通常采用分層架構集成決策與規劃:

感知層 → 決策層 → 規劃層 → 執行層

架構設計

系統架構

以下是Agent決策與規劃系統的核心組件:

  1. 狀態感知模塊:收集環境信息并維護當前狀態
  2. 知識庫:存儲領域知識和規則
  3. 決策引擎:評估當前狀態并生成決策樹
  4. 規劃器:基于決策樹生成可執行計劃
  5. 執行監控:跟蹤計劃執行并反饋調整

組件交互流程

  1. Agent接收任務或感知環境變化
  2. 狀態感知模塊更新當前狀態
  3. 決策引擎根據狀態和知識庫生成決策樹
  4. 規劃器將決策樹轉化為具體行動計劃
  5. 執行模塊執行計劃并監控結果
  6. 根據執行反饋調整決策和規劃

代碼實現

決策樹實現

class DecisionTree:
def __init__(self, root_node):
self.root = root_nodedef evaluate(self, context):
"""評估決策樹并返回最終決策"""
current_node = self.root
while True:
if current_node.action is not None:
return current_node.action  # 到達葉節點,返回行動# 評估當前節點條件
result = current_node.condition(context)
if result:
current_node = current_node.true_branch
else:
current_node = current_node.false_branch# 示例:客服Agent決策樹構建
def build_customer_service_tree():
# 定義條件判斷函數
def is_urgent(context):
return context.get('urgency', 0) > 5def is_technical(context):
return context.get('issue_type') == 'technical'def is_billing(context):
return context.get('issue_type') == 'billing'# 構建決策樹
root = DecisionNode(
"root",
condition=is_urgent,
true_branch=DecisionNode(
"urgent_issue",
action={"type": "escalate", "level": "high"}
),
false_branch=DecisionNode(
"normal_issue",
condition=is_technical,
true_branch=DecisionNode(
"technical_issue",
action={"type": "route", "team": "technical_support"}
),
false_branch=DecisionNode(
"non_technical",
condition=is_billing,
true_branch=DecisionNode(
"billing_issue",
action={"type": "route", "team": "billing"}
),
false_branch=DecisionNode(
"general_issue",
action={"type": "route", "team": "general_support"}
)
)
)
)
return DecisionTree(root)

規劃器實現

class HTNPlanner:
def __init__(self, domain_knowledge):
self.domain = domain_knowledge  # 領域知識庫def plan(self, task, context):
"""生成層次化任務網絡計劃"""
method = self._find_method(task, context)
if not method:
return [task]  # 原始任務subtasks = []
for subtask in method['subtasks']:
if isinstance(subtask, dict) and 'task' in subtask:
# 遞歸規劃子任務
subtasks.extend(self.plan(subtask['task'], context))
else:
subtasks.append(subtask)
return subtasksdef _find_method(self, task, context):
"""找到適合當前上下文的分解方法"""
for method in self.domain.get(task, {}).get('methods', []):
if self._evaluate_preconditions(method.get('preconditions', []), context):
return method
return Nonedef _evaluate_preconditions(self, preconditions, context):
"""評估前提條件是否滿足"""
for condition in preconditions:
if not condition(context):
return False
return True# 示例:客服領域知識
customer_service_domain = {
"handle_customer_query": {
"methods": [
{
"name": "route_by_issue_type",
"preconditions": [lambda ctx: "issue_type" in ctx],
"subtasks": [
{"task": "route_to_{issue_type}_team"},
{"task": "follow_up"}
]
},
{
"name": "default_handling",
"subtasks": [
"collect_customer_info",
"escalate_to_supervisor"
]
}
]
},
"route_to_technical_team": {
"methods": [
{
"subtasks": [
"verify_technical_details",
"assign_to_engineer"
]
}
]
}
}

關鍵功能

動態決策調整

Agent需要根據環境變化動態調整決策策略:

class AdaptiveDecisionMaker:
def __init__(self, initial_tree, learning_rate=0.1):
self.decision_tree = initial_tree
self.learning_rate = learning_rate
self.memory = []  # 存儲決策歷史def decide(self, context):
action = self.decision_tree.evaluate(context)
self.memory.append((context.copy(), action))
return actiondef update_tree(self, feedback):
"""根據反饋調整決策樹"""
for context, action, reward in feedback:
# 簡化版:根據獎勵調整條件閾值
node = self._find_decision_node(context)
if node and hasattr(node.condition, 'threshold'):
if reward > 0:
node.condition.threshold *= (1 - self.learning_rate)
else:
node.condition.threshold *= (1 + self.learning_rate)def _find_decision_node(self, context):
"""查找影響當前決策的節點"""
# 簡化實現,實際需要更復雜的搜索
current = self.decision_tree.root
while True:
if current.action is not None:
return Noneresult = current.condition(context)
if result:
if current.true_branch.action is not None:
return current
current = current.true_branch
else:
if current.false_branch.action is not None:
return current
current = current.false_branch

多目標決策優化

處理多個可能沖突的目標時,可以使用多目標優化技術:

def multi_objective_decision(context, objectives, candidates):
"""
多目標決策函數
:param context: 當前上下文
:param objectives: 目標列表,每個目標是一個(權重,評估函數)元組
:param candidates: 候選決策列表
:return: 最優決策
"""
scored_decisions = []
for decision in candidates:
scores = []
for weight, objective in objectives:
try:
score = weight * objective(context, decision)
scores.append(score)
except:
scores.append(0)  # 目標不可評估時得0分
# 使用加權分數
total_score = sum(scores)
scored_decisions.append((total_score, decision))# 返回最高分的決策
return max(scored_decisions, key=lambda x: x[0])[1]# 示例使用
objectives = [
(0.6, lambda ctx, d: d.get('customer_satisfaction', 0)),  # 客戶滿意度權重60%
(0.3, lambda ctx, d: -d.get('cost', 0)),  # 成本權重30%(負值表示越小越好)
(0.1, lambda ctx, d: d.get('speed', 0))  # 速度權重10%
]candidates = [
{'action': 'escalate', 'customer_satisfaction': 8, 'cost': 100, 'speed': 5},
{'action': 'auto_resolve', 'customer_satisfaction': 5, 'cost': 20, 'speed': 8},
{'action': 'route_to_team', 'customer_satisfaction': 7, 'cost': 50, 'speed': 6}
]best_decision = multi_objective_decision({}, objectives, candidates)
print(f"最優決策: {best_decision['action']}")

測試與優化

測試方法

  1. 單元測試:驗證每個決策節點和規劃步驟
  2. 場景測試:模擬完整業務流程
  3. 壓力測試:評估決策系統在高負載下的表現
  4. A/B測試:比較不同決策策略的效果

性能指標

指標類型具體指標評估方法
決策質量準確率、收益離線評估/在線測試
響應速度決策延遲性能測試
適應性策略調整速度變更響應測試
可擴展性節點處理能力負載測試

優化策略

  1. 決策樹剪枝:移除對結果影響小的分支
  2. 緩存決策結果:對相似狀態緩存決策
  3. 并行評估:同時評估多個決策路徑
  4. 近似算法:對復雜問題使用近似解法
def optimize_decision_tree(tree, samples, max_depth=5):
"""通過樣本數據優化決策樹結構"""
# 實現簡化版的決策樹優化
optimized_nodes = []def _optimize_node(node, depth):
if depth >= max_depth or node.action is not None:
return node# 評估當前節點的分割效果
sample_counts = {'true': 0, 'false': 0}
for sample in samples:
result = node.condition(sample['context'])
if result:
sample_counts['true'] += 1
else:
sample_counts['false'] += 1# 如果某個分支樣本極少,則考慮剪枝
if sample_counts['true'] < len(samples) * 0.1:
return _optimize_node(node.false_branch, depth+1)
elif sample_counts['false'] < len(samples) * 0.1:
return _optimize_node(node.true_branch, depth+1)# 遞歸優化分支
new_node = DecisionNode(
node.name,
condition=node.condition,
true_branch=_optimize_node(node.true_branch, depth+1),
false_branch=_optimize_node(node.false_branch, depth+1),
action=node.action
)
return new_nodereturn DecisionTree(_optimize_node(tree.root, 0))

案例分析:智能客服決策系統

業務需求

某電商平臺需要升級其客服系統,實現:

  1. 自動分類客戶問題
  2. 智能路由到最佳處理渠道
  3. 動態調整處理策略
  4. 實時監控解決效率

解決方案

我們設計了一個基于決策樹和分層規劃的智能Agent系統:

  1. 決策層:使用多級決策樹分類問題
  2. 規劃層:根據問題類型生成處理流程
  3. 執行層:協調不同系統執行具體操作

核心實現

class CustomerServiceAgent:
def __init__(self):
self.decision_tree = build_customer_service_tree()
self.planner = HTNPlanner(customer_service_domain)
self.state = {}def handle_query(self, query):
# 更新上下文狀態
self._update_context(query)# 決策階段
decision = self.decision_tree.evaluate(self.state)# 規劃階段
if decision['type'] == 'route':
task = f"route_to_{decision['team']}_team"
else:
task = decision['type']plan = self.planner.plan(task, self.state)# 執行階段
results = []
for step in plan:
if isinstance(step, str) and step.startswith('route_to_'):
team = step.replace('route_to_', '').replace('_team', '')
results.append(self._route_to_team(team))
elif step == 'follow_up':
results.append(self._follow_up())
elif step == 'escalate_to_supervisor':
results.append(self._escalate())
else:
results.append(self._execute_generic_step(step))return {
'decision': decision,
'plan': plan,
'results': results
}def _update_context(self, query):
"""從查詢中提取信息更新上下文狀態"""
self.state.update({
'issue_type': self._classify_issue(query),
'urgency': self._assess_urgency(query),
'customer_tier': query.get('customer_tier', 'standard')
})def _classify_issue(self, query):
"""簡化版問題分類"""
text = query.get('text', '').lower()
if 'payment' in text or 'bill' in text:
return 'billing'
elif 'login' in text or 'error' in text:
return 'technical'
return 'general'def _assess_urgency(self, query):
"""評估問題緊急程度"""
text = query.get('text', '')
if 'urgent' in text.lower() or 'immediately' in text.lower():
return 8
elif 'not working' in text.lower():
return 6
return 3def _route_to_team(self, team):
"""路由到指定團隊"""
print(f"Routing to {team} team")
return {'status': 'success', 'team': team}def _follow_up(self):
"""跟進處理"""
print("Scheduling follow-up")
return {'status': 'scheduled'}def _escalate(self):
"""升級處理"""
print("Escalating to supervisor")
return {'status': 'escalated'}def _execute_generic_step(self, step):
"""執行通用步驟"""
print(f"Executing step: {step}")
return {'status': 'completed', 'step': step}# 使用示例
agent = CustomerServiceAgent()
query = {
'text': "I can't login to my account and this is urgent!",
'customer_id': "12345",
'customer_tier': "premium"
}
result = agent.handle_query(query)
print(result)

實施效果

該解決方案實現了:

  1. 問題分類準確率提升40%
  2. 平均處理時間縮短35%
  3. 客戶滿意度提高25%
  4. 人工干預需求減少60%

實施建議

最佳實踐

  1. 漸進式部署
  • 先在小范圍業務流中測試
  • 逐步擴大應用范圍
  • 建立回滾機制
  1. 知識維護
  • 建立決策知識版本控制
  • 定期審核和更新決策規則
  • 實現知識熱更新機制
  1. 監控體系
  • 實時跟蹤決策質量
  • 監控規劃執行效率
  • 建立異常預警機制

注意事項

  1. 決策可解釋性
  • 記錄完整決策路徑
  • 提供決策依據說明
  • 實現決策追溯功能
  1. 風險管理
  • 設置高風險決策的人工審核環節
  • 實現決策安全邊界控制
  • 建立應急干預機制
  1. 性能平衡
  • 在決策質量和響應速度間取得平衡
  • 對復雜決策設置時間上限
  • 實現分級決策機制

總結

在今天的學習中,我們深入探討了Agent決策樹與規劃能力的實現方法,包括:

  1. 決策樹構建:如何構建和優化決策樹結構
  2. 規劃算法:分層任務網絡等規劃技術的實現
  3. 系統集成:將決策和規劃能力整合到Agent架構中
  4. 實戰案例:完整實現了一個智能客服決策系統

關鍵設計思想:

  • 分層決策:將復雜問題分解為多個決策層次
  • 動態調整:根據反饋持續優化決策策略
  • 多目標平衡:綜合考慮多個業務指標

明天我們將探討【Day 19: Agent工具使用與API調用】,學習如何讓Agent有效利用外部工具和API擴展其能力。

參考資料

  1. Decision Tree Learning - Wikipedia
  2. Hierarchical Task Network Planning
  3. Markov Decision Processes in AI
  4. Multi-Agent Decision Making
  5. Practical Decision Making for AI Agents

文章標簽:AI Agent, 決策樹, 規劃算法, 智能決策, 業務自動化, 人工智能應用

文章簡述:本文是"智能Agent場景實戰指南"系列的第18篇,深入講解了如何為智能Agent實現高效的決策樹和規劃能力。文章從業務場景出發,系統介紹了決策樹構建、規劃算法選擇、系統架構設計等核心技術,并提供了完整的代碼實現和優化策略。通過一個智能客服系統的實際案例,展示了如何將這些技術應用于真實業務場景,解決復雜決策問題。開發者可以從中學習到構建具有高級決策能力Agent的實用方法和技術。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90554.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90554.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90554.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI 編程工具 Trae 重要的升級。。。

大家好&#xff0c;我是櫻木。 今天打開 Trae &#xff0c;已經看到它進行圖標升級&#xff0c;之前的圖標&#xff0c;國際和國內版本長得非常像&#xff0c;現在做了很明顯的區分&#xff0c;這點給 Trae 團隊點個贊。 自從 Claude 使出了壓力以來&#xff0c;Cursor 鎖區&…

排序算法,咕咕咕

1.選擇排序void selectsort(vector<int>& v) { for(int i0;i<v.size()-1;i) {int minii;for(int ji1;j<v.size();j){if(v[i]>v[j]){minij;}}if(mini!i)swap(v[i],v[mini]); } }2.堆排序void adjustdown(vector<int>& v,int root,int size) { int …

數據庫查詢系統——pyqt+python實現Excel內查課

一、引言 數據庫查詢系統處處存在&#xff0c;在教育信息化背景下&#xff0c;數據庫查詢技術更已深度融入教務管理場景。本系統采用輕量化架構&#xff0c;結合Excel課表&#xff0c;通過PythonPyQt5實現跨平臺桌面應用&#xff0c;以實現簡單查課效果。 二、GUI界面設計 使用…

base64魔改算法 | jsvmp日志分析并還原

前言 上一篇我們講了標準 base64 算法還原&#xff0c;為了進一步學習 base64 算法特點&#xff0c;本文將結合 jsvmp 日志&#xff0c;實戰還原出 base64 魔改算法。 為了方便大家學習&#xff0c;我將入參和上篇文章一樣&#xff0c;入參為 Hello, World!。 插樁 在js代碼中&…

vue3筆記(2)自用

目錄 一、作用域插槽 二、pinia的使用 一、Pinia 基本概念與用法 1. 安裝與初始化 2. 創建 Store 3. 在組件中使用 Store 4. 高級用法 5、storeToRefs 二、Pinia 與 Vuex 的主要區別 三、為什么選擇 Pinia&#xff1f; 三、定義全局指令 1.封裝通用 DOM 操作&#…

大模型面試回答,介紹項目

1. 模型準備與轉換&#xff08;PC端/服務器&#xff09;你先在PC上下載或訓練好大語言模型&#xff08;如HuggingFace格式&#xff09;。用RKLLM-Toolkit把模型轉換成瑞芯微NPU能用的專用格式&#xff08;.rkllm&#xff09;&#xff0c;并可選擇量化優化。把轉換好的模型文件拷…

Oracle 19.20未知BUG導致oraagent進程內存泄漏

故障現象查詢操作系統進程的使用排序&#xff0c;這里看到oraagent的物理內存達到16G&#xff0c;遠遠超過正常環境&#xff08;正常環境在19.20大概就是100M多一點&#xff09;[rootorastd tmp]# ./hmem|more PID NAME VIRT(kB) SHARED(kB) R…

嘗試幾道算法題,提升python編程思維

一、跳躍游戲題目描述&#xff1a; 給定一個非負整數數組 nums&#xff0c;你最初位于數組的第一個下標。數組中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最后一個下標。示例&#xff1a;輸入&#xff1a;nums [2,3,1,1,4] → 輸出&#xff1a;True輸入…

【菜狗處理臟數據】對很多個不同時間序列數據的文件聚類—20250722

目錄 具體做法 可視化方法1&#xff1a;PCA降維 可視化方法2、TSNE降維可視化&#xff08;非線性降維&#xff0c;更適合聚類&#xff09; 可視化方法3、輪廓系數評判好壞 每個文件有很多行列的信息&#xff0c;每列是一個駕駛相關的數據&#xff0c;需要對這些文件進行聚類…

Qwen-MT:翻得快,譯得巧

我們再向大家介紹一位新朋友&#xff1a;機器翻譯模型Qwen-MT。開發者朋友們可通過Qwen API&#xff08;qwen-mt-turbo&#xff09;&#xff0c;來直接體驗它又快又準的翻譯技能。 本次更新基于強大的 Qwen3 模型&#xff0c;進一步使用超大規模多語言和翻譯數據對模型進行訓練…

在 OceanBase 中,使用 TO_CHAR 函數 直接轉換日期格式,簡潔高效的解決方案

SQL語句SELECT TO_CHAR(TO_DATE(your_column, DD-MON-YY), YYYY-MM-DD) AS formatted_date FROM your_table;關鍵說明&#xff1a;核心函數&#xff1a;TO_DATE(30-三月-15, DD-MON-YY) → 將字符串轉為日期類型TO_CHAR(..., YYYY-MM-DD) → 格式化為 2015-03-30處理中文月份&a…

pnpm運行electronic項目報錯,npm運行正常。electronic項目打包為exe報錯

pnpm運行electronic項目報錯 使用 pnpm 運行 electronic 項目報錯&#xff0c;npm 運行正常&#xff0c;報錯內容如下 error during start dev server and electron app: Error: Electron uninstallat getElectronPath (file:///E:/project/xxx-vue/node_modules/.pnpm/elect…

8?? 高級特性—— 列表生成式

文章目錄&#x1f9e0; 總結1. 基本語法2. 加篩選條件&#x1f501; 雙層循環&#xff08;全排列&#xff09;&#x1f4c2; 遍歷目錄&#x1f511; 遍歷字典&#x1f521; 轉小寫3. if 和 if...else 的區別4. 練習題&#x1f9e0; 總結 特性用法示例基礎語法[x for x in iter…

DocC的簡單使用

DocC的簡單使用 在寫3GShare中&#xff0c;由于剛開始使用MVC模式來寫東西&#xff0c;對很多東西都不是很熟&#xff0c;經常寫著寫著就忘了自己在寫什么&#xff0c;所以學了一下DocC來加快開發進度 什么是DocC 簡單來說&#xff0c;DocC就是更高級的注釋&#xff0c;雖然…

深入理解C語言快速排序與自省排序(Introsort)

排序算法是計算機科學中最基礎也是最重要的知識之一。快速排序&#xff08;Quicksort&#xff09;因其平均時間復雜度為 O(n log n) 而廣受歡迎&#xff0c;但在最壞情況下會退化到 O(n)。為了克服這一缺點&#xff0c;自省排序&#xff08;Introsort&#xff09; 應運而生&…

C#編程基礎:運算符與結構詳解

目錄 一.關系運算符 常見關系運算符 二.邏輯運算符 常見邏輯運算符 1. 邏輯與&#xff08;&& 或 and&#xff09; 2. 邏輯或&#xff08;|| 或 or&#xff09; 3. 邏輯非&#xff08;! 或 not&#xff09; 運算符優先級 三.if語句 1.c#程序的三大結構 1.順序…

嵌入式學習-土堆目標檢測(3)-day27

再學一個labelme在labelstudio環境中再pip install labelme安裝好后直接輸入 labelme之后點擊保存&#xff0c;選擇保存文件地址還有一個就是將labelme的格式轉化為yolo格式還是在labelstudio這個環境里面安裝pip install labelme2yolo

Qt OpenGL 集成:開發 3D 圖形應用

Qt 提供了完善的 OpenGL 集成方案&#xff0c;使開發者能夠在 Qt 應用中高效開發 3D 圖形應用。通過 Qt 的 OpenGL 模塊&#xff0c;可簡化 OpenGL 上下文管理、窗口渲染和跨平臺適配&#xff0c;同時結合現代 OpenGL 特性&#xff08;如著色器、頂點緩沖、紋理等&#xff09;實…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 熱詞評論查詢功能實現

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解熱詞評論查詢功能實現 視頻在線地址&#…

使用 Google Earth 的 DEM — 教程。

數字高程模型 (DEM)描繪了已知高程點之間的表面高程。本教程將向您展示如何使用 Google Earth 的高程數據生成 DEM。在當今世界&#xff0c;DEM 主要用于 GIS 應用。 當然&#xff0c;我們可以從美國地質調查局 (USGS) 網站下載數字高程模型 (DEM)。但如果我們想知道某個地點的…