记录我的学习之路

600 阅读14分钟

Python是一种高级编程语言,被广泛用于各种软件开发和应用领域。它由荷兰程序员吉多·范罗苏姆(Guido van Rossum)在1980年代末期发明,并于1991年首次发布。Python的设计哲学强调代码的可读性,其语法清晰简洁,这使得Python成为编程初学者的理想选择。

Python支持多种编程模式,包括过程式编程、面向对象编程以及函数式编程。它有一个庞大且活跃的社区,提供了大量的标准库和第三方模块,覆盖了网络编程、数据分析、人工智能、科学计算、图像处理等多个领域。

由于其易学性和强大的功能,Python已经成为学术界、工业界乃至业余编程爱好者中非常流行的编程语言之一。无论是网站开发、自动化脚本编写、数据挖掘还是机器学习项目,Python都展示了它的灵活性和强大能力。

1.命名规范

Python 的命名规范遵循 PEP 8(Python Enhancement Proposal 8),这是 Python 官方推荐的代码风格指南。以下是 Python 命名规范的核心内容:


1.1. 变量命名

小写字母 + 下划线:使用小写字母,单词之间用下划线 _ 分隔。

user_name = "Alice"
total_count = 100

避免单字母变量:除非是临时变量(如循环中的 ij),否则应使用有意义的名称。

for i in range(10):  # 允许
for index in range(10):  # 更推荐

1.2. 常量命名

全大写字母 + 下划线:常量通常定义在模块的顶部,使用全大写字母。

MAX_CONNECTIONS = 100
DEFAULT_TIMEOUT = 30

1.3. 函数命名

小写字母 + 下划线:与变量命名规则一致。

def calculate_total_price():
    pass

1.4. 类命名

驼峰命名法(CamelCase) :类名首字母大写,不使用下划线。

class UserProfile:
    pass

1.5. 模块命名

小写字母 + 下划线:模块文件名应简短且全小写。

# 模块文件名
data_processor.py

1.6. 包命名

小写字母 + 下划线:包名应简短且全小写,避免使用下划线(除非必要)。

# 包名
my_package/

1.7. 私有变量与函数

单下划线前缀:表示内部使用的变量或函数,外部不应直接访问。

_internal_variable = 42

def _helper_function():
    pass

双下划线前缀:表示名称改写(Name Mangling),用于避免子类中的命名冲突。

  • private_variable = 42

1.8. 特殊方法命名

双下划线前缀和后缀:Python 的特殊方法(如 __init____str__)使用双下划线。

class MyClass:
    def __init__(self):
        pass

    def __str__(self):
        return "MyClass"

1.9. 避免的命名

  • 避免与 Python 关键字冲突:如 classdefimport 等。

避免使用内置函数名:如 liststrdict 等。

# 不推荐
list = [1, 2, 3]

1.10. 命名一致性

  • 保持一致性:在同一个项目中,命名风格应保持一致。
  • 可读性优先:命名应清晰、简洁且易于理解。

2.Python 基础与变量

学习内容

Python 交互模式:通过命令行或终端进入 Python 交互环境。

>>> print("Hello, Python!")
Hello, Python!
  1. 变量赋值
    • 变量无需声明类型,直接赋值。

示例:

name = "Alice"        # 字符串
age = 25              # 整数
price = 19.99         # 浮点数
is_student = True     # 布尔值

动态类型:变量类型可随时改变。

x = 10      # 整数
x = "hello" # 变为字符串
练习题

定义变量 a = 5b = 3.2c = "Python",并打印它们的类型(使用 type())。

print(type(a))  # <class 'int'>
print(type(b))  # <class 'float'>
print(type(c))  # <class 'str'>
  1. 交换两个变量的值:x = 10, y = 20,不使用临时变量。
常见错误

语法错误:忘记冒号或引号不匹配。

# 错误示例
if x == 5
    print("x is 5")

修复:添加冒号 if x == 5:


3.运算符与表达式

学习内容

算术运算符

a = 10 + 5   # 15
b = 10 - 5   # 5
c = 10 * 2   # 20
d = 10 / 3   # 3.333...
e = 10 // 3  # 3(整除)
f = 10 % 3   # 1(取余)
g = 2 ** 3   # 8(幂运算)

字符串操作

s1 = "Hello"
s2 = "World"
s3 = s1 + " " + s2  # "Hello World"
s4 = s1 * 3         # "HelloHelloHello"
练习题

计算圆的面积(半径 r = 5,公式:πr²)。

import math
r = 5
area = math.pi * r ** 2
print(area)  # 约78.54
  1. 输入两个数,输出它们的和、差、积、商(用 input())。
常见错误

类型错误:字符串与数字直接运算。

age = 25
print("Age: " + age)  # 报错!

修复:转换为字符串 print("Age: " + str(age))


4.控制结构(条件与循环)

