【AI】Langchain框架学习09

那索引在哪体现?

  • 加载文档
# 加载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)

检索阶段:

  • 在redis中检索相关条目
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
  • prompt构建
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
posted @ 2026-07-28 22:19  leah-xx  阅读(8)  评论(0)    收藏  举报