
构建新闻代理的实用指南:使用ollama Langchain Chromadb和huggingface Embeddings实现高效问答系统
对话式人工智能:使用 LangChain、ChromaDB 和 Hugging Face 构建检索系统
对话式人工智能是现代人工智能技术中最引人入胜的应用之一,它将大型语言模型(LLMs)与高效的向量存储结合在一起。
在本博客中,我们将引导您设置一个管道,该管道结合了 LangChain、ChromaDB 和 Hugging Face 嵌入,以构建一个使用网页抓取文档进行检索和回答问题的系统。
在深入代码之前,请确保您已安装必要的 Python 库。您可以使用以下命令安装它们:
pip install langchain chromadb beautifulsoup4 langchain-community
此外,如果您使用 Ollama
类进行 LLM 交互,请确保您有一个正在运行的 Ollama API 实例。
本地库安装
Ollama 在本地运行,并且已经下载了 2 个模型。我将使用“llama3:8b-instruct-q6_K”进行此实验,该模型托管在本地。
可用的 Ollama 模型
运行 ollama:
ollama run llama3:8b-instruct-q6\_K
运行 Ollama 服务以供使用
Part 2: The Coding
Code Overview
我们正在构建的管道执行以下关键步骤:
- 数据加载: 从目标网站抓取文章(在本例中为BBC新闻)。
- 文本拆分: 将长文本拆分为可管理的块以进行嵌入。
- 向量化: 为文档创建嵌入并将其存储在向量数据库中(ChromaDB)。
- 查询与检索: 使用对话链与用户互动并检索相关信息。
Step-by-Step Breakdown
-
设置 ChromaDB
首先,我们定义存储向量数据库的目录,并清理任何现有数据以重新开始:INDEX_PERSIST_DIRECTORY = os.getenv('INDEX_PERSIST_DIRECTORY', "./data/chromadb") client = Chroma(persist_directory=INDEX_PERSIST_DIRECTORY) collection = client.delete_collection()
-
使用
RecursiveUrlLoader
进行网页抓取
我们使用 LangChain 的RecursiveUrlLoader
从 BBC 网站抓取文章:documents = RecursiveUrlLoader( url="https://www.bbc.com/", max_depth=1, extractor=lambda x: Soup(x, "html.parser").find("article").text ).load()
-
拆分文本以提高嵌入效率
为了避免超出大型语言模型的上下文限制,我们将抓取的文档拆分成较小的块:text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=50) documents = text_splitter.split_documents(documents)
-
创建和存储嵌入
我们使用 Hugging Face 的all-MiniLM-L6-v2
模型为文档块生成嵌入,并将它们存储在 ChromaDB 中:embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2") vectordb = Chroma.from_documents( documents=documents, embedding=embeddings, persist_directory=INDEX_PERSIST_DIRECTORY ) vectordb.persist()
-
检索文档
为了验证存储的内容,我们执行相似性搜索以检索所有文档:all_documents = vectordb.similarity_search(query="", k=len(documents)) for idx, doc in enumerate(all_documents): print(f"Document {idx+1}:") print(doc.page_content[:400])
-
创建对话链
我们使用Ollama
大型语言模型构建一个对话链以回答用户查询:conversation = ConversationalRetrievalChain.from_llm( llm, retriever=vectordb.as_retriever(), return_source_documents=True, verbose=True )
-
回答用户查询
最后,我们将链集成到一个函数中以处理用户问题:def chat(question, user_id): response = conversation({"question": question, "chat_history": []}) return response['answer']
第三部分:关键见解和最终结果
管道展示了从数据摄取到回答用户查询的完整流程。它实现了以下目标:
- 网页抓取:自动从网站提取数据以构建知识库。
- 高效存储:使用 ChromaDB 高效存储和检索嵌入。
- 对话式人工智能:采用大型语言模型根据存储数据中的相关上下文回答查询。
示例交互
一旦系统运行,您可以这样查询它:
chat("What is the current situation in Lebanon?", "user123")
系统从BBC检索相关的文章,处理内容,并提供简洁的答案。
处理问题
结论
本博客概述了一种简单的方法,将网页抓取、向量数据库和大型语言模型结合起来,以构建对话代理。
所描述的管道可以适应各种应用,包括客户支持、知识管理和内容摘要。
局限性:这高度依赖于网站及其结构,因此需要根据需求探索不同的解析方法/库。
Repo: https://github.com/RahulPant1/LLMs/blob/main/Lanchain-CHroma-Example-1.ipynb