我用这个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)
构建知识库
下面是构建一个简单文档问答系统的步骤:
首先加载文档:
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)
创建向量存储:
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
1# 创建向量数据库
2embeddings = OpenAIEmbeddings()
3vectorstore = Chroma.from_documents(texts, embeddings)
创建问答链:
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)
实用小贴士
文档处理 :使用不同的Loader可以处理PDF、Word、HTML等多种格式文档。
向量数据库选择 :除了Chroma,还可以使用FAISS、Pinecone等,根据数据规模选择合适的方案。
性能优化 :
适当调整chunk_size可以影响检索效果
使用缓存避免重复计算
批量处理可以提高效率
提示词优化 :好的提示词模板能够显著提升回答质量。
常见应用场景
企业知识库问答
文档智能客服
个性化学习助手
代码分析工具
数据分析助手
注意事项
确保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], “...”)
小贴士
文档预处理 :
清理文本中的特殊字符
去除冗余信息
标准化格式
性能优化 :
使用异步API提高并发
实现文档缓存
定期更新向量库
用户体验 :
添加打字机效果
设置超时处理
添加进度反馈
实用功能扩展示例
一个带有文件上传和问答功能的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=False) as 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更进阶的一些用法啦!通过这些功能,我们可以打造功能更强大的知识库应用。建议大家先从基础案例开始,逐步添加新功能。记得多看官方文档,里面有更多有趣的组件等待你去探索!有问题随时问我,祝大家编码愉快!