过程:
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'))
)