我用这个Python库一天构建了个知识库!(LangChain)

文摘   2024-11-25 11:31   辽宁  

我用这个Python库一天构建了个知识库!(LangChain)

 1今天要跟大家分享一个超级实用的Python库 - LangChain。用它可以轻松搭建自己的知识库和问答系统,让AI理解并处理你的专属数据。我用它只花了一天时间就搭建好了一个不错的知识库,一起来看看吧!
2
3## LangChain是什么?
4
5LangChain是一个强大的框架,它让我们能够方便地开发基于大语言模型(LLM)的应用。它的两大核心能力是:
6- 数据感知:让语言模型能够连接和处理各种数据源
7- 代理能力:允许语言模型与环境交互
8
9简单说,它就像是一个“粘合剂”,帮助我们把大语言模型和各种数据、工具组合在一起。
10
11## 快速开始
12
13首先需要安装LangChain:
14
15```python
16pip install langchain
17pip install openai  # 如果使用OpenAI的模型

一个简单的问答示例:

 1from langchain.llms import OpenAI
2from langchain import PromptTemplate, LLMChain
3
4# 初始化语言模型
5llm = OpenAI(api_key=“your-api-key”)
6
7# 创建提示模板
8template = “”“Question: {question}
9Answer:Let's think about this step by step:”“”
10
11prompt = PromptTemplate(template=template, input_variables=[“question”])
12
13# 创建链
14chain = LLMChain(llm=llm, prompt=prompt)
15
16# 获取答案
17question = “什么是Python?”
18response = chain.run(question)
19print(response)

构建知识库

下面是构建一个简单文档问答系统的步骤:

  1. 首先加载文档:

from langchain.document_loaders import TextLoader
   from langchain.text_splitter import CharacterTextSplitter

1# 加载文档
2loader = TextLoader(“docs/sample.txt”)
3documents = loader.load()
4
5# 分割文档
6text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
7texts = text_splitter.split_documents(documents)
  1. 创建向量存储:

from langchain.embeddings import OpenAIEmbeddings
   from langchain.vectorstores import Chroma

1# 创建向量数据库
2embeddings = OpenAIEmbeddings()
3vectorstore = Chroma.from_documents(texts, embeddings)
  1. 创建问答链:

from langchain.chains import RetrievalQA

 1# 创建问答链
2qa_chain = RetrievalQA.from_chain_type(
3    llm=llm,
4    chain_type=“stuff”,
5    retriever=vectorstore.as_retriever()
6)
7
8# 提问
9query = “文档中讨论了什么主题?”
10response = qa_chain.run(query)
11print(response)

实用小贴士

  1. 文档处理 :使用不同的Loader可以处理PDF、Word、HTML等多种格式文档。

  2. 向量数据库选择 :除了Chroma,还可以使用FAISS、Pinecone等,根据数据规模选择合适的方案。

  3. 性能优化

  • 适当调整chunk_size可以影响检索效果

    • 使用缓存避免重复计算

    • 批量处理可以提高效率

  1. 提示词优化 :好的提示词模板能够显著提升回答质量。

常见应用场景

  • 企业知识库问答

  • 文档智能客服

  • 个性化学习助手

  • 代码分析工具

  • 数据分析助手

注意事项

  • 确保API密钥安全保存

  • 注意文档分片的大小设置

  • 关注token使用量

  • 做好异常处理

  • 重要场景建议加入人工审核机制

小伙伴们,今天的Python学习之旅就到这里啦!LangChain真的是个超级强大的工具,建议大家动手实践起来。遇到问题随时在评论区问我哦,让我们一起探索AI的无限可能!祝大家学习愉快,Python之路节节高!

Python学习 #LangChain #AI开发# 进阶功能与实战案例

 1接着上一节内容,我们来深入了解LangChain的一些进阶用法,并通过实战案例来掌握它的精髓。
2
3## 自定义知识库检索
4
5有时我们需要自定义检索逻辑,这时可以使用自定义检索器:
6
7```python
8from langchain.retrievers import MultiQueryRetriever
9
10# 创建自定义检索器
11retriever = MultiQueryRetriever.from_llm(
12    retriever=vectorstore.as_retriever(),
13    llm=llm
14)
15
16# 使用检索器搜索
17docs = retriever.get_relevant_documents(“查询问题”)

记忆功能

为了让AI助手能够记住对话上下文,我们可以添加记忆功能:

 1from langchain.memory import ConversationBufferMemory
2from langchain.chains import ConversationChain
3
4# 创建带记忆的对话链
5memory = ConversationBufferMemory()
6conversation = ConversationChain(
7    llm=llm, 
8    memory=memory,
9    verbose=True
10)
11
12# 进行对话
13response1 = conversation.predict(input=“我的名字是小明”)
14response2 = conversation.predict(input=“我叫什么名字?”)
15print(response2)  # AI会记得你叫小明

