那索引在哪体现?
# 加载txt文档
from langchain_community.document_loaders import TextLoader
Loader = TextLoader ("./resource/meituan-questions.txt")
documents = loader.load()
# 如果你的知识库文件比较多,可以尝试使用DirectoryLoader,它会递归的加载文件夹中的所有文件。
from langchain_community document_loaders import DirectoryLoader
# DirectoryLoader(目录,加载的文件,加载器类型,是否显示进度)
directLoader = DirectoryLoader("./resource/", glob="**/*.txt", Loader_cls=TextLoader, show_progress=True)
directLoader.load()
from langchain_text_splitters import CharacterTextSplitter
# 切分文档,针对txt类型进行拆分CharacterTextSplitter
text_splitter = CharacterTextSplitter (chunk_size=500, chunk_overlap=0 , separator="\n\n", keep_separator=True)
segments = text_splitter.split_documents(documents)
print (len(segments))
for segment in segments:
print (segment.page_content)
print("-------")
# 不使用拆分工具,自行拆分文档
import re
# 自行切分文档
texts = re.split(p"\n\n", documents[0] page_content)
segments = text_splitter.split_text(documents[0].page_content)
#将文档片段转换成为documents
segment_documents = text_splitter.create_documents(texts)
# 这样得到的就是31个精确的问答
print(len(segment_documents))
for segment in segment_documents:
print(segment.page_content)
print ("--------")
import os
from langchain_community.embeddings import DashScopeEmbeddings
from config.load_key import load_key
#构建向量化模型
if not os.environ.get("DASHSCOPE_API_KEY"):
os. environ[ "DASHSCOPE_API_KEY"] = load_key("BAILIAN_API_KEY")
embedding_model = DashScopeEmbeddings(model="text-embedding-v1")
#使用Redis构建向量数据库
redis_url = "redis://localhost:6379"
from langchain_redis import RedisConfig, RedisVectorStore
config = RedisConfig(
index_name="meituan-index",
redis_url=redis_url
)
vector_store = RedisVectorStore(embedding_model, config=config)
#文档保存到向量数据库中
vector_store.add_documents(segment_documents)
检索阶段:
query="在线支付取消订单后钱怎么返还"
from langchain_community.embeddings import DashScopeEmbeddings
from config.load_key import load_key
if not os.environ.get("DASHSCOPE_API_KEY"):
os.environ[ "DASHSCOPE_API_KEY"] =load_key("BAILIAN_API_KEY")
embedding_model = DashScopeEmbeddings(model="text-embedding-v1")
from langchain_redis import RedisConfig, RedisVectorStore
redis_url = "redis://localhost:6379"
config = RedisConfig(
index_name="meituan-index",
redis_url=redis_url
)
vector_store = RedisVectorStore(embedding_model, config=config)
retriever = vector_store.as_retriever()
# 设置top_k为5
relative_segments = retriever.invoke(query, k=5)
relative_segments
from langchain_core.prompts import ChatPromptTemplate
prompt_template= ChatPromptTemplate.from_messages([
(
"user",
"""你是一个答疑机器人,你的任务是根据下述给定的已知信息回答用户的问题。
已知信息:{context}
用户问题:{question}
如果已知信息不包含用户问题的答案,或者已知信息不足以回答用户的问题,请直接回复“我无法回答您的问题”请不要输出已知信息中不包含的信息或答案。
请用中文回答用户问题。"""
)
])
text = []
for segment in relative_segments:
text.append(segment.page_content)
prompt = prompt_template.invoke({
"context": text,
"question": query
})
prompt.to_messages()[0].content
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="deepseek-v3"
base_url "https://dashscope_aliyunes_com/compatible-mode/v1",
openai_api_key=load_key("BAILIAN_API_KEY"),
)
response = llm.invoke(prompt)
print(response.content)
一个完整的rag demo
from langchain_core.output_parsers import StrOutputParser
query="在线支付取消订单后钱怎么返还"
from langchain_community.embeddings import DashScopeEmbeddings
from config.load_key import load_key
if not os.environ.get("DASHSCOPE_API_KEY"):
os.environ[ "DASHSCOPE_API_KEY"] =load_key("BAILIAN_API_KEY")
embedding_model = DashScopeEmbeddings(model="text-embedding-v1")
from langchain_redis import RedisConfig, RedisVectorStore
redis_url = "redis://localhost:6379"
config = RedisConfig(
index_name="meituan-index",
redis_url=redis_url
)
# 定义向量数据库
vector_store = RedisVectorStore(embedding_model, config=config)
retriever = vector_store.as_retriever()
# 定义大模型
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="deepseek-v3"
base_url "https://dashscope_aliyunes_com/compatible-mode/v1",
openai_api_key=load_key("BAILIAN_API_KEY"),
)
# 定义提示词模版
from langchain_core.prompts import ChatPromptTemplate
prompt_template= ChatPromptTemplate.from_messages([
(
"user",
"""你是一个答疑机器人,你的任务是根据下述给定的已知信息回答用户的问题。
已知信息:{context}
用户问题:{question}
如果已知信息不包含用户问题的答案,或者已知信息不足以回答用户的问题,请直接回复“我无法回答您的问题”请不要输出已知信息中不包含的信息或答案。
请用中文回答用户问题。"""
)
])
# 收集document的内容
def collect_documents(segments):
text = []
for segment in segments:
text.append(segment.page_content)
return text
# retriever. invoke(query,k=5)
from operator import itemgetter
chain = ({
"context": itemgetter ("question") | retriever | collect_documents,
"question": itemgetter ("question")
}
| prompt_template
| llm
| StrOutputParser()
)
response = chain.invoke({"question": query})
response