现在大模型支持的上下文也就百万 token ( Llama-3-8B-Instruct-Gradient-1048k 、glm-4-9b-chat-1m 、internlm2_5-7b-chat-1m )到 4 百万 token(Llama-3-8B-Instruct-Gradient-4194k),想在对话里塞进中小型项目可能够用,如果不够用那只能用 RAG 或者 GraphRAG 的形式。
付一个简单的 RAG 例子,不到 20 行就可以和代码仓库对话
```python
from llama_index.core import SimpleDirectoryReader
from llama_index.embeddings.ollama import OllamaEmbedding
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.llms.ollama import Ollama
ollama_embedding = OllamaEmbedding(
model_name="mxbai-embed-large:latest",
base_url="http://10.6.6.240:11435",
)
llm = Ollama(model="deepseek-coder-v2:16b-lite-instruct-fp16", request_timeout=240.0, base_url='http://10.6.6.18:9090',
context_window=32000,
system_prompt="你是一个专业的架构师,接下来的问题请以架构师的角度回答,如果涉及到代码输出,则代码要充分利用异步非阻塞特性,注释丰富,多打印日志,容错性好,对外部输入进行充分校验。")
Settings.llm = llm
Settings.embed_model = ollama_embedding
documents = SimpleDirectoryReader(input_dir="代码目录", recursive=True, required_exts=['.扩展名']).load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine()
response = query_engine.query(
"这个项目都有什么功能?")
print(response)
```
RAG 说白了就是在你问的问题之前,用相似搜索来把 [和问题关键字近似的代码片段] 追加到你问题后面,在提示词里 [加几句话让模型参考追加的内容] ,前置步骤切分代码片段创建向量这个步骤容易切碎导致丢失代码。更有碰到宏观问题就歇逼的现象,比如上面例子的“这个项目”,近似搜索压根不知道你指的是哪些代码。
GraphRAG (
https://github.com/microsoft/graphrag )和
https://docs.llamaindex.ai/en/stable/examples/index_structs/knowledge_graph/Neo4jKGIndexDemo/ 又进了一步,用知识图谱的方式来找代码追加到上下文,在应对相对宏观的问题上有优势。比如“这个项目都有什么功能?”这种问题,对于“这些代码”可能给你找全一点,比如“下单流程有哪些步骤”可能把什么优惠券、会员积分、秒杀啥的都找出来,而不是仅仅搜索 order 相关的代码。