知识库权重优化

对不同文档源设置不同的权重:

 1from langchain.retrievers import MultiVectorRetriever
2from langchain.storage import InMemoryStore
3
4# 创建存储
5store = InMemoryStore()
6retriever = MultiVectorRetriever(
7    vectorstore=vectorstore,
8    docstore=store,
9    id_key=“doc_id”
10)
11
12# 设置权重
13docs_with_scores = retriever.get_relevant_documents_with_scores(“查询”)
14weighted_docs = [(doc, score * 1.5) for doc, score in docs_with_scores]

实战案例:构建企业文档助手

下面是一个完整的企业文档智能助手示例:

 1from langchain.document_loaders import DirectoryLoader
2from langchain.embeddings import OpenAIEmbeddings
3from langchain.vectorstores import FAISS
4from langchain.chains import ConversationalRetrievalChain
5from langchain.memory import ConversationBufferMemory
6
7class DocAssistant
8    def __init__(self, docs_dir, model_name=“gpt-3.5-turbo”):
9        # 加载文档
10        loader = DirectoryLoader(docs_dir, glob=“**/*.txt”)
11        documents = loader.load()
12
13        # 文档分割
14        splitter = CharacterTextSplitter(
15            chunk_size=1000,
16            chunk_overlap=200
17        )
18        docs = splitter.split_documents(documents)
19
20        # 创建向量存储
21        embeddings = OpenAIEmbeddings()
22        self.vectorstore = FAISS.from_documents(docs, embeddings)
23
24        # 初始化对话链
25        memory = ConversationBufferMemory(
26            memory_key=“chat_history”,
27            return_messages=True
28        )
29
30        self.qa_chain = ConversationalRetrievalChain.from_llm(
31            llm=OpenAI(model_name=model_name),
32            retriever=self.vectorstore.as_retriever(),
33            memory=memory
34        )
35
36    def ask(self, question):
37        “”“提问接口”“”
38        try
39            response = self.qa_chain(
{“question”:question})
40            return response['answer']
41        except Exception as e:
42            return f“抱歉,出现了错误: {str(e)}”
43
44    def search_docs(self, query, k=3):
45        “”“搜索相关文档”“”
46        docs = self.vectorstore.similarity_search(query, k=k)
47        return [doc.page_content for doc in docs]
48
49# 使用示例
50assistant = DocAssistant(“company_docs/”)
51response = assistant.ask(“公司的休假制度是什么?”)
52print(response)
53
54# 搜索相关文档
55docs = assistant.search_docs(“年终奖”)
56for doc in docs:
57    print(“相关文档:”, doc[:100], “...”)

小贴士

  1. 文档预处理

  • 清理文本中的特殊字符

  • 去除冗余信息

  • 标准化格式

  1. 性能优化

  • 使用异步API提高并发

  • 实现文档缓存

  • 定期更新向量库

  1. 用户体验

  • 添加打字机效果

  • 设置超时处理

  • 添加进度反馈

实用功能扩展示例

一个带有文件上传和问答功能的Web应用:

 1import streamlit as st
2from langchain.document_loaders import PyPDFLoader
3import tempfile
4
5def save_uploaded_file(uploaded_file):
6    with tempfile.NamedTemporaryFile(delete=Falseas tmp_file:
7        tmp_file.write(uploaded_file.getvalue())
8        return tmp_file.name
9
10def main():
11    st.title(“文档智能助手”)
12
13    # 文件上传
14    uploaded_file = st.file_uploader(“上传PDF文档”, type=“pdf”)
15
16    if uploaded_file:
17        with st.spinner(“处理文档中...”):
18            # 保存文件
19            file_path = save_uploaded_file(uploaded_file)
20
21            # 加载文档
22            loader = PyPDFLoader(file_path)
23            documents = loader.load()
24
25            # 创建问答链
26            qa_chain = setup_qa_chain(documents)  # 之前定义的函数
27
28            # 问答界面
29            question = st.text_input(“请输入您的问题:”)
30            if question:
31                with st.spinner(“思考中...”):
32                    response = qa_chain.run(question)
33                    st.write(response)
34
35if __name__ == “__main__”:
36    main()

小伙伴们,这就是LangChain更进阶的一些用法啦!通过这些功能,我们可以打造功能更强大的知识库应用。建议大家先从基础案例开始,逐步添加新功能。记得多看官方文档,里面有更多有趣的组件等待你去探索!有问题随时问我,祝大家编码愉快!

Python进阶 #LangChain进阶 #AI开发实战‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌


楼市前景
浅析买房政策、楼市解读,分享买房技巧
 最新文章