Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

Large diffs are not rendered by default.

10 changes: 5 additions & 5 deletions 3.LLM應用工程/1.LLM 部署/examples/06_model_comparison.py
Original file line number Diff line number Diff line change
Expand Up @@ -282,8 +282,8 @@ def demo_basic_comparison():
try:
ollama.list()
available_models.extend(["llama3.1:8b", "mistral:7b"])
except:
console.print("[yellow]⚠️ Ollama 不可用[/yellow]")
except Exception as e:
console.print(f"[yellow]⚠️ Ollama 不可用: {e}[/yellow]")

if not available_models:
console.print("[red]❌ 沒有可用的模型[/red]\n")
Expand Down Expand Up @@ -324,7 +324,7 @@ def demo_performance_comparison():
try:
ollama.list()
models.append("llama3.1:8b")
except:
except Exception:
pass

if len(models) < 2:
Expand Down Expand Up @@ -444,7 +444,7 @@ def demo_quality_comparison():
try:
ollama.list()
models.append("llama3.1:8b")
except:
except Exception:
pass

if not models:
Expand Down Expand Up @@ -477,7 +477,7 @@ def demo_save_comparison():
try:
ollama.list()
models.append("llama3.1:8b")
except:
except Exception:
pass

if not models:
Expand Down
2 changes: 1 addition & 1 deletion 3.LLM應用工程/1.LLM 部署/tools/benchmark.py
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ def main():
ollama_models = ollama.list().get('models', [])
if ollama_models:
default_models.append(ollama_models[0]['name'])
except:
except (ImportError, Exception):
pass