学习内容

条件语句

score = 85
if score >= 90:
    print("A")
elif score >= 80:
    print("B")  # 输出 B
else:
    print("C")
  1. 循环语句

for 循环:

for i in range(3):  # 0, 1, 2
    print(i)

while 循环:

count = 0
while count < 3:
    print(count)
    count += 1
练习题

判断一个数是否为偶数。

num = int(input("输入一个数: "))
if num % 2 == 0:
    print("偶数")
else:
    print("奇数")
  1. 打印 1 到 100 的所有奇数(用 forwhile)。
常见错误

缩进错误:Python 依赖缩进定义代码块。

# 错误示例
if x > 0:
print("正数")  # 缺少缩进

修复:添加缩进 print("正数")


5.数据结构(列表、元组、字典、集合)

学习内容

列表(List)

fruits = ["apple", "banana", "cherry"]
fruits.append("orange")  # 添加元素
fruits[1] = "mango"     # 修改元素
print(fruits[0:2])       # ["apple", "mango"]

字典(Dictionary)

person = {"name": "Alice", "age": 25}
print(person["name"])    # Alice
person["age"] = 26       # 修改值

**元组(Tuple)**和集合(Set):

coordinates = (10, 20)   # 元组不可修改
unique_numbers = {1, 2, 3, 3}  # 集合自动去重
练习题

合并两个列表:list1 = [1, 2, 3]list2 = [4, 5, 6]

  1. combined = list1 + list2 # [1, 2, 3, 4, 5, 6]
  2. 统计列表中元素的频率:words = ["apple", "banana", "apple", "cherry"]
常见错误

索引越界:访问不存在的索引。

fruits = ["apple", "banana"]
print(fruits[2])  # 报错!索引最大为1

修复:检查列表长度 len(fruits)


6.函数

学习内容

定义与调用函数

def greet(name):
    return f"Hello, {name}!"
print(greet("Alice"))  # Hello, Alice!
  1. 参数类型

默认参数:

def power(base, exponent=2):
    return base ** exponent
print(power(3))     # 9
print(power(3, 3))  # 27

可变参数:

def sum_all(*args):
    return sum(args)
print(sum_all(1, 2, 3))  # 6
练习题
  1. 编写函数计算斐波那契数列前 n 项。
  2. 编写函数检查字符串是否为回文(如 "madam")。
常见错误

未返回值:函数默认返回 None

def add(a, b):
    result = a + b
print(add(2, 3))  # 输出 None

修复:添加 return result


7.文件操作与异常处理

学习内容

读写文件

# 写文件
with open("data.txt", "w") as file:
    file.write("Hello, File!")

# 读文件
with open("data.txt", "r") as file:
    content = file.read()
    print(content)  # Hello, File!

异常处理

try:
    num = int(input("输入一个整数: "))
except ValueError:
    print("输入的不是整数!")
练习题
  1. 将用户输入的多个句子保存到文件 notes.txt
  2. 读取文件并统计单词数量。
常见错误

文件未关闭:使用 with 语句自动关闭文件。

# 错误示例
file = open("data.txt", "w")
file.write("Hello")
# 忘记 file.close()

修复:使用 with open(...) as file:


ollama

Get up and running with large language models.

Ollama 是一个开源的本地大语言模型运行框架,专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计。

Ollama 支持多种操作系统,包括 macOS、Windows、Linux 以及通过 Docker 容器运行。

Ollama 提供对模型量化的支持,可以显著降低显存要求,使得在普通家用计算机上运行大型模型成为可能。

1.Ollama 环境部署

1.1. 系统要求与前置准备

  • 硬件要求
    • CPU:建议 Intel i5 及以上(支持 AVX2 指令集)。
    • GPU(可选):NVIDIA GPU(需安装 CUDA 11.8+)可加速推理。
    • 内存:至少 16GB(7B 模型),70B 模型需 64GB+。
    • 存储:预留 50GB+ 空间(模型文件通常 5GB~100GB)。
  • 软件依赖
    • Windows:需安装 WSL2(推荐 Ubuntu 22.04)。
    • macOS:需安装 Homebrew
    • Linux:需安装 curldocker(可选)。

1.2. 安装 Ollama

  • Windows/macOS
    1. 访问 Ollama 官网 下载安装包。
    2. 双击安装包,按提示完成安装。

验证安装

ollama --version # 应输出类似 ollama version 0.1.20

Linux(手动安装):

curl -fsSL ollama.com/install.sh | sh

1.3. 配置模型存储路径

  • Windows
    1. 右键“此电脑” → “属性” → “高级系统设置” → “环境变量”。
    2. 新建系统变量:
      • 变量名OLLAMA_MODELS
      • 变量值D:\ollama-models(自定义路径)。

macOS/Linux

export OLLAMA_MODELS=/path/to/your/models
# 永久生效:将命令写入 ~/.bashrc 或 ~/.zshrc

