凉城老泉
手机扫码
五.LangChian实验笔记之调用deepseek实现读取网上博客生成本地向量数据,使用本地数据作答
凉城老泉  2025-02-28     阅读(79)   分享

过程:

1.在网上爬取博客文章,这里以本站这三篇博文为例:

http://www.xcbmz.cn/blog_detail?id=21(乡村便民信息站)

http://www.xcbmz.cn/blog_detail?id=24 (残疾人辅具适配系统)

http://www.xcbmz.cn/blog_detail?id=17(AI智能客服系统)

2.使用递归智能分割对文本进行分割

3.使用文新一言嵌入模型建立向量空间数据

4.构建提示语

5.创建对话链

5.创建检索器

6.创建历史子链

7.测试执行多轮会话


代码如下:


import bs4
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.chains.history_aware_retriever import create_history_aware_retriever
from langchain.chains.retrieval import create_retrieval_chain
from langchain_community.embeddings import QianfanEmbeddingsEndpoint
from langchain_community.vectorstores import Chroma
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.runnables import RunnableWithMessageHistory
from qifan_ai import CreateMyLLM
from langchain_community.document_loaders import WebBaseLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from lc_deepseek_ai import CreateChartDeepSeek



#pip install beautifulsoup4 lxml
loader=WebBaseLoader(["http://www.xcbmz.cn/blog_detail?id=21","http://www.xcbmz.cn/blog_detail?id=24","http://www.xcbmz.cn/blog_detail?id=17"]
                     ,bs_kwargs={"parse_only":bs4.SoupStrainer(class_="content")})

docs=loader.load()
#测试一下
#print(docs)
# txt=""
# for doc in docs:
#     txt+="信息来源("+doc.metadata["source"]+"):"+doc.page_content

doc_split=RecursiveCharacterTextSplitter(chunk_size=500,chunk_overlap=100)
s_doc=doc_split.split_documents(docs)
#测试文本分割
#res=doc_split.split_text(txt)
#print(res)
v=Chroma.from_documents(documents=s_doc,embedding=QianfanEmbeddingsEndpoint())
retriever=v.as_retriever()

prompt=ChatPromptTemplate.from_messages([
    ("system","你是一个问答助手,你用下面检索器retrieve检索相关的内容,然后用检索内容回答用户的问题,如里没有相关内容,你就说你不知道,如果知道请用简短的2句话回答,并每次都推荐可访问的产品访问地址如果没有则不推荐。\n  {context}"),
    MessagesPlaceholder(variable_name="history"),
    ("human","{input}"),
])
llm=CreateChartDeepSeek()
chain=create_stuff_documents_chain(llm,prompt)

#不包括历史
# chain1=create_retrieval_chain(retriever,chain)
# res=chain1.invoke({"input":"介绍一下乡村便民信息网站"})
# print(res["answer"])

#存储历史
store={}

def get_store(session_id):
    '''根据session_id获取历史'''
    if session_id not in store:
        store[session_id]=ChatMessageHistory()
    return store[session_id]

his_prompt=ChatPromptTemplate.from_messages(
    [("system","给我一个聊天记录以及最新的对话内容,把这些内容作为我们聊天的上下文内容,并生成一个可以被理解的独立问题,当没有聊天记录时不要回答,如里有需要的话只做转述即可。"),
     MessagesPlaceholder(variable_name="history"),
     ("human","{input}"),
]
)
#记录历史子链
history_chain=create_history_aware_retriever(llm,retriever,his_prompt)
chain1=create_retrieval_chain(history_chain,chain)

config={"configurable":{ "session_id":"mytest12322"}}
runnable=RunnableWithMessageHistory(chain1,get_store,history_messages_key="history",input_messages_key="input",output_messages_key="answer")

#第一轮对话测试
res=runnable.invoke({"input":"介绍一下乡村便民信息站"},config=config)
print(res["answer"])
#第二轮对话测试
res1=runnable.invoke({"input":"它是用来做什么的"},config=config)
print(res1["answer"])




注意:这里用到的嵌入模型是收费的,我们可以到huggingface官网(如里下载不了可以到hf-mirror.com 镜像网)下载开源模型到本地,然后使用本地模型就不用收费了,

本地的模型可以这样使用:


vectorstore = Chroma.from_documents(documents=splits, embedding=HuggingFaceEmbeddings(model_name='D:\model\embeding\bge-small-zh-v1.5'))