if default_models:
Expand Down
23 changes: 22 additions & 1 deletion 3.LLM應用工程/11.MCP協議與工具調用/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -335,8 +335,29 @@ async def calculate(expression: str) -> str:
Returns:
計算結果
"""
import ast
import operator

# 安全的運算符映射
ops = {
ast.Add: operator.add, ast.Sub: operator.sub,
ast.Mult: operator.mul, ast.Div: operator.truediv,
ast.Pow: operator.pow, ast.USub: operator.neg
}

def safe_eval(node):
if isinstance(node, ast.Num):
return node.n
elif isinstance(node, ast.BinOp):
return ops[type(node.op)](safe_eval(node.left), safe_eval(node.right))
elif isinstance(node, ast.UnaryOp):
return ops[type(node.op)](safe_eval(node.operand))
else:
raise ValueError(f"不支援的運算: {type(node)}")

try:
result = eval(expression) # 注意: 生產環境需要安全處理
tree = ast.parse(expression, mode='eval')
result = safe_eval(tree.body)
return f"結果: {result}"
except Exception as e:
return f"計算錯誤: {str(e)}"
Expand Down
5 changes: 2 additions & 3 deletions 3.LLM應用工程/2.LLM as API/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -378,9 +378,8 @@ if __name__ == "__main__":
**RAG 應用範例**:
```python
import gradio as gr
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.chat_models import ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain.chains import RetrievalQA

# 初始化
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ def basic_chat():
print(f" - Prompt tokens: {response.usage_metadata.prompt_token_count}")
print(f" - Candidates tokens: {response.usage_metadata.candidates_token_count}")
print(f" - Total tokens: {response.usage_metadata.total_token_count}")
except:
except AttributeError:
pass

return response
Expand Down Expand Up @@ -196,7 +196,7 @@ def safety_settings_example():
try:
for rating in response.candidates[0].safety_ratings:
print(f" - {rating.category.name}: {rating.probability.name}")
except:
except (AttributeError, IndexError):
print(" 無安全評分資訊")

return response
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ def test_gemini(prompt: str, model_name: str = "gemini-1.5-pro") -> Dict:
prompt_tokens = response.usage_metadata.prompt_token_count
completion_tokens = response.usage_metadata.candidates_token_count
total_tokens = response.usage_metadata.total_token_count
except:
except AttributeError:
prompt_tokens = 0
completion_tokens = 0
total_tokens = 0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@
# 嘗試導入 LangChain(如果可用)
try:
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.document_loaders import (
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_community.document_loaders import (
TextLoader,
PDFMinerLoader,
UnstructuredMarkdownLoader
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ plan = [
**實作範例**:
```python
from langchain.memory import ConversationBufferMemory, VectorStoreRetrieverMemory
from langchain.vectorstores import Chroma
from langchain_community.vectorstores import Chroma

# 短期記憶
short_term_memory = ConversationBufferMemory(
Expand Down Expand Up @@ -484,9 +484,28 @@ def search_tool(query: str) -> str:
return mock_results.get(query, "未找到相關資訊")

def calculator_tool(expression: str) -> str:
"""計算器工具"""
"""計算器工具(安全版本)"""
import ast
import operator

ops = {
ast.Add: operator.add, ast.Sub: operator.sub,
ast.Mult: operator.mul, ast.Div: operator.truediv,
ast.Pow: operator.pow, ast.USub: operator.neg
}

def safe_eval(node):
if isinstance(node, ast.Num):
return node.n
elif isinstance(node, ast.BinOp):
return ops[type(node.op)](safe_eval(node.left), safe_eval(node.right))
elif isinstance(node, ast.UnaryOp):
return ops[type(node.op)](safe_eval(node.operand))
raise ValueError("不支援的運算")

try:
result = eval(expression) # 注意:生產環境應使用安全的計算方法
tree = ast.parse(expression, mode='eval')
result = safe_eval(tree.body)
return str(result)
except Exception as e:
return f"計算錯誤: {str(e)}"
Expand All @@ -508,8 +527,9 @@ print(f"答案:{answer}")

```python
from langchain.agents import initialize_agent, Tool, AgentType
from langchain.llms import OpenAI
from langchain.utilities import GoogleSearchAPIWrapper, PythonREPL
from langchain_openai import OpenAI
from langchain_community.utilities import GoogleSearchAPIWrapper
from langchain_experimental.utilities import PythonREPL

# 初始化工具
search = GoogleSearchAPIWrapper()
Expand Down Expand Up @@ -2016,13 +2036,13 @@ class AgentEvaluator:
class CostTracker:
"""成本追蹤器"""

# 2024 價格(美元)
# 2025 價格(美元)
PRICING = {
"gpt-4": {"input": 0.03 / 1000, "output": 0.06 / 1000},
"gpt-4o": {"input": 0.0025 / 1000, "output": 0.01 / 1000},
"gpt-4o-mini": {"input": 0.00015 / 1000, "output": 0.0006 / 1000},
"gpt-4-turbo": {"input": 0.01 / 1000, "output": 0.03 / 1000},
"gpt-3.5-turbo": {"input": 0.0005 / 1000, "output": 0.0015 / 1000},
"claude-3-opus": {"input": 0.015 / 1000, "output": 0.075 / 1000},
"claude-3-sonnet": {"input": 0.003 / 1000, "output": 0.015 / 1000},
"claude-3.5-sonnet": {"input": 0.003 / 1000, "output": 0.015 / 1000},
}

def __init__(self):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,27 @@ def _calculator_tool(self, expression: str) -> str:
Returns:
計算結果
"""
import ast
import operator

ops = {
ast.Add: operator.add, ast.Sub: operator.sub,
ast.Mult: operator.mul, ast.Div: operator.truediv,
ast.Pow: operator.pow, ast.USub: operator.neg
}

def safe_eval(node):
if isinstance(node, ast.Num):
return node.n
elif isinstance(node, ast.BinOp):
return ops[type(node.op)](safe_eval(node.left), safe_eval(node.right))
elif isinstance(node, ast.UnaryOp):
return ops[type(node.op)](safe_eval(node.operand))
raise ValueError("不支援的運算")

try:
result = eval(expression) # 注意:生產環境應使用安全的計算方法
tree = ast.parse(expression, mode='eval')
result = safe_eval(tree.body)
return str(result)
except Exception as e:
return f"計算錯誤: {str(e)}"
Expand Down
2 changes: 1 addition & 1 deletion 3.LLM應用工程/3.Agent/examples/utils/agent_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ def setup_environment() -> Dict[str, str]:


def get_llm(
model: str = "gpt-4-turbo-preview",
model: str = "gpt-4o",
temperature: float = 0.7,
max_tokens: Optional[int] = None,
streaming: bool = False,
Expand Down
2 changes: 1 addition & 1 deletion 3.LLM應用工程/3.Agent/examples/utils/evaluator.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class AgentEvaluator:
使用 LLM 評估 Agent 的輸出質量。
"""

def __init__(self, model: str = "gpt-4-turbo-preview"):
def __init__(self, model: str = "gpt-4o"):
"""
初始化評估器

Expand Down
20 changes: 10 additions & 10 deletions 3.LLM應用工程/4.(RAG) 基礎/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -257,9 +257,9 @@ print(f"元數據: {chunks[0].metadata}")
### 4.4.3 使用 Chroma 建立向量資料庫

```python
from langchain.vectorstores import Chroma
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.document_loaders import TextLoader
from langchain_community.vectorstores import Chroma
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

# 1. 準備數據
Expand Down Expand Up @@ -318,9 +318,9 @@ for doc, score in results_with_scores:
### 4.4.4 完整的 RAG 系統實現

```python
from langchain.vectorstores import Chroma
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.llms import OpenAI
from langchain_community.vectorstores import Chroma
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_openai import OpenAI
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate

Expand Down Expand Up @@ -378,11 +378,11 @@ for i, doc in enumerate(result['source_documents'], 1):
### 4.4.5 使用 LangChain 的簡化 RAG

```python
from langchain.document_loaders import TextLoader
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.chat_models import ChatOpenAI
from langchain_community.vectorstores import FAISS
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_openai import ChatOpenAI
from langchain.chains import ConversationalRetrievalChain
from langchain.memory import ConversationBufferMemory

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ index = VectorStoreIndex.from_documents(
)

# 多模態查詢
multimodal_llm = OpenAIMultiModal(model="gpt-4-vision-preview")
multimodal_llm = OpenAIMultiModal(model="gpt-4o") # GPT-4o 支援多模態
query_engine = index.as_query_engine(
llm=multimodal_llm,
image_similarity_top_k=5
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,7 @@ class MultimodalRAG:

def __init__(self):
self.text_embeddings = OpenAIEmbeddings()
self.vision_model = ChatOpenAI(model="gpt-4-vision-preview")
self.vision_model = ChatOpenAI(model="gpt-4o") # GPT-4o 具備視覺能力

def process_document_with_images(self, pdf_path: str):
"""處理包含圖像的 PDF 文檔"""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,13 +118,27 @@ def _run(self, expression: str) -> str:
# 清理輸入
expression = expression.strip()

# 安全檢查:只允許數字和基本運算符
allowed_chars = set("0123456789+-*/().() ")
if not all(c in allowed_chars for c in expression):
return "錯誤:表達式包含不允許的字符"
# 使用 ast 模組進行安全計算
import ast
import operator

ops = {
ast.Add: operator.add, ast.Sub: operator.sub,
ast.Mult: operator.mul, ast.Div: operator.truediv,
ast.Pow: operator.pow, ast.USub: operator.neg
}

# 計算
result = eval(expression)
def safe_eval(node):
if isinstance(node, ast.Num):
return node.n
elif isinstance(node, ast.BinOp):
return ops[type(node.op)](safe_eval(node.left), safe_eval(node.right))
elif isinstance(node, ast.UnaryOp):
return ops[type(node.op)](safe_eval(node.operand))
raise ValueError("不支援的運算")

tree = ast.parse(expression, mode='eval')
result = safe_eval(tree.body)
return f"計算結果: {result}"

except ZeroDivisionError:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -530,7 +530,7 @@ def plot_results(self):
# 顯示(如果在互動環境中)
try:
plt.show()
except:
except Exception:
pass


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,7 @@ def _plot_comparison(self, results: Dict):

try:
plt.show()
except:
except Exception:
pass

except Exception as e:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from typing import List, Dict, Any, Optional, Tuple
import json

from langchain.chat_models import ChatOpenAI
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage, AIMessage

from src.vector_store import VectorStoreManager, HybridSearcher
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ def process_user_data(data):
if item['age'] > 18:
result.append(item)
return result
except:
except (KeyError, TypeError):
return []


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ def _parse_tool_call(self, text: str) -> Optional[Dict]:
tool_call = json.loads(json_str)
if 'tool' in tool_call:
return tool_call
except:
except (json.JSONDecodeError, ValueError):
pass
return None

Expand Down
Loading
Loading