chore: rename multiple files to improve importability and module structure

This commit is contained in:
Annyfee
2025-11-28 11:25:58 +08:00
parent 7d10f27951
commit 5bc33d2584
41 changed files with 4 additions and 4 deletions
+62
View File
@@ -0,0 +1,62 @@
# 仅负责: 切片 -> 向量化 -> 构建索引 -> 保存到磁盘
# 运行一次即可,无需每次检索都运行
from embeddings import get_embeddings
import os
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
# 准备知识库内容
knowledge_base_content = """
### 模块 01 — Agent 入门 & 环境搭建
- **目标**:理解 Agent 概念,完成环境配置与首次调用。
- **内容**:环境依赖|API Key 配置|最小可运行 Agent
### 模块 02 — LLM 基础调用
- **目标**:掌握模型调用逻辑,初步构建智能体能力。
- **内容**LLM了解与调用|Prompt编写与逻辑构思|多轮对话记忆|独立搭建一个智能体
### 模块 03 — Function Calling 与工具调用
- **目标**:实现 LLM 调用外部函数,赋予模型“执行力”。
- **内容**Function calling原理|工具函数封装|API接入实践|多轮调用流程|Agent能力扩展
### 模块 04 — LangChain 基础篇
- **目标**:认识Langchain六大模块,学会用Langchain构建智能体。
- **内容**LLM 调用|Prompt 设计|Chain 构建|Memory 记忆|实战练习
### 模块 05 — LangChain 进阶篇
- **目标**:掌握Langchain Agents的核心机制,构建能调用工具、持续思考、具备记忆的智能体。
- **内容**Function Calling@tool 工具封装|ReAct 循环|Agent 构建|SQL Agent|记忆+流式|开发优化
"""
with open("knowledge_base.txt",'w',encoding='utf8') as f:
f.write(knowledge_base_content)
# 1. 加载并切分文档 (Load&Split)
loader = TextLoader("knowledge_base.txt",encoding='utf8')
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=250,chunk_overlap=40) # 载入切分器模板
splits = text_splitter.split_documents(docs) # 运行切分器
print(f'p1完成,文档已切分成{len(splits)}个片段\n')
# 2. 向量化(Embedding)
embeddings_model = get_embeddings() # 载入向量化模型
print(f'p2完成,Embedding模型已准备\n') #
# 3. 存储(Store)
db = FAISS.from_documents(splits,embeddings_model) # 将分割块与向量化的模型传递给FAISS,FAISS会使用它们并完成最终向量数据库的构建。
db.save_local("faiss_index")
print(f'p3完成,向量数据库{db}已构建')
# 清理临时文件
os.remove("knowledge_base.txt")
print('---所有阶段已经完成!---')
+18
View File
@@ -0,0 +1,18 @@
from embeddings import get_embeddings
# 首次运行可能时间较久 -- 同时运行本文件需要梯子,不然无法加载到本地
print('---正在加载本地嵌入模型(bge-small-zh-v1.5)...---')
# 理论:有embedding的向量模型
embeddings_model = get_embeddings("bge-small-zh-v1.5")
print('嵌入模型载入完毕')
# 演示:将文本转换为向量
text = "模块05的目标是什么"
query_embedding = embeddings_model.embed_query(text)
# 验证:向量存在,而且有具体数值
print(f'文本:{text}')
print(f'向量(前五维):{query_embedding[:5]}')
print(f'向量维度:{len(query_embedding)}')
+82
View File
@@ -0,0 +1,82 @@
import os
from langchain_community.document_loaders import TextLoader # 加载
from langchain_text_splitters import RecursiveCharacterTextSplitter # 分割
# 创建一个演示txt文件
knowledge_base_content = """
### 模块 01 — Agent 入门 & 环境搭建
- **目标**:理解 Agent 概念,完成环境配置与首次调用。
- **内容**:环境依赖|API Key 配置|最小可运行 Agent
### 模块 02 — LLM 基础调用
- **目标**:掌握模型调用逻辑,初步构建智能体能力。
- **内容**LLM了解与调用|Prompt编写与逻辑构思|多轮对话记忆|独立搭建一个智能体
### 模块 03 — Function Calling 与工具调用
- **目标**:实现 LLM 调用外部函数,赋予模型“执行力”。
- **内容**Function calling原理|工具函数封装|API接入实践|多轮调用流程|Agent能力扩展
### 模块 04 — LangChain 基础篇
- **目标**:认识Langchain六大模块,学会用Langchain构建智能体。
- **内容**LLM 调用|Prompt 设计|Chain 构建|Memory 记忆|实战练习
### 模块 05 — LangChain 进阶篇
- **目标**:掌握Langchain Agents的核心机制,构建能调用工具、持续思考、具备记忆的智能体。
- **内容**Function Calling@tool 工具封装|ReAct 循环|Agent 构建|SQL Agent|记忆+流式|开发优化
"""
with open('knowledge_base.txt','w',encoding='utf8') as f:
f.write(knowledge_base_content)
# 1.加载
# TextLoader 读取.txt文件,并将其转换为Document对象
loader = TextLoader('knowledge_base.txt',encoding='utf8')
docs = loader.load()
print(f'{docs}已加载完成!')
# 2.分割
text_splitter = RecursiveCharacterTextSplitter(
# 本节重点
chunk_size=250, # 设定的chunk块大小(字符数),
chunk_overlap=40 # 设定的重叠大小(字符数)
) # 创建分割器的配置模板
splits = text_splitter.split_documents(docs) # 实际执行切割
print(f'分块结果:{len(splits)}')
for i,doc in enumerate(splits):
print(f'片段{i+1}(长度:{len(doc.page_content)})')
print(doc.page_content)
print('-'*100+'\n')
# 观察:
# 我们的文本被分割成了四块,没有一块的长度超过250.
# 所以没有用到overlap(重叠),这是最好的结果
# 删除txt文件
os.remove('knowledge_base.txt')
+109
View File
@@ -0,0 +1,109 @@
from embeddings import get_embeddings
from config import OPENAI_API_KEY
import os
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
# --- 模块A (离线操作) ---
# 1. 加载&分割 2. 向量化 3. 存储
KNOWLEDGE_BASE_CONTENT = """
### 模块 01 - Agent 入门 & 环境搭建
- **目标**: 理解 Agent 概念, 完成环境配置与首次调用。
- **内容**: 环境依赖 | API Key 配置 | 最小可运行 Agent
### 模块 02 - LLM 基础调用
- **目标**: 掌握模型调用逻辑, 初步构建智能体能力。
- **内容**: LLM 了解与调用 | Prompt 编写与逻辑构思 | 多轮对话记忆 | 独立构建一个智能体
### 模块 03 - Function Calling 与工具调用
- **目标**: 实现 LLM 调用外部函数, 赋予模型“执行力”。
- **内容**: Function calling 原理 | 工具函数封装 | API 接入实践 | 多轮调用流程 | Agent 能力扩展
### 模块 04 - LangChain 基础篇
- **目标**: 认识 LangChain 六大模块, 学会用 LangChain 构建智能体。
- **内容**: LLM 调用 | Prompt 设计 | Chain 构建 | Memory 记忆 | 实战练习
### 模块 05 - LangChain 进阶篇
- **目标**: 掌握 LangChain Agents 的核心机制, 构建能调用工具、持续思考、具备记忆的智能体。
- **内容**: Function Calling | @tool 工具封装 | ReAct 循环 | Agent 构建 | SQL Agent | 记忆+流式 | 开发优化
"""
with open("knowledge_base.txt", "w", encoding="utf-8") as f:
f.write(KNOWLEDGE_BASE_CONTENT)
loader = TextLoader('knowledge_base.txt',encoding='utf8')
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=250,chunk_overlap=40)
splits = text_splitter.split_documents(docs)
embedding_model = get_embeddings("bge-small-zh-v1.5")
db = FAISS.from_documents(splits,embedding_model) # 在内存中构建向量索引,但不持久化到本地文件
print('---模块A(Indexing)完成---\n')
# --- 模块B (在线运行:Online R-A-G Flow) ---
print('--- 模块B R-A-G正在构建---\n')
# 1. R (Retrieval - 检索)
retrieve = db.as_retriever(search_kwarg={"k":1}) # 只返回最相关的1个
# 2. A (Augmented - 增强)
system = """
请你扮演一个 Ai Agent 教学助手。
请你只根据下面提供的“上下文”来回答问题。
如果上下文中没有提到,请回答“对不起,我不知道”。
[上下文]:
{context}
[问题]:
{question}
"""
prompt = ChatPromptTemplate.from_messages([
('system',system),
('human','{question}')
])
# 3. G (Generation - 生成)
llm = ChatOpenAI(
model="deepseek-chat",
api_key=OPENAI_API_KEY,
base_url="https://api.deepseek.com"
)
# 4. 辅助函数:将检索到的Doc原始文档对象格式化为字符串,让llm能读懂
def format_docs(docs):
return "\n".join(doc.page_content for doc in docs)
# 5. 组装 RAG 链条(LCEL)
rag_chain = (
{"context":retrieve | format_docs,"question":RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
# --- 运行 RAG 链 ---
question = '模块05的目标是什么?'
response = rag_chain.invoke(question)
print(f'提问:{question}')
print(f'回答:{response}\n')
question = 'Langchain进阶篇讲了什么?'
response = rag_chain.invoke(question)
print(f'提问:{question}')
print(f'回答:{response}\n')
question = '今天天气怎么样?' # 知识库中没有
response = rag_chain.invoke(question)
print(f'提问:{question}')
print(f'回答:{response}\n')
# 清理临时文件
os.remove("knowledge_base.txt")