1.4. 启动 Ollama 服务

后台运行

验证服务状态


2.模型拉取与运行

2.1. 模型选择与拉取

    • llama3:8b(通用对话)
    • deepseek-r1:7b(中文优化)
    • mistral:7b-instruct(指令跟随)

拉取模型

  • ollama pull llama3:8b # 下载 8B 版本

多线程加速(Linux/macOS):

export OLLAMA_NUM_PARALLEL=4 # 使用 4 线程下载
ollama pull llama3:8b

2.2. 模型运行与交互

命令行交互模式

ollama run llama3:8b
>>> 你是谁

批量生成文本

  • ollama run llama3:8b "写一篇关于人工智能的短文,300字左右"

2.3. API 调用示例

Python 脚本调用

import requests
response = requests.post(
    "http://localhost:11434/api/generate",
    json={
        "model": "llama3:8b",
        "prompt": "你是谁?",
        "stream": False
    }
)
print(response.json()["response"])

2.4. 模型管理命令

查看已安装模型

ollama list
# 输出示例
NAME            ID              SIZE    MODIFIED
llama3:8b       a78b43c1b1c3    4.7 GB  2 hours ago

删除模型

  • ollama rm llama3:8b

langchain

LangChain是一个由大型语言模型 (LLM) 驱动的应用程序开发框架。

LangChain 简化了 LLM 应用程序生命周期的每个阶段:

  • 开发:使用 LangChain 的开源组件第三方集成构建您的应用程序。使用LangGraph构建具有一流流媒体和人机交互支持的状态代理。
  • 生产化:使用LangSmith检查、监控和评估您的应用程序,以便您可以不断优化和自信地部署。
  • 部署:使用LangGraph 平台将您的 LangGraph 应用程序转变为可用于生产的 API 和助手。

1.LangChain 核心概念

1. 六大核心模块

  • 模型(Models) :支持多种 LLM(如 GPT-4、Llama2)和聊天模型(如 ChatGPT)。
  • 提示(Prompts) :管理提示模板,优化输入结构(例如动态变量替换)。
  • 链(Chains) :将多个组件串联成工作流,如“提示→模型→输出解析器”。
  • 索引(Indexes) :结合外部数据(如文档、数据库),通过向量存储实现检索增强生成(RAG)。
  • 代理(Agents) :让模型自主调用工具(如计算器、搜索引擎)完成任务。
  • 内存(Memory) :管理对话历史,维持多轮交互的上下文。

2.快速入门

2.1. 调用大模型生成文本

openAi

import os
from langchain_openai import ChatOpenAI

OPENAI_API_KEY  = os.getenv("OPENAI_API_KEY")
OPENAI_API_URL = os.getenv("OPENAI_API_URL")
# 初始化模型
llm = ChatOpenAI(
    model="gpt-3.5-turbo",
    openai_api_key=OPENAI_API_KEY,
    base_url= OPENAI_API_URL
)
# 执行调用
response = llm.invoke("你是谁")
print(response)  # 输出: content='我是一个人工智能助手,旨在提供信息和帮助解答问题。如果你有任何问题或需要支持,随时可以问我!' additional_kwargs={'refusal': None} response_metadata={'token_usage': {'completion_tokens': 30, 'prompt_tokens': 9, 'total_tokens': 39, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-3.5-turbo-0125', 'system_fingerprint': 'fp_b705f0c291', 'finish_reason': 'stop', 'logprobs': None} id='run-c0e446c0-a295-49d4-b164-a776ae478a2d-0' usage_metadata={'input_tokens': 9, 'output_tokens': 30, 'total_tokens': 39, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}}

本地大模型

from langchain_ollama import OllamaLLM

llm = OllamaLLM(model="deepseek-r1:1.5b")

# 执行调用
response = llm.invoke("你是谁")
print(response.content) # 输出: 您好!我是由中国的深度求索(DeepSeek)公司开发的智能助手DeepSeek-R1。如您有任何任何问题,我会尽我所能为您提供帮助。

3.Prompts 核心概念

3.1. 什么是 Prompts?

Prompts 是与大语言模型(LLM)交互的输入文本,用于引导模型生成特定输出或执行特定任务。它是模型理解用户意图的关键工具,直接影响模型输出的质量和准确性。

3.2. Prompts 的分类

  • 文本提示(Text Prompts) :简单的文本输入,如“写一篇关于人工智能的文章”。
  • 任务提示(Task Prompts) :明确任务目标,如“将以下文本翻译成法语”。
  • 示例提示(Few-Shot Prompts) :提供少量示例,引导模型完成任务。
  • 约束提示(Constraint Prompts) :添加限制条件,如“生成至少 5 个句子”

3.3.LangChain 中的 Prompts 工具

3.3.1. PromptTemplate

