增加 chapter08 rag

This commit is contained in:
bbruceyuan
2025-10-03 19:08:24 +08:00
parent a834d7efd8
commit 6024ee5da2
7 changed files with 2818 additions and 0 deletions
+1
View File
@@ -1,3 +1,4 @@
oryx-build-commands.txt
.DS_Store
chroma_db
+1
View File
@@ -0,0 +1 @@
3.12
+1
View File
@@ -0,0 +1 @@
RAG 的的本质是:增强 System Prompt 的上下文,从而生成更符合实际要求的回复。
@@ -0,0 +1,28 @@
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_chroma import Chroma
# 1. 加载文档
loader = TextLoader("knowledge_base.txt")
documents = loader.load()
# 2. 文本切分
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # 每个文本块的大小
chunk_overlap=50, # 文本块之间的重叠部分
)
splits = text_splitter.split_documents(documents)
# 3. 向量化并存储
embeddings = OpenAIEmbeddings(
base_url="https://api.siliconflow.cn/v1",
model="Qwen/Qwen3-Embedding-0.6B",
)
vectorstore = Chroma.from_documents(
documents=splits,
embedding=embeddings,
persist_directory="./chroma_db", # 持久化存储路径
)
print(f"成功将 {len(splits)} 个文本块存入向量数据库")
+55
View File
@@ -0,0 +1,55 @@
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
# 1. 加载已有的向量数据库
embeddings = OpenAIEmbeddings(
base_url="https://api.siliconflow.cn/v1",
model="Qwen/Qwen3-Embedding-0.6B",
)
vectorstore = Chroma(persist_directory="./chroma_db", embedding_function=embeddings)
# 2. 用户提问
query = "什么是RAG"
# 3. 检索相关文档(返回最相关的 3 个)
docs = vectorstore.similarity_search(query, k=3)
# 4. 将检索到的文档内容拼接成上下文
context = "\n\n".join([doc.page_content for doc in docs])
# 5. 构建 Prompt 模板
prompt_template = """
你是一个专业的问答助手。请根据以下参考文档回答用户的问题。
如果参考文档中没有相关信息,请诚实地说不知道,不要编造答案。
参考文档:
{context}
用户问题:{question}
回答:
"""
prompt = PromptTemplate(
template=prompt_template,
input_variables=["context", "question"],
)
# 6. 创建 LLM 并生成回答
llm = ChatOpenAI(
model="THUDM/glm-4-9b-chat",
temperature=0,
max_retries=3,
base_url="https://api.siliconflow.cn/v1",
)
final_prompt = prompt.format(context=context, question=query)
print(f"最终的 Prompt 内容:{final_prompt}")
response = llm.predict(final_prompt)
# 7. 输出结果
print(f"问题: {query}")
print(f"回答: {response}")
print(f"\n参考文档数量: {len(docs)}")
+33
View File
@@ -0,0 +1,33 @@
[project]
name = "hands-on-large-language-models-cn"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
"langchain>=0.3.27",
"langchain-chroma>=0.2.6",
"langchain-community>=0.3.30",
"langchain-deepseek>=0.1.4",
"langchain-openai>=0.3.34",
"langgraph>=0.6.8",
]
[tool.ruff]
# 将行长限制设置为 88 个字符
line-length = 88
# 允许 Ruff 修复所有可修复的违规行为
fixable = ["ALL"]
[tool.ruff.lint]
# 选择要启用的规则集。 "E" 和 "F" 分别是 pycodestyle 和 Pyflakes 的规则。
select = ["E4", "E7", "E9", "F"]
[tool.ruff.format]
# 使用双引号
quote-style = "double"
# 使用空格进行缩进
indent-style = "space"
# 不跳过神奇的尾随逗号
skip-magic-trailing-comma = false
# 自动检测行尾
line-ending = "auto"
Generated
+2699
View File
File diff suppressed because it is too large Load Diff