微信扫码
与创始人交个朋友
我要投稿
近年来,大型语言模型(LLMs)在各类任务中的应用如雨后春笋般涌现。然而,如何让这些模型准确地模仿个人的写作风格仍是一个挑战。在本文中,我们将通过LangChain的工具链,向大家展示如何构建一个能模仿你写作风格的LLM。你将学习如何提取、处理文档,生成嵌入,以及创建一个高效的检索生成(RAG)管道,进而让AI更好地帮助你完成写作。
Documents
对象加载原始文本,并将其分块以适配LLM的上下文窗口。这一步确保模型能有效处理大量内容,同时剔除冗余信息,提取关键文字。通过以上步骤,模型能够将作者的写作特点内化并体现在生成的内容中,使AI成为真正意义上的“写作助手”。
LangChain是一款功能强大的RAG库,它支持Python和JavaScript。RAG技术通过结合外部文档增强LLM的生成能力,无需对模型进行繁琐的微调,是解决生成不可靠文本的利器。
虽然很多时候提示词已经够用,但结合RAG可以进一步增强模型的生成能力,特别是当需要生成更高质量和个性化内容时。探索LangChain的初衷正是希望用LLM辅助写作,通过增强上下文信息来获得更优质的生成效果。
LangChain的Documents
对象让加载文本数据变得简单。这些文档可以轻松拆分后加入到生成链中。
首先,准备好你需要的文档(如博客文章)。以下代码展示了如何将存储在目录中的HTML文档加载到LangChain的Documents
对象中:
from os import listdir
from os.path import isfile, join
mypath = 'project_directory'
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]
onlyfiles = [x for x in onlyfiles if 'htm' in x]
接着,使用LangChain的HTML解析器将这些文件转换为可用的文档:
from langchain_community.document_loaders import UnstructuredHTMLLoader
data = {}
for i, file in enumerate(onlyfiles):
loader = UnstructuredHTMLLoader(file)
data[i] = loader.load()
每个文档包括内容(page_content
)和元数据(如标题)。由于LLM的上下文窗口有限(例如ChatGPT-3.5的窗口大小为4096个tokens),需要对文档进行分块以提高处理效率。
from langchain.text_splitter import TokenTextSplitter
text_splitter = TokenTextSplitter(chunk_size=1000, chunk_overlap=25)
texts = {data[i][0].metadata['source']: text_splitter.split_documents(data[i]) for i in range(len(data))}
嵌入(Embeddings)是将文本转换为向量的一种方式,是RAG管道的核心。在这里,我们使用OpenAI的嵌入模型,并将向量存储在本地的ChromaDB中。
from langchain_community.vectorstores import Chroma
from langchain_openai.embeddings import OpenAIEmbeddings
for i, key in enumerate(texts.keys()):
vectordb = Chroma.from_documents(
texts[key],
embedding=OpenAIEmbeddings(api_key='your_open_ai_key'),
persist_directory='./LLM_train_embedding/Doc'
)
vectordb.persist()
为了让LLM能够基于上下文生成内容,我们需要一个高效的检索机制。以下代码展示了如何使用ChromaDB的检索功能:
retriever = vectordb.as_retriever(search_type='mmr', search_kwargs={'k': 1})
retriever.get_relevant_documents('What is a Sankey?')
此外,我们还可以实现父文档检索,通过将大文档拆分为父子文档,提高检索的精确度:
from langchain.retrievers import ParentDocumentRetriever
from langchain.storage import InMemoryStore
from langchain.text_splitter import TokenTextSplitter
child_splitter = TokenTextSplitter(chunk_size=250, chunk_overlap=10)
parent_splitter = TokenTextSplitter(chunk_size=1000, chunk_overlap=50)
vectorstore = Chroma(
collection_name="full_documents",
embedding_function=OpenAIEmbeddings(api_key='your_api_key')
)
store = InMemoryStore()
retriever = ParentDocumentRetriever(
vectorstore=vectorstore,
docstore=store,
child_splitter=child_splitter,
parent_splitter=parent_splitter
)
for i inrange(len(data)):
retriever.add_documents(data[i])
retriever.get_relevant_documents('What is a Sankey?')
最后,我们利用检索到的文档作为上下文,让LLM生成模仿你写作风格的文本。以下是一个使用LangChain RetrievalQA
链的实现示例:
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
template = """Mimic the writing style in the context:
{context} and produce a blog on the topic
Topic: {topic}
"""
prompt = ChatPromptTemplate.from_template(template)
model = ChatOpenAI(api_key='your_api_key')
chain = (
{
"context": retriever,
"topic": lambda x: x["topic"]
}
| prompt
| model
| StrOutputParser()
)
output = chain.invoke({"topic": "Pakistan"})
print(output)
通过以上步骤,你已经掌握了如何使用LangChain构建一个模仿你写作风格的LLM。从文档提取、嵌入生成,到检索与内容生成,每一步都至关重要。
结合RAG技术,LLM不仅能生成高质量内容,还能精准模仿你的写作风格,为你的创作带来更多可能性。
如果您想要让大模型写出优质的短篇小说,以及对其他内容感兴趣,也欢迎点击下面的链接,效果不错哦。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-12-18
一站式 LLM 工程观测平台:Langfuse,让所有操作可观测
2024-12-17
LLMs开发者必看!Pydantic AI代理框架震撼登场!
2024-12-16
用LangChain实现一个Agent
2024-12-16
通过阿里云 Milvus 和 LangChain 快速构建 LLM 问答系统
2024-12-16
大模型部署调用(vLLM+LangChain)
2024-12-14
利用 LangGraph 和代理优化工作流程效率:关键功能、用例和集成...
2024-12-09
深度丨LangChain团队基于Agents用户体验设计的研究
2024-12-03
带LangGraph的多智能体工作流
2024-04-08
2024-08-18
2024-06-03
2024-10-10
2024-04-08
2024-04-17
2024-06-24
2024-07-13
2024-04-11
2024-04-12
2024-12-02
2024-11-25
2024-10-30
2024-10-11
2024-08-18
2024-08-16
2024-08-04
2024-07-29