用于创建动态提示模板,支持变量插值。

from langchain_core.prompts import PromptTemplate

# 创建模板
template = "请讲一个关于{who}的{what}故事"
prompt_template = PromptTemplate.from_template(template)

# 填充变量
prompt = prompt_template.format(who="小狗", what="伤感")
print(prompt)  # 输出:请讲一个关于小狗的伤感故事
  • 适用场景:单轮对话或无需上下文的简单任务。
3.3.2. ChatPromptTemplate

用于构建聊天式提示,支持多角色消息(如系统、用户、AI)。

from langchain_core.prompts import ChatPromptTemplate

# 创建聊天模板
chat_template = ChatPromptTemplate.from_messages([
    ("system", "你是一个复述助手,擅长重复用户的输入。"),
    ("human", "{text}"),
])

# 填充变量
messages = chat_template.format_messages(text="我不喜欢你。")
print(messages)  # 输出:[SystemMessage(content='你是一个复述助手,擅长重复用户的输入。', additional_kwargs={}, response_metadata={}), HumanMessage(content='我不喜欢你。', additional_kwargs={}, response_metadata={})]
  • 适用场景:多轮对话或需要上下文的复杂任务。
3.3.3. FewShotPromptTemplate

用于少样本学习,通过示例引导模型完成任务。

from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate

# 定义示例
examples = [
    {"input": "2+2", "output": "4"},
    {"input": "2+3", "output": "5"},
]

# 定义示例模板
example_prompt = PromptTemplate(
    input_variables=["input", "output"],
    template="输入: {input}\n输出: {output}",
)

# 创建少样本模板
few_shot_prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=example_prompt,
    prefix="回答以下数学问题:",
    suffix="输入: {input}\n输出:",
    input_variables=["input"],
)

# 填充变量
prompt = few_shot_prompt.format(input="3+4")
print(prompt)
  • 适用场景:需要模型学习特定格式或风格的任务。
3.3. 4. 安全防护模板
输入语句:床前明月光下一句
安全评估结果:通过

修改建议:床前明月光的下一句是“疑是地上霜”。这句诗出自李白的《静夜思》。
输入语句:描述战争厮杀场面
安全评估结果:拒绝  
拒绝原因:内容涉及暴力和敏感信息。  
友好提示:如果您对战争或历史事件有兴趣,可以询问有关战争的历史背景、影响或相关人物的故事,而不是具体的厮杀场面。这样可以更好地理解战争的复杂性和后果。

查看中间步骤

image.png

image.png


3.3. 5. 医疗报告模板生成
输入语句:
患者小笼包(病历号H1234567890),男,56岁,手机号13800138000。
主诉:持续胸痛2小时,放射至左臂。BP 160/100mmHg,HR 110bpm。
心电图示前壁ST段抬高,肌钙蛋白T 0.45ng/ml(正常<0.01)。

患者身份报告:

隐私数据脱敏,展示主要报告,易理解语言 image.png

医生身份报告:

展示所有报告,专业化报告 image.png

风险预警:

image.png

隐私审计追踪:

image.png


4.LLM 模块核心概念

4. 1. LLM 模块的定位

  • LangChain 的 LLM 模块是连接各类大语言模型的统一接口,支持:
    • 本地模型(Ollama、Hugging Face)
    • 云端 API(OpenAI、Anthropic、Google Gemini)
    • 开源模型(Llama、Mistral)

4. 2. 核心功能

  • 统一接口:标准化 invoke()stream() 等方法。
  • 参数控制:调节 temperaturemax_tokens 等生成参数。
  • 扩展能力:支持自定义模型包装器。

4.3.环境准备与基础调用

4.3. 1. 安装依赖

pip install langchain langchain-openai langchain-community

4.3. 2. 调用 OpenAI 模型
from langchain_openai import ChatOpenAI

# 初始化模型
llm = ChatOpenAI(
    model="gpt-3.5-turbo",
    temperature=0.7,
    max_tokens=500
)

# 同步调用
response = llm.invoke("解释量子纠缠")
print(response.content)

# 流式调用
for chunk in llm.stream("生成 Python 排序算法教程"):
    print(chunk.content, end="", flush=True)
4.3. 3. 调用本地模型(Ollama)
# 先启动 Ollama 服务并下载模型
ollama pull llama2
ollama serve
from langchain_community.llms import Ollama

llm = Ollama(model="llama2")
response = llm.invoke("法国的首都是哪里?")
print(response)

4.4.高级配置与优化

4.4. 1. 参数调优
llm = ChatOpenAI(
    model="gpt-4",
    temperature=0.5,        # 控制随机性 (0-2)
    max_tokens=1000,        # 最大生成长度
    top_p=0.9,              # 核心采样概率
    frequency_penalty=0.5,  # 抑制重复内容
    timeout=30              # API 超时时间
)