增加 chapter08 rag
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
oryx-build-commands.txt
|
||||
|
||||
.DS_Store
|
||||
chroma_db
|
||||
@@ -0,0 +1 @@
|
||||
3.12
|
||||
@@ -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)} 个文本块存入向量数据库")
|
||||
@@ -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)}")
|
||||
@@ -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"
|
||||
Reference in New Issue
Block a user